neo4j创建重复的节点

时间:2016-12-05 19:41:47

标签: neo4j cypher

我有以下用户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。

我应该怎么做? 感谢。

2 个答案:

答案 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);