2016-08-12 21 views
0

このクエリを実行してグラフを作成した場合、中間ノードを削除し、 'and'と前のノードを 'graph中間ノードを削除し、親ノードをすべて子ノードに接続するneo4j cypherクエリ

MERGE (n:Person { name: 'graph'}) 

MERGE (n:Person { name: 'and'}) 

MERGE (n:Person { name: 'relational' }) 

MERGE (n:Person { name: 'nosql'}) 

MERGE (n:Person { name: 'server'}) 

MERGE (n:Person { name: 'db'}) 

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

MERGE (a:Person { name: 'and' }) MERGE (b:Person { name: 'db'}) MERGE (a)-[:NEXT{seqid:1 , caps: 'true'}]->(b) 

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

MERGE (a:Person { name: 'nosql'}) MERGE (b:Person { name: 'db' }) MERGE (a)-[:NEXT{seqid:2, caps: 'true'}]->(b) 

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

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

MERGE (a:Person { name: 'server'}) MERGE (b:Person { name: 'and'}) MERGE (a)-[:CONNECTS{seqid:2}]->(b) 

MERGE (a:Person { name: 'and' }) MERGE (b:Person { name: 'db'}) MERGE (a)-[:CONNECTS{seqid:2, caps: 'true'}]->(b) 

(graph)-[:NEXT{seqid:1 , caps: 'true'}]->(db) 

(relational)-[:NEXT{seqid:1}]->(db) 

(nosql)-[:NEXT{seqid:2, caps: 'true'}]->(db) 

(server)-[:NEXT{seqid:1}]->(db) 

(server)-[:CONNECTS{seqid:2, caps: 'true'}]->(db) 

すなわちplsは私はこの問題を解決するのに役立ちSEQID 『『同じに基づいて対応する出の関係を使用して、』DB」をその子ノードに言う』 ........ .....

(私は)

答えて

0

ここでの障害は、関係タイプを動的に作成できないことです。入ってくる関係をチェックしたり、そのタイプを知らなかったり、同じタイプの新しい関係を作成することはできません。

処理する必要があるリレーションシップの種類がわかっていて、明示的に対応できる場合は、Cypherでこれを実行できます。 、次の関係新たに作成された関係にオーバー途中のノードから終了ノードとの関係の性質を超えるコピー:ここではすべてのためにこれを行うには、クエリです

MATCH (middle:Person{name:'and'}) 
WITH middle 
MATCH (from:Person)-[rFrom:NEXT]->(middle) 
WHERE exists(rFrom.seqid) 
WITH middle, rFrom, from 
MATCH (middle)-[rTo:NEXT]->(to:Person) 
WHERE rTo.seqid = rFrom.seqid 
WITH middle, rFrom, from, rTo, to 
CREATE (from)-[rNew:NEXT]->(to) 
SET rNew += rTo 
DELETE rFrom 

あなたはすべてのためにこれを繰り返しますよ興味のあるリレーションシップ・タイプを選択し、中間ノードとの関係がなくなった場合はノードを削除します。

neo4j 3にアップグレードする場合、APOCプロシージャライブラリにはグラフリファクタリングの手順がありますので、これを簡単に処理できます。 MERGEの代わりに、CREATE行うために上記の私のCypherを変更された

EDIT

中間ノードから次のノードにリレーションシップを削除することも削除されました。中間ノードと同じタイプとIDを持つ中間ノードですが、そのタイプとIDを持つ中間ノードとの関係は1つだけです。

これは、同じタイプおよびIDを持つ着信関係の比率が、同じタイプおよびIDの発信関係と等しくないため、新しい関係を作成する際にこれらの発信関係を再利用することを意味します。

新しい関係の作成がすべて完了した後で、中間ノードを切り離して削除する必要があります。

+0

返信ありがとうございました........ –

+0

pls help .........このクエリーは、異なるプロパティを持つ同じタイプの複数のリレーションシップが中間に存在する場合に、2つの新しく接続されたノード間の最後の関係のみを取得します。私はすべての関係をキャプチャしたい... –

+0

新しいNEXT関係を作成するときに、私は誤ってCREATEの代わりにMERGEを使用していました。新しいクエリを試してみてください。 – InverseFalcon

0

すべての要件を満たすが、Neo4j 3.0.x以上が必要な別の回答を追加する。具体的には、APOCプロシージャのapoc.create.relationship()プロシージャが必要です。このプロシージャは、リレーションシップからマッチングされた動的タイプとの関係を作成します。

これは一度にすべてのリレーションシップ(少なくともseqidを持つリレーションシップ)を処理するため、最後に中間ノードを切り離しても問題ありません。

MATCH (middle:Person{name:'and'}) 
WITH middle 
MATCH (from:Person)-[rFrom]->(middle) 
WHERE EXISTS(rFrom.seqid) 
WITH middle, rFrom, from 
MATCH (middle)-[rTo]->(to:Person) 
WHERE TYPE(rTo) = TYPE(rFrom) AND rTo.seqid = rFrom.seqid 
WITH middle, rFrom, from, rTo, to 
CALL apoc.create.relationship(from, TYPE(rFrom), PROPERTIES(rTo), to) YIELD rel 
DETACH DELETE middle 
+0

更新いただきありがとうございます。チェックします ... –

関連する問題