2017-06-21 11 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我設法用下面的Cypher支架查詢創建的所有節點:

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

但現在我卡住了我m不太清楚如何創建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) 

,或者你可以做它在列表中的一個通...

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

我想你的第二個解決方案,我不得不user'加上'的'WITH'聲明以編譯。無論如何,它不會創建任何節點。 – Alessandro

+0

良好的捕獲 - 我更新了查詢2和3以反映用戶添加到'WITH'子句。第二個查詢是爲了在第一個查詢創建節點後運行的。第三個查詢是爲了一次創建節點和關係。 –

+0

對不起,我誤解了。我的查詢+你的第二個查詢工作,而第三個似乎掛起,永遠不會完成。 (如果您熟悉Neo4j的Java驅動程序,它似乎永遠不會關閉'Transaction')。我正在用100行的示例文件測試這些查詢,但我的實際JSON文件包含近百萬行,因此我不知道這些方法是否可行。我沒有意識到他們太重了。 – Alessandro