我有以下图表
(1)-[A]->(2)-[B]->(3)-[A]->(4)-[B]->(5)-[A]->(6)-[B]->(7)-[A]->(8)
如何指定Cypher查询,找到(1)和(8)之间的路径,使它们通过交替a和b关系连接?
我在这里有一个可玩的版本:http://console.neo4j.org/?id=84b3mz
这样的查询给了我路径,但是我需要开始在集合p上指定条件
START s=node(1)
MATCH p=s-[r*]->e
WHERE e.name="8"
RETURN p
更好的方式是
MATCH p=s-([:A]->()-[:B])*->e
在Cypher中有可能吗?
答案 0 :(得分:4)
所以,你可以做[r:A|B*]
,但这并不强制他们必须交替。如果你必须强制执行,你可以在ALL中执行:
MATCH p=(s)-[:A|B*]->(e)
WHERE s.name="1"
WITH p, range(0,length(p)-1) AS idx // create a list of indexes to go through
WHERE ALL (i IN idx
WHERE CASE i % 2 = 0
WHEN TRUE THEN type(rels(p)[i])= "A" // even indexes are "A"
ELSE type(rels(p)[i])= "B" // odd indexes are "B"
END )
RETURN p,idx
这里需要注意的是,如果你在第一场比赛中得到很多路径,这将不会超级高效。它必须扫描所有这些,验证它们的顺序是正确的。