2017-06-22 7 views
1

データベースにはPersonというラベルがあり、ノードにはプロパティー:firstname, gender, lastname, idが含まれています。Neo4j MERGEは既存ノードを使用する代わりに新しいノードを作成します

私のような関係情報が含まれたCSVファイルを持っている:私が何をしようとしています何

id sibling 
1 3,4,5 

idsibling列の値との間の関係を作成することです。

私はそうするために、次のコードを使用しています:

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM 
'file:///relationship.csv' AS line1 
WITH line1, split(line1.sibling, ",") as siblings 
UNWIND siblings as sibling 
MERGE (p:Person{id:line1.id}) 
MERGE (k:Person{id:sibling}) 
MERGE (p)-[:SIBLING_OF]->(k) 

をこのアプローチではなく、データベースにすでに存在するノードを接続するだけidプロパティを持つ新しいノードを作成します。

私はこのクエリを使用するときに奇妙なことがある:

MATCH (p:Person) 
WHERE p.id='123' 
RETURN p 

それは新しく作成されずに、(ID、ファーストネーム、性別、姓とidプロパティを含む)、データベースにあらかじめたノードだけを返します関係が、私のような、関係を持つノードを返すようにしようとしたときにのみ:id性質を持って、新しく作成されたkノードが返される

MATCH (p:Person)-[SIBLING_OF]-(k:Person) 
WHERE p.id='123 
RETURN p,k 

誰かが私が質問に間違っていることを知っていますか?

答えて

1

CSVファイルに、元のノードと一致するサイファーが存在しないようにする空白があることが予想されます。

:Person(id)に制約またはインデックスが設定されていることを確認してください。

さらに、そのユーザーのすべての兄弟のID列をマージしているので、それを移動して一度だけ行うことができます。

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM 'file:///relationship.csv' AS line1 
MERGE (p:Person {id: trim(line1.id)}) 
WITH p, line1, split(line1.sibling, ",") as siblings 
UNWIND siblings as sibling 
MERGE (k:Person {id: trim(sibling)}) 
MERGE (p)-[:SIBLING_OF]->(k) 
+0

提案したように、問題はCSVファイルの空白です。それを削除すると問題が解決しました。クエリを使用して、新しい空のノードとの関係が作成されました(プロパティはありません)。私が提供したクエリを使用して作業を行いました。 – Porjaz

+0

申し訳ありません - 空ノードを引き起こした 'WITH'節から' p'を不用意に残しました。あなたのバージョンは本当に不必要に 'id'カラムのために複数回(各兄弟のために)一度だけ必要とするときにマッチします。 –

関連する問題