【问题标题】:Developing graph database model for department/supplier/items为部门/供应商/项目开发图形数据库模型
【发布时间】:2021-05-24 00:41:54
【问题描述】:

我目前正在增加图形数据库,为此我正在通过一系列问题来学习 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}]-&gt;(:Dept),但问题只是转移到将:SUPPLIES 关系属性与:Item 节点匹配。

我正在构建的查询类型具有以下性质:查找销售他们提供的所有物品的部门。

还有其他一些我忽略的建模方法吗?还是这种关系,供应商与两个事物相关,一个项目和一个部门,只是与图模型不太吻合?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    您要存储和查询: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
    

    【讨论】:

      猜你喜欢
      • 2016-12-26
      • 2011-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-04
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多