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

时间:2014-12-01 19:47:44

标签: cypher

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

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

   (R1)
  /    \
(G1)   (G3)
 |      |
(G2)   (R3)
 |      |
(G5)   (G4)
 |      |
(R2)   (R4)

我想得到以下结果集:

R1, R2
R1, R3

关于如何编写该查询的任何想法?

谢谢,

编辑: 要创建图表:

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"});

我已经尝试了以下查询,但它让我回到节点R4,我不想要。

 MATCH (r1:Red{label:'R1'})-[:foo*]->(green:Green)-->(other_red) RETURN r1, green, other_red

2 个答案:

答案 0 :(得分:2)

这是一个解决方案:

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

通过保留仅包含2个红色节点(r1other_red)的路径,确保仅采用第一个红色节点。

答案 1 :(得分:0)

您的数据设置:

CREATE (r1 {label: "R1"})-[:foo]->(g1 {label: "G1"})-[:foo]->(g2 {label: "G2"})-[:foo]->(r2 {label: "R2"}),
       (r1)-[:foo]->(g3 {label: "G3"})-[:foo]->(r3 {label: "R3"})-[:foo]->(g4 {label: "G4"})-[:foo]->(r4 {label: "R4"});

现在这是您的查询:

MATCH (r1 { label: "R1"})-[:foo*1..3]->(target)
WHERE target.label =~ "R.*"
RETURN r1.label, target.label;

此查询使用可变长度路径([:foo*1.3]),该路径指定路径必须至少一步,不超过3步。然后,我基于具有以“R”开头的标签的节点进行过滤。这给出了正确的结果,否则G1,G2和G3也会出现在结果集中,因为它们在跳数内。