我有以下用户csv:
email,ip
abc@hotmail.com,73.53.30.159
xyz@gmail.com,1.2.3.4
abc@hotmail.com,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);
然而,在我的例子中," abc@hotmail.com"正在创建两次,一次由1.1.1.1访问,一次由73.53.30.159访问。 我期待" abc@hotmail.com"节点要创建一次并有两个传入关系,一个来自1.1.1.1,另一个来自73.53.30.159。
我应该怎么做? 感谢。
答案 0 :(得分:1)
在导入文件中,如果同一数据可以多次出现,则在创建节点时使用MERGE而不是CREATE。
我假设你有以下独特限制:IP(ip)和:IP9(ip)?您需要一个唯一约束或索引:USER(电子邮件),具体取决于多个用户是否可以使用相同的电子邮件。
答案 1 :(得分:1)
您的用户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);