Neo4j 密码查询:查找具有交替关系的路径

Neo4j 密码查询:查找具有交替关系的路径,neo4j,cypher,Neo4j,Cypher,我有下面的图表 (1)-[A]->(2)-[B]->(3)-[A]->(4)-[B]->(5)-[A]->(6)-[B]->(7)-[A]->(8) 如何指定一个查找(1)和(8)之间路径的密码查询,以便它们通过交替的a和b关系连接起来 我这里有一个可玩的版本: 这样的查询为我提供了路径,但是我需要开始在集合p上指定条件 START s=node(1) MATCH p=s-[r*]->e WHERE e.name="8" RETURN p

我有下面的图表

(1)-[A]->(2)-[B]->(3)-[A]->(4)-[B]->(5)-[A]->(6)-[B]->(7)-[A]->(8)
如何指定一个查找(1)和(8)之间路径的密码查询,以便它们通过交替的a和b关系连接起来

我这里有一个可玩的版本:

这样的查询为我提供了路径,但是我需要开始在集合p上指定条件

START s=node(1) 
MATCH p=s-[r*]->e 
WHERE e.name="8" 
RETURN p
更好的办法是

MATCH p=s-([:A]->()-[:B])*->e

在Cypher中也可以这样做吗?

因此,您可以执行
[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

这里需要注意的是,如果你从第一场比赛开始就有很多路径,那么这不会是一个超级性能。它将必须扫描所有这些文件,验证它们的顺序是否正确。

因此,您可以执行
[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

这里需要注意的是,如果你从第一场比赛开始就有很多路径,那么这不会是一个超级性能。它必须扫描所有的兔子,验证它们的顺序是否正确。

请分享你尝试过的东西。好的,我添加了一些代码和兔子洞的链接。请分享你尝试过的东西。好的,我添加了一些代码和兔子洞的链接。更优雅的方法可能是创建一个新的关系“AB”,从(1)到(3)然后通过这些新的链接导航,是的?这是一个选项,但是我不认为改变数据库是一种有效的查询方式。当事情发生变化时,您必须协调更新,以使这些新链接保持最新。我在运行队列时遇到问题-“所有的参数不是谓词”它在您发送的控制台示例中起作用。你使用的是什么版本的NEO?听起来可能是M06中的一些类型的问题。一个更优雅的方法可能是创建一个新的关系“AB”,从(1)到(3),然后通过这些新的链接导航,是的,这是一个选项,但是我不认为改变数据库是一个有效的查询方式。当事情发生变化时,您必须协调更新,以使这些新链接保持最新。我在运行队列时遇到问题-“所有的参数不是谓词”它在您发送的控制台示例中起作用。您使用的是什么版本的Neo?听起来CASE在M06中的类型可能有一些问题。