匹配变长路径,同时限制节点类型

Wil*_*Pan 5 cypher

假设我有一个图表,其中节点为红色或绿色。我从红色节点开始,我想获取连接到我的起始节点的所有其他红色节点,仅通过绿色节点。

例如,如果我有以下图表:

   (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)

zab*_*oco 3

这是一种解决方案:

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