将 JSON 导入 Neo4J 时如何避免重复节点
How to avoid duplicate nodes when importing JSON into Neo4J
假设我有一个 JSON 包含人与人之间的关系:
{
[
{
"name": "mike",
"loves": ["karen", "david", "joy"],
"loved": ["karen", "joy"]
},
{
"name": "karen",
"loves": ["mike", "david", "joy"],
"loved": ["mike"]
},
{
"name": "joy",
"loves": ["karen"],
"loved": ["karen", "david"]
}
]
}
我想将节点和关系导入到 Neo4J 数据库中。对于此示例,只有一个关系 ("LOVES"),每个用户的 2 个列表仅控制箭头的方向。我使用以下查询导入 JSON:
UNWIND {json} as person
CREATE (p:Person {name: person.username})
FOREACH (l in person.loves | MERGE (v:Person {name: l}) CREATE (p)-[:LOVES]->(v))
FOREACH (f in person.loved | MERGE (v:Person {name: f}) CREATE (v)-[:LOVES]->(p))
我的问题是我现在有重复的节点(即 2 个 {name: 'karen'}
的节点)。我知道如果我一次插入一条记录,我可能会使用 UNIQUE
。但是导入大JSON这里应该怎么用呢? (要明确:名称 属性 在 JSON 中始终是唯一的 - 即没有 2 "mikes")。
[编辑]
由于您不能假定 Person
节点尚不存在,因此您需要 MERGE
您的 Person
节点无处不在。
如果不需要使用您的 loved
数据(也就是说,如果 loves
数据足以创建所有必要的关系):
UNWIND {json} as person
MERGE (p:Person {name: person.name})
FOREACH (l in person.loves | MERGE (v:Person {name: l}) CREATE (p)-[:LOVES]->(v))
另一方面,如果需要 loved
数据,则在创建关系时也需要使用 MERGE
(因为任何关系都可能已经存在)。
UNWIND {json} as person
MERGE (p:Person {name: person.name})
FOREACH (l in person.loves | MERGE (v:Person {name: l}) MERGE (p)-[:LOVES]->(v))
FOREACH (f in person.loved | MERGE (v:Person {name: f}) MERGE (v)-[:LOVES]->(p))
在这两种情况下,您都应该在 :Person(name)
上创建索引(或唯一性约束)以加快查询速度。
假设我有一个 JSON 包含人与人之间的关系:
{
[
{
"name": "mike",
"loves": ["karen", "david", "joy"],
"loved": ["karen", "joy"]
},
{
"name": "karen",
"loves": ["mike", "david", "joy"],
"loved": ["mike"]
},
{
"name": "joy",
"loves": ["karen"],
"loved": ["karen", "david"]
}
]
}
我想将节点和关系导入到 Neo4J 数据库中。对于此示例,只有一个关系 ("LOVES"),每个用户的 2 个列表仅控制箭头的方向。我使用以下查询导入 JSON:
UNWIND {json} as person
CREATE (p:Person {name: person.username})
FOREACH (l in person.loves | MERGE (v:Person {name: l}) CREATE (p)-[:LOVES]->(v))
FOREACH (f in person.loved | MERGE (v:Person {name: f}) CREATE (v)-[:LOVES]->(p))
我的问题是我现在有重复的节点(即 2 个 {name: 'karen'}
的节点)。我知道如果我一次插入一条记录,我可能会使用 UNIQUE
。但是导入大JSON这里应该怎么用呢? (要明确:名称 属性 在 JSON 中始终是唯一的 - 即没有 2 "mikes")。
[编辑]
由于您不能假定 Person
节点尚不存在,因此您需要 MERGE
您的 Person
节点无处不在。
如果不需要使用您的 loved
数据(也就是说,如果 loves
数据足以创建所有必要的关系):
UNWIND {json} as person
MERGE (p:Person {name: person.name})
FOREACH (l in person.loves | MERGE (v:Person {name: l}) CREATE (p)-[:LOVES]->(v))
另一方面,如果需要 loved
数据,则在创建关系时也需要使用 MERGE
(因为任何关系都可能已经存在)。
UNWIND {json} as person
MERGE (p:Person {name: person.name})
FOREACH (l in person.loves | MERGE (v:Person {name: l}) MERGE (p)-[:LOVES]->(v))
FOREACH (f in person.loved | MERGE (v:Person {name: f}) MERGE (v)-[:LOVES]->(p))
在这两种情况下,您都应该在 :Person(name)
上创建索引(或唯一性约束)以加快查询速度。