将 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) 上创建索引(或唯一性约束)以加快查询速度。