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

Neo4J-Merge语句不创建具有关系的新节点,neo4j,cypher,Neo4j,Cypher,我编写了一个查询,它构建了两个新节点(如果存在),然后它只更新属性并添加它们之间的关系。 这是我第一次在创建节点和关系时,一切都很顺利 // 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 =

我编写了一个查询,它构建了两个新节点(如果存在),然后它只更新属性并添加它们之间的关系。

这是我第一次在创建节点和关系时,一切都很顺利

// 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 * 

我在这里添加了一个节点,他住在班加罗尔。第一次一切都很好


下次我添加其他节点时,如下所示:

// 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 *
我正在添加一个nodeJohn,他住在班加罗尔(rel)(node)


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

有人能解释一下吗

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

原因: 原因在于第一个和第二个
MERGE
语句的匹配模式。因为它们只测试
标签
人员
Loc
的存在,而不是名为
Kunal
的具体节点
人员

想法: 正如@logisima在本节评论中所解释的:

“您应该始终在主键上使用合并(带有索引/唯一 “对它的限制”

解决方案: 例如,您应该通过过滤像
{name:'your content'}
其中id(kunal)=1234
来匹配一个具体的、唯一的节点。

原因: 原因在于第一个和第二个
MERGE
语句的匹配模式。因为它们只测试
标签
人员
Loc
的存在,而不是名为
Kunal
的具体节点
人员

想法: 正如@logisima在本节评论中所解释的:

“您应该始终在主键上使用合并(带有索引/唯一 “对它的限制”

解决方案:
您应该通过过滤来匹配一个具体的、唯一的节点,例如
{name:'your content'}
其中id(kunal)=1234

具体节点将由一个键属性标识,在您的情况下可能是:
name
。此外,您不需要
类型,因为它已经在标签中。具体节点将由一个键属性标识,在您的情况下,可能是:
名称
。您也不需要
类型
,因为它已经在标签中了。