为 department/supplier/items 开发图形数据库模型
Developing graph database model for department/supplier/items
我目前正在加强图形数据库,为此我正在通过一系列问题来学习 Cypher。但是,我对我选择的设计不是 100% 满意,因为我必须将关系与节点匹配才能使某些查询工作。
我发现 Neo4j: Suggestions for ways to model a graph with shared nodes but has a unique path based on some property 有一些相关的建议,但它们涉及复制节点(重复它们),而实际上它们确实代表相同的事物。这似乎是一个等待发生的更新问题。
我的设计目前有
(:Dept {name,floor})-[:SOLD {quantity}]->(:Item {name,type})<-[:SUPPLIES {dept,volume)]-(:Company {name,address})
如您所见,要弄清楚公司向哪个部门供应了物品,我必须检查 :SUPPLIES
dept
属性。这会导致有些尴尬的查询 - 反正我是这么觉得的。
我已经尝试过其他关系,比如 (:Company)-[:SUPPLIES {item,vol}]->(:Dept)
,但问题只是转移到 :SUPPLIES
关系属性与 :Item
节点的匹配。
我正在构建的查询类型属于以下性质:查找销售所有供应项目的部门。
有没有其他方法可以对我忽略的这个进行建模?还是这种关系,其中一个供应商与两个事物相关,一个项目和一个部门,只是不太适合图模型的事物?
您想存储和查询 :Dept
、:Item
和 :Company
之间的三角关系。这不能通过线性关系模式来完成。比较实体的 ID 不是 Neo4j 的方式,你会忽略图数据库的优势。
(假设我了解您的用例场景)我将介绍一个类型为 :SupplyEvent
的附加节点,它与 :Dept
、:Item
和 :Company
有关系.如果您想要部门、项目和客户之间的关系,您也可以以类似的方式拆分 :SOLD
关系。
现在,您可以查询向哪些部门提供哪些项目的所有公司(无需比较任何 ID):
MATCH (company:Company)<-[:SUPPLIED_FROM]-(se:SupplyEvent)-[:SUPPLIED_TO]->(dept:Dept),
(se)-[:SUPPLIED]->(item:Item)
RETURN company, item, dept
我目前正在加强图形数据库,为此我正在通过一系列问题来学习 Cypher。但是,我对我选择的设计不是 100% 满意,因为我必须将关系与节点匹配才能使某些查询工作。
我发现 Neo4j: Suggestions for ways to model a graph with shared nodes but has a unique path based on some property 有一些相关的建议,但它们涉及复制节点(重复它们),而实际上它们确实代表相同的事物。这似乎是一个等待发生的更新问题。
我的设计目前有
(:Dept {name,floor})-[:SOLD {quantity}]->(:Item {name,type})<-[:SUPPLIES {dept,volume)]-(:Company {name,address})
如您所见,要弄清楚公司向哪个部门供应了物品,我必须检查 :SUPPLIES
dept
属性。这会导致有些尴尬的查询 - 反正我是这么觉得的。
我已经尝试过其他关系,比如 (:Company)-[:SUPPLIES {item,vol}]->(:Dept)
,但问题只是转移到 :SUPPLIES
关系属性与 :Item
节点的匹配。
我正在构建的查询类型属于以下性质:查找销售所有供应项目的部门。
有没有其他方法可以对我忽略的这个进行建模?还是这种关系,其中一个供应商与两个事物相关,一个项目和一个部门,只是不太适合图模型的事物?
您想存储和查询 :Dept
、:Item
和 :Company
之间的三角关系。这不能通过线性关系模式来完成。比较实体的 ID 不是 Neo4j 的方式,你会忽略图数据库的优势。
(假设我了解您的用例场景)我将介绍一个类型为 :SupplyEvent
的附加节点,它与 :Dept
、:Item
和 :Company
有关系.如果您想要部门、项目和客户之间的关系,您也可以以类似的方式拆分 :SOLD
关系。
现在,您可以查询向哪些部门提供哪些项目的所有公司(无需比较任何 ID):
MATCH (company:Company)<-[:SUPPLIED_FROM]-(se:SupplyEvent)-[:SUPPLIED_TO]->(dept:Dept),
(se)-[:SUPPLIED]->(item:Item)
RETURN company, item, dept