在路径上的所有节点上执行MATCH

Fyn*_*ynn 2 neo4j cypher

是否可以MATCHALL函数内部使用模式(使用v1.8)?

我想要做的是以下内容:我正在走MATCH一条路p = (a)-->(b)-->(c)-->(d).但是,此路径上的所有节点必须具有r来自某个节点的其他传入关系.让我试着用ASCII清楚地说明这一点:

(a)-->(b)-->(c)-->(d)
       ^     ^     ^
       |r    |r    |r
      ( )   ( )   ( )
Run Code Online (Sandbox Code Playgroud)

我可以以某种方式使用该ALL功能,或者我必须添加这样的其他MATCH模式:

START ...
MATCH (a)-->(b)-->(c)-->(d)..., ()-[:r]->(b), ()-[:r]->(c), ...
RETURN ...
Run Code Online (Sandbox Code Playgroud)

更新:

以下是Neo4j控制台中的示例:

START n=node(0) 
CREATE (a), (b), (c), (d), (e),
n-[:rel1]->a, n-[:rel1]->b, n-[:rel1]->d, n-[:rel1]->e,
a-[:rel2]->b-[:rel3]->d, a-[:rel2]->c-[:rel3]->e

START n=node(0) 
MATCH n -[:rel1]-> x -[:rel2]-> y -[:rel3]-> z, ()-[:rel1]->y, ()-[:rel1]->z 
RETURN z
Run Code Online (Sandbox Code Playgroud)

And*_*res 8

您可以使用WHERE ALL执行此操作,如下所示:

START n=node(0) 
MATCH path = n -[:rel1]-> x -[:rel2]-> y -[:rel3]-> z 
WHERE ALL(n in tail(nodes(path)) WHERE ()-[:rel1]->n) 
RETURN z
Run Code Online (Sandbox Code Playgroud)

tail(nodes(path))返回路径中除第一个节点之外的所有节点.在您的示例中,起始节点未与rel1关系连接,因此未返回任何内容.如果你想像你的文字一样解释它,只需放下尾部即可.

这是你在找什么?

  • 就速度而言,WHERE解决方案总是优于MATCH. (2认同)