在Cypher / Neo4j中表达了许多关系

时间:2015-11-16 01:35:44

标签: neo4j cypher graph-databases

我正在尝试在Cypher中创建以下内容(所有名称都已组成,这是一个示例用例,而不是实际数据):

程序

(po0:Program {name: "xxx"}),
(po1:Program {name: "yyy"}),
(po3:Program {name: "zzz"}),

优势

(b0:Benefit {name: "happy world"}),

提供商

(pr0:Provider {name: "aaa"}),
(pr1:Provider {name: "bbb"}),
(pr3:Provider {name: "ccc"}),

我如何表达每个程序带来好处b0的想法,但这种好处是由不同的提供者根据程序提供的。例如,程序po0会提供b0提供的权益pr0。然而,计划pr1也会提供b0提供的好处pr1

如果我把它连接起来:

(po0)-[:GIVES]->(b0)-[:PROVIDED_BY]->(pr0),
(po1)-[:GIVES]->(b0)-[:PROVIDED_BY]->(pr1),
(po2)-[:GIVES]->(b0)-[:PROVIDED_BY]->(pr2),

然后我放松了哪个程序使用哪个提供程序来提供b0之间的关系。

连接它的正确方法是什么?

我能想到的最好的是:

(po0)-[:GIVES {provided_by: "xxx"}]->(b0),
(po1)-[:GIVES {provided_by: "yyy"}]->(b0),
(po2)-[:GIVES {provided_by: "zzz"}]->(b0),

但这对我来说似乎很奇怪,因为那时我放弃了对Provider节点的直接引用,导致不得不对它们进行额外的查询。

2 个答案:

答案 0 :(得分:2)

[增订]

假设您添加了另一个节点标签Service,该标签代表特定的Provider/Benefit对。例如,如果您定义:

服务:

(s0:Service {name: "a"}),
(s1:Service {name: "b"}),
(s2:Service {name: "c"}),
...

...然后您可以指示Provider提供Service Benefit,如下所示。请注意,多个Provider可以提供相同的Benefit,反之亦然:

(pr0)-[:PROVIDES]-(s0)-[:HAS]->(b0),
(pr0)-[:PROVIDES]-(s1)-[:HAS]->(b1),
(pr1)-[:PROVIDES]-(s2)-[:HAS]->(b2),
(pr2)-[:PROVIDES]-(s3)-[:HAS]->(b2),
...

最后,您只需指出每个Service使用的Program。请注意,多个Program可以使用相同的Service

(po0)-[:USES]->(s0),
(po0)-[:USES]->(s1),
(po1)-[:USES]->(s1),
(po2)-[:USES]->(s1),

...

答案 1 :(得分:1)

我认为你需要的是完成三角形并将程序链接回提供者。即。

(po0)-[:GIVES]->(b0)-[:PROVIDED_BY]->(pr0)-[:RUN_BY]->(po0),
(po1)-[:GIVES]->(b0)-[:PROVIDED_BY]->(pr1)-[:RUN_BY]->(po1),
(po2)-[:GIVES]->(b0)-[:PROVIDED_BY]->(pr2)-[:RUN_BY]->(po2),