如何在将JSON导入Neo4J时避免重复节点
假设我有一个包含人与人之间关系的JSON:如何在将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"],
{
[
{
"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))