2015-06-08 63 views
1

下面是我想要做的:將用戶連接到他們觀看的視頻,如用戶 - >社交圖形或網絡類型的視頻。使用Neo4j合併具有相同數據的節點

我怎麼做的:

LOAD CSV WITH HEADERS FROM 'asdfjkl;' AS line 
CREATE (u {user: line.user }) - [:VIEW] -> (v {video: line.video}) 
RETURN u, v 

CSV文件有2列與表頭的用戶和視頻。在用戶下面是一個標識每個用戶的號碼,在視頻下是一個標識每個視頻的號碼。一個用戶到一個視頻。有時用戶名稱會在列表中再次出現在不同的視頻中。有時視頻編號會再次出現,因爲它是由不同的用戶觀看的。

但是,這會返回關係用戶在每個關係中查看1個視頻的關係。因此,每個用戶和視頻都有多個節點。

我想要做什麼:創建更多的網絡或圖形數據庫,以查看所有用戶正在查看哪些視頻以及所有視頻由哪些用戶觀看。要做到這一點,用戶和視頻不能像現在這樣一對一地加入到一對一的關係中。

我該怎麼做?先謝謝你!

+0

使用標籤:用戶和:視頻! –

回答

1

添加到Luannes答案。

需要使用標籤並提供約束

LOAD CSV WITH HEADERS FROM 'asdfjkl;' AS line 
MERGE (u:User {user: line.user }) 
MERGE (v:Video {video: line.video}) 
MERGE (u)-[:VIEW]->(v) 
RETURN u, v 

您需要在:User(user)並創建一個約束:Movie(視頻)`它才能正常工作。

如果要導入更大的數據量(> 10萬行),也可以使用定期COMMIT 而且上面的查詢在您的數據拉熱切實現分離。

而是把它分解成三個查詢

CREATE CONSTRAINT ON (u:User) ASSERT u.user IS UNIQUE; 
CREATE CONSTRAINT ON (v:Video) ASSERT v.video IS UNIQUE; 

USING PERIODIC COMMIT 100000 
LOAD CSV WITH HEADERS FROM 'asdfjkl;' AS line 
WITH distinct line.user as user_data 
MERGE (:User {user: user_data }); 

USING PERIODIC COMMIT 100000 
LOAD CSV WITH HEADERS FROM 'asdfjkl;' AS line 
WITH distinct line.video as video_data 
MERGE (:Video {video: video_data }); 

USING PERIODIC COMMIT 100000 
LOAD CSV WITH HEADERS FROM 'asdfjkl;' AS line 
MATCH (u:User {user: line.user }) 
MATCH (v:Video {video: line.video}) 
MERGE (u)-[:VIEW]->(v); 

確保使用最新版本(2.2.2 Neo4j的)。

1

MERGE將確保它創建節點/關係,如果丟失或使用它們。由於line.user和line.video似乎是主鍵的等價,這應該工作以及

LOAD CSV WITH HEADERS FROM 'asdfjkl;' AS line 
MERGE (u {user: line.user }) 
MERGE (v {video: line.video}) 
MERGE (u)-[:VIEW]->(v) 
RETURN u, v 

更多關於MERGE:http://neo4j.com/docs/2.2.2/query-merge.html

相關問題