Neo4j的创建重复的节点

问题描述:

我有以下的用户CSV:Neo4j的创建重复的节点

email,ip 
[email protected],73.53.30.159 
[email protected],1.2.3.4 
[email protected],1.1.1.1 

而下面的IPS CSV:

ip 
73.53.30.159 
1.1.1.1 

进出口使用创建2节点类型:

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:///ips2.csv" AS row 
CREATE (:IP {ip: row.ip}); 
USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:///ips2.csv" AS row 
CREATE (:IP {ip: row.ip}); 

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:///emails.csv" AS row 
CREATE (:A1USER {email: row.email, ip: row.ip}); 

的话,我想创建一个给定的IP到相应的IP节点的用户之间的连接:

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:///emails.csv" AS row 
MATCH (u:USER {email: row.email, ip:row.ip}) 
MATCH (ip:IP {ip: row.ip}) 
MERGE (ip)-[:ACCESSED]->(u); 

然而,在我的例子中,“[email protected]”正在创建两次,一次访问1.1.1.1,访问73.53.30.159。 我期待“[email protected]”节点创建一次,有两个传入的关系,一个从1.1.1.1,一个来自73.53.30.159。

我应该如何着手呢? 谢谢。

+1

在您的“创建2种节点类型”查询,您是从同一个加载CSV文件两次,还创建两次相同节点类型的实例。这是一个错字,还是这是你的实际查询? – cybersam

在导入文件,如果相同的数据可能会出现不止一次,使用合并而不是创造时,你的节点。

我假设你有独特的约束:IP(IP)和:IP9(IP)?您需要一个唯一的约束或索引:USER(电子邮件),具体取决于多个用户是否可以使用相同的电子邮件。

+0

在我的导入文件中,同一封电子邮件可能会发生多次。我尝试用MERGE替换CREATE,但仍然使用相同的电子邮件获取重复的节点。 – Raytracer

+0

是的,我对用户(电子邮件)上的IP(ip)和INDEX有独特的约束。 – Raytracer

+0

重复的节点是否真的重复?还是有其他财产差异?另外,我注意到你正在使用:USER和:A1USER节点,是具有这些标签的节点之间的重复,还是只在一个标签或另一个标签中? – InverseFalcon

您的用户CSV包含重复的电子邮件地址,用不同的IP地址:它没有意义存储IP地址作为节点属性,因为有几个人,你要创建与关系无论如何,这个节点都是IP

只需先创建IP节点,然后直接在USER节点在创建连接(只从电子邮件地址):

CREATE CONSTRAINT ON (n:IP) ASSERT n.ip IS UNIQUE; 
CREATE CONSTRAINT ON (n:USER) ASSERT n.email IS UNIQUE; 

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:///ips2.csv" AS row 
CREATE (:IP {ip: row.ip}); 

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:///emails.csv" AS row 
// Merge on the "primary key" only 
MERGE (u:USER {email: row.email}) 
WITH row, u 
MATCH (ip:IP {ip: row.ip}) 
MERGE (ip)-[:ACCESSED]->(u);