2017-02-10 4 views
1

Tweetタイプの1つ以上の共通ノードにリンクされた2つのタイプのノードがあります。画像の例:別のノードからの関係のコピー

enter image description here

私は、重複ユーザーを削除し、単一のノードにマージしたいと思います。両方のユーザーからのすべての関係を保存します。次のクエリでは

MATCH (x:User)-[k:POSTS]->(:Tweet)<-[:POSTS]-(y:User) 

この

は私がマージされる必要があるノードを検索するために使用する条件であるUser_Bへの切り離しこれらにつぶやきをリンクしない

MATCH (x:User)-[k:POSTS]->(:Tweet)<-[:POSTS]-(y:User) 
DELETE k 
WITH x, y 
MATCH (x)-[r:POSTS]->(z:Tweet) 
MERGE (y)-[:POSTS]->(z) 
DELETE r 

ユーザーa。

私もapoc.refactor.mergeNodesを試しましたが、エラーが発生します。

これら2つのノードをマージして関連性を維持するにはどうすればよいですか?

UPDATE:私は、重複関係を得る。このクエリでは

MATCH (z:User) 
WHERE (z:User)-[:POSTS]->(:Tweet)<-[:POSTS]-(:User) 
WITH COLLECT(z) AS zs 
CALL apoc.refactor.mergeNodes(zs) YIELD node 
RETURN node; 

、マージする方法はありますか?

UPDATE 2:

私は私のデータベースのより大きなサンプルの前のクエリを使用しようとしたが、それはエラーになります。

+1

より明確化が必要とされています。 1.あなたの質問は、「両方のユーザーからのすべての関係を維持する」ことに興味があると述べましたが、残りの質問は「重複する」関係を削除することを示しています。あなたは実際に何をしたいですか? 2.実際に "複製"関係を1つにマージする場合は、おそらくすべてのプロパティをマージしたいと思うでしょう。関係には値がありますか?その場合、マージされるリレーションシップが同じプロパティに対して異なる値を持つことができる場合、マージされたリレーションシップに保持する値はどれですか? – cybersam

答えて

1

このクエリは最初に(x)から(tweet)へのリレーションを削除してから検索します。

これを試してみてください:

MATCH (x:User) 
WITH x 
MATCH (x)-[:POSTS]->(t:Tweet)<-[r:POSTS]-(y:User) WHERE x <> y AND id(x) > id(y) 
WITH x, y, count(t) as ag 
MATCH (y)-[r:POSTS]->(z:Tweet) 
MERGE (x)-[:POSTS]->(z) 
WITH y, count(z) as ag 
DETACH DELETE y 
+0

これにより、両方のユーザーノードが削除されます。 –

+0

はい、詳細を忘れました: 'id(x)> id(y)'。更新を参照してください。 –

関連する問題