Database design 图形数据库中的查找/引用表

Database design 图形数据库中的查找/引用表,database-design,graph,neo4j,lookup-tables,Database Design,Graph,Neo4j,Lookup Tables,我们如何在图形数据库中建模/表示查找/引用表? 一种特殊情况:主转换表(包含许多核心表的查找数据)。 我们应该将它们合并到核心表中吗? 您可以仅使用节点对此进行建模。比如: CREATE (:Translation{code:'SLD', description:'some lengthy description'}) CREATE (:Translation{code:'NY', description:'New York'}) CREATE (:Translation{code:'USA',

我们如何在图形数据库中建模/表示查找/引用表?
一种特殊情况:主转换表(包含许多核心表的查找数据)。
我们应该将它们合并到核心表中吗?

您可以仅使用节点对此进行建模。比如:

CREATE (:Translation{code:'SLD', description:'some lengthy description'})
CREATE (:Translation{code:'NY', description:'New York'})
CREATE (:Translation{code:'USA', description:'United States'})
CREATE (:Address{address:'123 Street St', state:'NY', country:'USA'})
MATCH (p:Person)-[:LIVES_AT]->(a:Address)
WHERE id(p) = 101
OPTIONAL MATCH (state:Translation{code:a.state})
OPTIONAL MATCH (country:Translation{code:a.country})
RETURN a.address as address, state.description as state, country.description as country
对于使用,可能类似于:

CREATE (:Translation{code:'SLD', description:'some lengthy description'})
CREATE (:Translation{code:'NY', description:'New York'})
CREATE (:Translation{code:'USA', description:'United States'})
CREATE (:Address{address:'123 Street St', state:'NY', country:'USA'})
MATCH (p:Person)-[:LIVES_AT]->(a:Address)
WHERE id(p) = 101
OPTIONAL MATCH (state:Translation{code:a.state})
OPTIONAL MATCH (country:Translation{code:a.country})
RETURN a.address as address, state.description as state, country.description as country
也就是说,我认为图形数据库使得对这些的需求有些过时。在我看来,使用它们的原因是为了节省空间,因为相同的值被重复使用,所以在RDBMS中,只在一个地方保留较长的描述是有意义的

对于图,这似乎建议您将值提取到它自己的节点,并创建与它的关系,如下所示:

CREATE (ny:State{code:'NY', name:'New York'})
CREATE (usa:Country{code:'USA', name:'United States})
CREATE (a:Address{address:'123 Street St'})
CREATE (a)-[:IN_STATE]->(ny)    // or a more generic :IN if desired
CREATE (a)-[:IN_COUNTRY]->(usa) // or a more generic :IN if desired
然后,查询将变成:

MATCH (p:Person)-[:LIVES_AT]->(a:Address)
OPTIONAL MATCH (a)-[:IN_STATE]->(state)
OPTIONAL MATCH (a)-[:IN_COUNTRY]->(country)
RETURN a.address as address, state.name as state, country.name as country
你会注意到这看起来非常相似。长长的国家名称仍然只存储在一个地方。真正的区别在于上下文,既用于处理具有特定标签的节点,也用于处理可能具有更特定属性键的节点,以及将与这些节点的关系作为数据模型的一部分,而不必知道或猜测可以在不同的节点中查找某些属性字段(例如,请尝试
CALL db.schema)()
在浏览器中)


如果您在:State(code)和:Country(code)上添加索引,则还可以更轻松地按代码查找地址.

您能给出一个更具体的例子吗?请记住,图形数据库中没有表的概念。我在文章中添加了当前RDBMS表示的图像。
解决方案之一是为每个节点创建另一个属性,该属性将包含代码的翻译(:“Core tab 2”({col2:'NY',col2_描述:'newyork'})
另一种解决方案是将代码的描述保存在单独的表中,并在每次需要时使用一些函数进行翻译。谢谢!这很有意义,尤其是在您的示例中。注意:创建单独的节点还允许存储代码/描述,即使在“核心”时记录没有这样的值(适用于RDBMS和图形数据库)。