是否可以在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之类的关系而不改变数据本身来做到这一点,而只是作为一个密码查询。
答案 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;