假设我有一个图表,其中节点为红色或绿色。我从红色节点开始,我想获取连接到我的起始节点的所有其他红色节点,仅通过绿色节点。
例如,如果我有以下图表:
(R1)
/ \
(G1) (G3)
| |
(G2) (R3)
| |
(G5) (G4)
| |
(R2) (R4)
Run Code Online (Sandbox Code Playgroud)
我想得到以下结果集:
R1, R2
R1, R3
Run Code Online (Sandbox Code Playgroud)
关于如何编写该查询有什么想法吗?
谢谢,
编辑:创建图表:
CREATE (r1:Red{label: "R1"})-[:foo]->(g1:Green{label: "G1"})-[:foo]->(g2:Green{label: "G2"})-[:foo]->(g5:Green{label:"G5"})-[:foo]->(r2:Red{label: "R2"}),
(r1)-[:foo]->(g3:Green{label: "G3"})-[:foo]->(r3:Red{label: "R3"})-[:foo]->(g4:Green{label: "G4"})-[:foo]->(r4:Red{label: "R4"});
Run Code Online (Sandbox Code Playgroud)
我尝试了以下查询,但它返回了我不想要的节点 R4。
MATCH (r1:Red{label:'R1'})-[:foo*]->(green:Green)-->(other_red) RETURN r1, green, other_red
Run Code Online (Sandbox Code Playgroud)
这是一种解决方案:
MATCH p = (r1:Red {label:'R1'})-[:foo*]->(green:Green)-[:foo]->(other_red:Red)
WITH r1, green, other_red, [n IN nodes(p) WHERE 'Red' in labels(n) | n] as redNodes
WHERE length(redNodes) = 2
RETURN r1, green, other_red
Run Code Online (Sandbox Code Playgroud)
r1它通过保留仅包含 2 个红色节点(和)的路径来确保仅采用第一个红色节点other_red。