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

Merging nodes with the same data using Neo4j

这是我想要做的:将用户连接到他们观看的视频,例如社交图谱或网络图谱中的用户 -> 视频。

我是怎么做到的:

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

CSV 文件有 2 列 headers 用户和视频。在 user 下是一个标识每个用户的数字,在 video 下是一个标识每个视频的数字。一个用户一个视频。有时,用户名会再次出现在列表中的另一个视频中。有时视频编号会再次出现,因为它被不同的用户观看。

但是,此 returns 关系用户在每个关系中观看 1 个视频。因此,每个用户和视频都有多个节点。

我想做的事情:创建更多的网络或图形数据库,以查看所有用户正在观看哪些视频以及哪些用户观看了哪些所有视频。为此,用户和视频不能像现在这样以单一的一对一关系加入。

我该怎么做?提前致谢!

MERGE 将确保它在缺少 nodes/relationships 时创建或使用它们。由于 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

添加到 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) 和 :Video(video)` 上创建约束才能正常工作。

如果您要导入更大量的数据(> 100k 行)也请使用 PERIODIC 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);

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