使用Neo4j合并具有相同数据的节点

时间:2015-06-08 05:00:48

标签: merge neo4j cypher nodes graph-databases

以下是我要做的事情:将用户连接到他们观看的用户视频 - >社交图或网络类型图中的视频。

我是怎么做到的:

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

CSV文件有2列,其中包含用户和视频标题。在用户下面是识别每个用户的号码,在视频下是识别每个视频的号码。一个用户到一个视频。有时,用户名在列表中再次出现在另一个视频中。有时视频编号会再次出现,因为它是由不同的用户观看的。

但是,这会返回在每个关系中查看1个视频的用户关系。因此,每个用户和视频都有多个节点。

我想做什么:创建更多的网络或图形数据库,以查看所有用户正在查看哪些用户正在观看哪些视频和所有视频。要做到这一点,用户和视频不能像现在这样以一对一的关系加入。

我该怎么做?提前谢谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

添加到Luannes的答案。

需要使用标签并提供约束

:User(user)

您需要在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); 和:视频(视频)`上创建约束才能使其正常工作。

如果要导入更大量的数据(> 100k行),也请使用PERIODIC COMMIT 此外,上述查询必须提取您的数据急切以实现分离。

而是将其分为三个查询

<tr>
<td width="50%">Your Code Here</td>
<td width="50%">Your Code Here</td>
</tr>

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