2016-08-18 16 views
0

リスト内でその名前が出現し、同じシーケンスIDを持つノードのすべてのシーケンスをその間に存在させたいと考えています。以下のクエリから構築されたグラフに基づいて:例えばのためneo4j cypherクエリー関係のプロパティー内に同じシーケンスIDを持つノードのシーケンスを取得するためのクエリ

MERGE (a:Person { name: 'graph'}) 
MERGE (b:Person { name: 'server' }) 
MERGE (a)-[:NEXT{seqid:1}]->(b) 

MERGE (c:Person { name: 'server' }) 
MERGE (d:Person { name: 'db'}) 
MERGE (c)-[:NEXT{seqid:1}]->(d) 

MERGE (a1:Person { name: 'graph'}) 
MERGE (b:Person { name: 'db' }) 
MERGE (a)-[:NEXT{seqid:2}]->(b) 

MERGE (c:Person { name: 'db' }) 
MERGE (d:Person { name: 'server'}) 
MERGE (c)-[:NEXT{seqid:2}]->(d) 

は、与えられたリストで自分の名前を持つノードのすべてのシーケンスを見つけ、「同じと[「グラフ」、「サーバー」、「DB」]と言いますseqid 'プロパティはその間の関係に存在します。

(graph)->(server)-(db) with same seqid :1 

(graph)->(db)->(server) with same seqid :1 //there can be another matching 
               sequence with same seqid 

(graph)->(db)->(server) with same seqid :2 

すなわち

はノードの唯一の最後のシーケンスを維持する方法はあります言う各配列については「(グラフ) - >(デシベル) - >(サーバー)」の代わりののサブパスの各>(サーバー)または(サーバー) - - >(デシベル)

plsは私がこの問題を解決するのに役立ち.........

(私はのNeo4j 2.3を使用しています(グラフ)のような大規模なシーケンス.6コミュニティ版のJava APIを介した埋め込みモード..)

答えて

1
// Get all the possible paths 
MATCH path = (S:Person)-[rels:NEXT*]->(E:Person) 

    // Check that the property is the same 
    WHERE ALL(r in rels WHERE rels[0]['seqid'] = r.seqid) 

RETURN rels[0]['seqid'] as seqid, 
     // Get an array of names 
     REDUCE(acc = [], n in nodes(path) | acc + [n.name]) 

ORDER BY seqid, 
     length(path) 
+0

(グラフ) - >ような大きなシーケンスの各サブパスではなく、各シーケンスの最終的なノードシーケンスだけを '(グラフ) - >(サーバ) - > (サーバー)または(サーバー)→(db) –

関連する問題