微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为部门/供应商/项目开发图形数据库模型

如何解决为部门/供应商/项目开发图形数据库模型

我目前正在研究图形数据库,为此我正在解决一系列问题以学习 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 关系。

enter image description here

现在,您可以查询向哪些部门提供哪些物品的所有公司(无需比较任何 ID):

MATCH (company:Company)<-[:SUPPLIED_FROM]-(se:SupplyEvent)-[:SUPPLIED_TO]->(dept:Dept),(se)-[:SUPPLIED]->(item:Item)
RETURN company,item,dept

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。