2015-06-08 62 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

相关问题