2

関数MATCH内でパターンを使用することは何とか可能ですか (v1.8 を使用)?ALL

私がやろうとしていることは次のとおりです: I am MATCHing a path 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 コンソールでの例です。

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
4

1 に答える 1

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

tail(nodes(path)) は、パス内の最初のノードを除くすべてのノードを返します。あなたの例では、開始ノードは rel1 関係に接続されていないため、何も返されませんでした。テキストで説明されているようにしたい場合は、テール部分を削除してください。

これはあなたが探していたものでしたか?

于 2012-12-08T10:39:53.933 に答える