Neo4J-合并语句不创建具有关系的新节点

时间:2018-11-30 12:35:18

标签: neo4j cypher

我编写了一个查询,该查询将构建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 * 

enter image description here

在这里,我添加了一个居住在(关系)班加罗尔(节点)中的节点 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 ),该节点生活在(相对)班加罗尔(节点)中。

enter image description here


但是这里的问题是,它再次从上一个合并语句中获取了相同的节点值。

有人可以解释吗?

如果我们要使用Python驱动程序在循环内运行上述合并查询,那么解决方案也是什么。

Can't find anything on this tho

1 个答案:

答案 0 :(得分:2)

原因:

原因在于您对第一条和第二条MERGE语句的匹配模式。因为它们仅测试Label PersonLoc的存在,而不测试名称为Person的具体节点Kunal

想法:

正如@logisima在此answer的注释中所解释的:

  

“您应始终在主键(带有索引/唯一键)上使用MERGE   限制)”。

解决方案:

您应该通过过滤{name: 'your content'}WHERE id(kunal)=1234来匹配具体的唯一节点。