2017-06-21 15 views
1

Neo4jの使い方を学んでいます。JSONファイルにあるかなりのソーシャルネットワークを構築しています。Neo4j - JSONリストからリレーションシップを作成

ファイル構造は次のようになります。

{ 
    "users": [ 
       {"id":"1", "name":"Bob", friends: ["2","3"]}, 
       {"id":"2", "name":"Alice", friends: ["1"]}, 
       {"id":"3", "name":"Robert", friends: ["1","4","5"]}, 
       ... 
    ]  
} 

this guide後、私は次のようサイファークエリを持つすべてのノードを作成するために管理:

WITH {json} AS data 
UNWIND data.users AS user 
MERGE (u:User {user_id: user.id, name: user.name}) 

をしかし、今、私は「こだわっていますfriendsフィールドに定義されているように、ノード間の関係を作成する方法がわかりません。すべきかUNWINDfriendsフィールドもありますか?私は何とか作成したすべてのノードを何度も繰り返して、その友人との関係を追加する必要がありますか?たぶんこれは基本的な質問ですが、私はCypherから始めています。

答えて

0

はい、UNWINDfriendsもそうです。同じデータセットをもう一度渡して、ユーザーとその友だちをidで見つけて、それらを接続することができます。このような

何かが良いが、まだ一度だけではなく、すべての友人のためよりも、ユーザーを検索し、別の節で各友人が一致し、それらをフックアップ

WITH {json} AS data 
UNWIND data.users AS user 

// for each collection of friends 
UNWIND user.friends as friend 

// find the current user and their friends 
MATCH (u:User {user_id: user.id}), (f:User {user_id: friend}) 
MERGE (u)-[:FRIENDS]-(f) 

働くだろう。

WITH {json} AS data 
UNWIND data.users AS user 

// first create/find the user in the graph 
MATCH (u:User {user_id: user.id}) 
WITH user, u 

// iterate through each collection of friends 
UNWIND user.friends as friend 

// find each friend 
MATCH (f:User {user_id: friend}) 

// hook them up 
MERGE (u)-[:FRIENDS]-(f) 

か、リストの1回のパスでそれを行うことができ...

WITH {json} AS data 
UNWIND data.users AS user 

// first create/find the user in the graph 
MERGE (u:User {user_id: user.id}) 
ON CREATE SET u.name = user.name 
WITH u, user 

// iterate through each collection of friends 
UNWIND user.friends as friend 

// find/create stub for each of the friends 
MERGE (f:User {user_id: friend}) 

// hookup friends 
MERGE (u)-[:FRIENDS]-(f) 
+0

私はあなたの第二の溶液を試してみましたが、私はコンパイルするために 'WITH'書に' user'を追加する必要がありました。とにかく、ノードを作成しません。 – Alessandro

+0

良いキャッチ - 私は 'WITH'句へのユーザーの追加を反映するようにクエリ2と3を更新しました。 2番目のクエリは、ノードを作成した最初のクエリの後に実行されるものでした。 3番目のクエリはノードと関係を1回のパスで作成することを意図していました。 –

+0

申し訳ありませんが、私は誤解しました。私のクエリ+あなたの2番目のクエリの仕事、3番目のハングアップと決して完了するようです。 (もしあなたがNeo4j用のJavaドライバに慣れていれば、 'Transaction'を閉じることはないと思われます)。これらのクエリを100行のサンプルファイルでテストしていますが、実際のJSONファイルにはほぼ100万行が含まれているため、これらのアプローチのいずれかが実現可能かどうかはわかりません。私は彼らがとても重かったことを知らなかった。 – Alessandro

関連する問題