我正在尝试在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节点的直接引用,导致不得不对它们进行额外的查询。
答案 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),