Cypher中路径的可变长度匹配

时间:2015-05-07 09:30:58

标签: neo4j cypher

是否可以在Cypher中允许多个路径的可变长度匹配?通过路径我的意思是两个KNOWS遍历或三个BLOCKS遍历,其中KNOWS和BLOCKS是我的图中的关系类型。例如,我希望能够写出如下内容:

MATCH (s)-[r*]->(t) 
WHERE ALL (x in type(r) WHERE x=KNOWS/KNOWS OR x= BLOCKS/BLOCKS/BLOCKS)
RETURN s, t

其中"知识/知识"我的意思是像(a) - [:知识] - >(b) - [:知识] - >(c)。我想通过添加诸如KNOWS / KNOWS之类的关系而不改变数据本身来做到这一点,而只是作为一个密码查询。

1 个答案:

答案 0 :(得分:2)

是的,你可以这样做。它实际上比你想象的容易得多:

MATCH p=(s)-[r:KNOWS|BLOCKS*]->(t) 
RETURN s, t;

当您指定r时,您可以使用冒号指示要遍历的类型,并使用OR的管道将它们分开。星号只是按照你期望的方式运作。

如果你一次只想要一种关系,你可以这样做:

OPTIONAL MATCH p1=(s1)-[r1:KNOWS*]->(t1)
OPTIONAL MATCH p2=(s2)-[r2:BLOCKS*]->(t2)
RETURN p1, p2;

如果你想要两个知道和3个块,那就是:

OPTIONAL MATCH p1=(s1)-[:KNOWS]->()-[:KNOWS]->(t1)
OPTIONAL MATCH p2=(s2)-[:BLOCKS]->()-[:BLOCKS]->()-[:BLOCKS]->(t2)
RETURN p1, p2;