首页 > 解决方案 > Neo4J - 合并语句不创建具有关系的新节点

问题描述

我编写了一个查询,如果它存在则构建 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 *

我正在添加一个住在(rel)班加罗尔(节点)的节点约翰。

在此处输入图像描述


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

有人可以解释一下吗?

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

在这方面找不到任何东西

标签: neo4jcypher

解决方案


原因:

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

主意:

正如@logisima 已经在此答案的评论中解释的那样:

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

解决方案:

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


推荐阅读