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

Merge 使用Neo4j合并具有相同数据的节点,merge,neo4j,cypher,nodes,graph-databases,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列,标题为用户和视频。“用户”下是标识每个用户的编号,“视频”下是标识每个视频的编号。一个用户对一个视频。有时,用户名会再次

下面是我想要做的:将用户连接到他们观看的视频,如社交图或网络类型的图中的用户->视频

我是如何做到的:

LOAD CSV WITH HEADERS FROM 'asdfjkl;' AS line
CREATE (u {user: line.user }) - [:VIEW] -> (v {video: line.video})
RETURN u, v
CSV文件有2列,标题为用户和视频。“用户”下是标识每个用户的编号,“视频”下是标识每个视频的编号。一个用户对一个视频。有时,用户名会再次出现在不同视频的列表中。有时视频号码会再次出现,因为它是由不同的用户观看的

但是,这将返回关系用户在每个关系中观看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

有关合并的更多信息:

添加到Luanes答案

您需要使用标签并提供约束

您需要在
:User(User)
和:Video(Video)`上创建一个约束,以使其正常工作

如果要导入更大的数据量(>100k行),也可以使用定期提交 此外,上面的查询必须急切地拉入数据以实现分离

而是将其分为三个查询

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)。

使用标签:用户和:视频!!
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);