2016-05-08 12 views
1

Iノード例えば間の重複関係を有する:のNeo4j重複関係

(Author)-[:CONNECTED_TO {weight: 1}]->(Coauthor) 

(Author)-[:CONNECTED_TO {weight: 1}]->(Coauthor) 

(Author)-[:CONNECTED_TO {weight: 1}]->(Coauthor) 

および私は1つの形式の関係にこれらの関係をマージする:A - > {重量:3}私の全体のグラフのB。

私は次のようなものを試しました。

MATCH (a:Author {authorid: csvLine.author_id}),(b:Coauthor { coauthorid: csvLine.coauthor_id}) 

CREATE UNIQUE (a)-[r:CONNECTED_TO]-(b) 

SET r.weight = coalesce(r.weight, 0) + 1 

を(私は、CSVファイルからデータを読んでいる)しかし、私はこのクエリを起動すると、重複した共著者ノードを作成します。重量が更新されます。それはこのように思える:

(Author)-[r:CONNECTED_TO]->(Coauthor) 

(それは作者のために3つの同じ共著者のノードを作成します)

答えて

1

あなたは事実の後にそれを修正する必要がある場合は、すべての関係と各セット間の重みを集約することができ適用可能なノードの数。次に、新しい集約番号で最初の関係を更新します。その後、関係のコレクションでは、最後から2番目を削除します。複数の関係が存在する場合にのみ更新を実行します。このような何か...

match (a:Author {name: 'A'})-[r:CONNECTED_TO]->(b:CoAuthor {name: 'B'}) 

// aggregate the relationships and limit it to those with more than 1 
with a, b, collect(r) as rels, sum(r.weight) as new_weight 
where size(rels) > 1 

// update the first relationship with the new total weight 
set (rels[0]).weight = new_weight 

// bring the aggregated data forward 
with a, b, rels, new_weight 

// delete the relationships 1..n 
unwind range(1,size(rels)-1) as idx 
delete rels[idx] 

あなたは全体のグラフとグラフのためにそれをやっている場合は、あなたが制限または他の制御機構を使用してバッチで更新してパーマしたい場合があり広大です。本当にあなたのデータモデルを知らない彼らはおそらく作者あるとして、私はAuthorとしてCoAuthorをモデル化を検討します:あなたは...

MATCH (a:Author {authorid: csvLine.author_id}),(b:Coauthor { coauthorid: csvLine.coauthor_id}) 
MERGE (a)-[r:CONNECTED_TO]->(b) 
    ON CREATE SET r.weight = 1 
    ON MATCH SET r.weight = coalesce(r.weight, 0) + 1 

側注をロードする際に問題を解消したい場合

match (a:Author)-[r:CONNECTED_TO]->(b:CoAuthor) 
with a, b, collect(r) as rels, sum(r.weight) as new_weight 
limit 100 
where size(rels) > 1 
set (rels[0]).weight = new_weight 
with a, b, rels, new_weight 
unwind range(1,size(rels)-1) as idx 
delete rels[idx] 

自分の権利で。特定のプロジェクトのコンテキストでのみ、おそらく共著者と見なされます。