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

时间:2012-12-08 09:37:27

标签: neo4j cypher

是否有可能在ALL function内使用MATCH模式(使用v1.8)?

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

(a)-->(b)-->(c)-->(d)
       ^     ^     ^
       |r    |r    |r
      ( )   ( )   ( )

我可以以某种方式使用ALL函数,或者我是否必须添加其他MATCH模式:

START ...
MATCH (a)-->(b)-->(c)-->(d)..., ()-[:r]->(b), ()-[:r]->(c), ...
RETURN ...

更新

以下是Neo4j console中的示例:

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

1 个答案:

答案 0 :(得分:7)

您可以使用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

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

这是你想要的吗?