[英]Best approach for graph nodes relationship in Neo4J (Cypher)
我试图在我的 Neo4J 图形数据库中实现以下数据结构:
(User)-[:isEmployedBy]->(Company)
而每个“雇佣”可以有多个“交易”
我正在考虑以下选项,并想知道哪个是最“未来的证明”:
最简单的:
create
(matt:Person { name: 'Matt' } ),
(stackoverflow:Company { name: 'Stackoverflow' }),
(matt)-[:employed_by { from: date("2000-01-01"), until: date("2010-01-01") }]->(stackoverflow),
return *
但是,我无法在我的工作中添加其他关系(例如交易)。 我认为我的第二种方法是我唯一的选择? 这个对吗? (见下文)
create
(matt:Person { name: 'Matt' } ),
(stackoverflow:Company { name: 'Stackoverflow' }),
(employment:Employment, { from: date("2000-01-01"), until: date("2010-01-01")}),
(t1:Payment, { amount: 100 }),
(t2:Payment, { amount: 50 }),
(employment)-[:received]->(t1)
(employment)-[:received]->(t2)
return *
我知道我可以将这些交易直接附加到该人,但我需要将它们与工作直接相关联,例如:如果该人失去工作(连接),所有交易都需要消失。
3)我也可以做这两个连接:
create
(matt:Person { name: 'Matt' } ),
(stackoverflow:Company { name: 'Stackoverflow' }),
(employment:Employment, { from: date("2000-01-01"), until: date("2010-01-01")}),
(matt)-[:employed_by { from: date("2000-01-01"), until: date("2010-01-01") }]->(stackoverflow),
(matt)-[:has_employment]->(employment)<-[:has_employment]-(stackoverflow)
return *
虽然我可能会遇到不一致的数据(此处的日期),但如果说我只想查看谁被谁雇用而没有更多详细信息/交易,这种方法是否会给我带来查询性能优势? (使用:employed_by)。
一般问题:我想(或需要)设置双向连接吗?
create
(matt:Person { name: 'Matt' } ),
(stackoverflow:Company { name: 'Stackoverflow' }),
(matt)-[:employed_by { from: date("2000-01-01"), until: date("2010-01-01") }]->(stackoverflow),
(matt)<-[:employs { from: date("2000-01-01"), until: date("2010-01-01") }]-(stackoverflow),
return *
同样,我最终会得到重复的信息 - 这有什么好处吗?
感谢您的任何提示!
选项 #3 接近我的建议,除了:
:employed_by
关系是多余的,应该省略以避免浪费存储空间、使某些查询过于复杂以及带来不一致的风险。 Employment
节点包含相同的信息。Employment
节点的两侧使用相同的关系类型,以避免混淆并可能使未来的查询更有效率。此外,在 neo4j 使用的标准命名约定中,关系名称全部大写(例如,“HAS_EMPLOYMENT”)。 它实际上有助于更轻松地阅读您的 Cypher 代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.