neo4j - 为部门/供应商/项目开发图形数据库模型
问题描述
我目前正在加强图形数据库,为此我正在通过一系列问题来学习 Cypher。但是,我对我选择的设计并不是 100% 满意,因为我必须将关系与节点匹配才能使某些查询正常工作。
我发现Neo4j: Suggestions for ways to model a graph with shared nodes but has a unique path based on some property with some questions that are relevant,但它们涉及复制节点(重复它们),而实际上它们确实代表相同的东西。这似乎是一个等待发生的更新问题。
我的设计目前有
(: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
推荐阅读
- java - 如何在 XML 和 Java 配置的 Spring Web 应用程序的 WebApplicationContext 中加载额外的 bean 和配置文件?
- python - Python中的二维数值积分
- r - 默认 S4 方法的成语?
- swift - 最后一个 UICollectionViewCell 看起来与其他的不同
- r - 是否有 R 函数或 SQL 解决方案用于将所有相同的数字重复分组并将它们分配给所有行?
- spring - MapStruct:从对象映射到复杂对象列表
- amazon-web-services - 如何修复 aws-cli cloudfront 更新分发命令?
- geojson - How to specify a geojson geometry crs for "internals" vector data?
- sas - 如何在数据步骤中获取数据集标签?
- angular - Angular schematics Tree: how to exclude?