【问题标题】:Neo4J - Merge statement not creating new nodes with a relationshipNeo4J - 合并语句不创建具有关系的新节点
【发布时间】:2018-11-30 21:12:02
【问题描述】:

我编写了一个查询,如果存在,它会构建 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,他住在 (rel) 班加罗尔(节点)。


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

谁能解释一下?

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

Can't find anything on this tho

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    原因:

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

    想法:

    正如@logisima 已经在 answer 的 cmets 中解释的那样:

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

    解决方案:

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

    【讨论】:

    • 具体节点将由一个关键属性标识,在您的情况下可能是:name。此外,您不需要 type,因为它已经在标签中。
    猜你喜欢
    • 2020-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-27
    • 1970-01-01
    相关资源
    最近更新 更多