Cypher查询:找到交替关系的路径

时间:2013-11-25 15:54:09

标签: neo4j cypher

我有以下图表

(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中有可能吗?

1 个答案:

答案 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

这里需要注意的是,如果你在第一场比赛中得到很多路径,这将不会超级高效。它必须扫描所有这些,验证它们的顺序是正确的。