Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在将JSON导入Neo4J时避免重复节点_Neo4j_Cypher_Graph Databases - Fatal编程技术网

如何在将JSON导入Neo4J时避免重复节点

如何在将JSON导入Neo4J时避免重复节点,neo4j,cypher,graph-databases,Neo4j,Cypher,Graph Databases,假设我有一个包含人与人之间关系的JSON: { [ { "name": "mike", "loves": ["karen", "david", "joy"], "loved": ["karen", "joy"] }, { "name": "karen", "loves": ["mike", "david", "joy"],

假设我有一个包含人与人之间关系的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”),每个用户都有两个列表来控制箭头的方向。我使用以下查询导入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时,我应该在这里使用什么呢?(需要明确的是:name属性在JSON中始终是唯一的,即没有2个“mike”)。

[编辑]

由于不能假定
个人
节点尚不存在,因此需要将
节点合并到所有位置

如果不需要使用您的
loves
数据(即如果
loves
数据足以创建所有必要的关系):

另一方面,如果需要
love
数据,那么在创建关系时也需要使用
MERGE
(因为任何关系都可能已经存在)


在这两种情况下,您都应该在
:Person(name)
上创建索引(或唯一性约束),以加快查询速度。

假设是错误的。可能有这样一种情况:某人“爱”别人,但却不被别人“爱”。这不是一种交换关系。所以我确实需要两个列表。合并在这里行吗?但是如果karen“爱”mike,那么karen的个人数据不应该在“爱”列表中包含mike吗?或者你是说输入数组并不是每个人都有一个对象(比如“david”)?在任何情况下,如果您也需要支持“喜爱”列表,那么您应该使用
MERGE
而不是
CREATE
来处理关系。谢谢!正是我需要的!我也很欣赏索引评论:)
UNWIND {json} as person
MERGE (p:Person {name: person.name})
FOREACH (l in person.loves | MERGE (v:Person {name: l}) CREATE (p)-[:LOVES]->(v))
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))