我编写了一个查询,该查询将构建2个新节点(如果存在),然后仅更新属性并在它们之间添加关系。
第一次创建节点和关系时,一切都很好。
// This is the first run
MERGE (Kunal:PERSON)
ON CREATE SET
Kunal.name = 'Kunal',
Kunal.type = 'Person',
Kunal.created = timestamp()
ON MATCH SET
Kunal.lastUpdated = timestamp()
MERGE (Bangalore: LOC)
ON CREATE SET
Bangalore.name = 'Bangalore',
Bangalore.type = 'Location',
Bangalore.created = timestamp()
ON MATCH SET
Bangalore.lastUpdated = timestamp()
MERGE (Kunal)-[r1:LIVES_IN]->(Bangalore)
RETURN *
在这里,我添加了一个居住在(关系)班加罗尔(节点)中的节点 Kunal (节点)。一切都很好。
下次我添加另一个节点时,如下:
// Next time
MERGE (John:PERSON)
ON CREATE SET
John.name = 'John',
John.type = 'Person',
John.created = timestamp()
ON MATCH SET
John.lastUpdated = timestamp()
MERGE (Bangalore: LOC)
ON CREATE SET
Bangalore.name = 'Bangalore',
Bangalore.type = 'Location',
Bangalore.created = timestamp()
ON MATCH SET
Bangalore.lastUpdated = timestamp()
MERGE (John)-[r1:LIVES_IN]->(Bangalore)
RETURN *
我要添加一个节点( John ),该节点生活在(相对)班加罗尔(节点)中。
但是这里的问题是,它再次从上一个合并语句中获取了相同的节点值。
有人可以解释吗?
如果我们要使用Python驱动程序在循环内运行上述合并查询,那么解决方案也是什么。
答案 0 :(得分:2)
原因在于您对第一条和第二条MERGE
语句的匹配模式。因为它们仅测试Label
Person
和Loc
的存在,而不测试名称为Person
的具体节点Kunal
。
正如@logisima在此answer的注释中所解释的:
“您应始终在主键(带有索引/唯一键)上使用MERGE 限制)”。
您应该通过过滤{name: 'your content'}
或WHERE id(kunal)=1234
来匹配具体的唯一节点。