2017-08-28 8 views
2

質問があります。私はNeo4jデータベースに出てきた特定の状況から情報を取得しようとしています。ここにノード構成があります。異なる深さのサイファーマッチパス

Node Configuration

は私がaに、私はそこに着信接続するノードを見つける必要があるすべての着信接続のため、そこに出て行くのノードのすべての送信のために接続されているすべてのノードを取得する必要があります。

だから私はabcdlfeを期待します。 Not g,h,i,jおよびkである。

これまで私が試したことは、1つのクエリで完全なセットが得られていないことです。私は得るか、または多かれ少なかれ。

MATCH (n)-[r]-(m) WHERE n.name="a" 
RETURN n,m,r 

はちょうどabcflを与えます。

MATCH (n)-[r]-(m)-[s]->(x) 
WHERE n.name="a" 
RETURN n,m,r,s,x 

、私はblを失います。

私は間違ったことをする必要があります。必要なデータを取得するクエリはありますか?

答えて

3

考えると、この初期データセット(印刷画面に示されるデータモデル):

CREATE (a:Node {name : 'a'}) 
CREATE (b:Node {name : 'b'}) 
CREATE (c:Node {name : 'c'}) 
CREATE (d:Node {name : 'd'}) 
CREATE (e:Node {name : 'e'}) 
CREATE (f:Node {name : 'f'}) 
CREATE (g:Node {name : 'g'}) 
CREATE (h:Node {name : 'h'}) 
CREATE (i:Node {name : 'i'}) 
CREATE (j:Node {name : 'j'}) 
CREATE (k:Node {name : 'k'}) 
CREATE (l:Node {name : 'l'}) 

CREATE (a)-[:CONNECTED_TO]->(c) 
CREATE (c)-[:CONNECTED_TO]->(d) 
CREATE (a)-[:CONNECTED_TO]->(l) 
CREATE (b)-[:CONNECTED_TO]->(a) 
CREATE (a)-[:CONNECTED_TO]->(f) 
CREATE (f)-[:CONNECTED_TO]->(e) 
CREATE (g)-[:CONNECTED_TO]->(f) 
CREATE (i)-[:CONNECTED_TO]->(g) 
CREATE (i)-[:CONNECTED_TO]->(h) 
CREATE (i)-[:CONNECTED_TO]->(j) 
CREATE (j)-[:CONNECTED_TO]->(k) 

このクエリは動作するはず:

// Match de start point 'A' 
MATCH (a:Node {name : 'a'}) 
// Match incoming nodes and optionally (0..1) incoming of incoming nodes 
MATCH (a)<-[:CONNECTED_TO]-(b:Node)<-[:CONNECTED_TO*0..1]-(c:Node) 
// collect b and c into rows, pass a to the next context 
WITH a, collect(b) + collect(c) as rows 
// Match outgoing nodes and optionally (0..1) outgoing of outgoing nodes 
MATCH (a)-[:CONNECTED_TO]->(b:Node)-[:CONNECTED_TO*0..1]->(c:Node) 
// collect all into rows 
WITH collect(a) + collect(b) + collect(c) + rows as rows 
// unwind 
UNWIND rows AS unwinded 
// return distinct nodes 
RETURN DISTINCT unwinded 
ORDER BY unwinded.name 

結果は次のようになります

╒════════════╕ 
│"unwinded" │ 
╞════════════╡ 
│{"name":"a"}│ 
├────────────┤ 
│{"name":"b"}│ 
├────────────┤ 
│{"name":"c"}│ 
├────────────┤ 
│{"name":"d"}│ 
├────────────┤ 
│{"name":"e"}│ 
├────────────┤ 
│{"name":"f"}│ 
├────────────┤ 
│{"name":"l"}│ 
└────────────┘ 

編集:

リファクタリングクエリ:

MATCH (in2:Node)-[:CONNECTED_TO*0..1]->(in:Node)-[:CONNECTED_TO]->(a:Node {name : 'a'})-[:CONNECTED_TO]->(out:Node)-[:CONNECTED_TO*0..1]->(out2:Node) 
WITH collect(in2) + collect(in) + collect(a) + collect(out) + collect(out2) as rows 
UNWIND rows AS unwinded 
RETURN distinct unwinded 
ORDER BY unwinded.name 

上記のクエリは、同じ結果を生成する代わりに、3個の異なるMATCH ESのパターン全体は1つのみMATCHを使用。

+0

ありがとうございました – user2622022

関連する問題