【问题标题】:Delete the previous node and relationship and point it to the current node with same relationship删除前一个节点和关系,指向当前具有相同关系的节点
【发布时间】:2021-03-22 11:48:50
【问题描述】:

我正在尝试建立一种父母和孩子的关系。

MERGE (c:Child{name:'CA'})
MERGE (p:Parent{name:'Parent'})

为了建立关系,

MERGE (p)-[:parent_of]->(c)

这个查询是在一个名为createParentChildRelationship 的独立java 函数中编写的。 每当我尝试使用相同的父名称和不同的子名称调用此函数时,将参数传递给函数,它就会形成一个新的关系。但我只需要当前子节点来指向父节点,通过删除以前的子节点及其与父节点的关系。 所以我尝试了这种接近它的方式,

MERGE (c:Child{name:'CA'})
MERGE (p:Parent{name:'Parent'})
MATCH (c)-[r:parent_of]-(p) DELETE r, c, p
CREATE (p)-[:parent_of]->(c) 

但它向我显示 1 property is set 但未创建关系

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    您的查询有两个问题:

    1. 您正在删除父级、子级和关系。如果您刚刚删除了父级,则无法创建与新子级的新关系。此外,您正在删除您刚刚创建的孩子,而不是父母的当前孩子,因此也需要修复。

    2. 如果 MATCH 失败,则没有要执行的行,查询中不会发生任何其他事情。您可能需要一个 OPTIONAL MATCH 代替,或者可能需要一个模式理解。

    你可以试试这个:

    MERGE (p:Parent {name:'Parent'})
    WITH p, [(p)-[:parent_of]->(existing) | existing] as existingChildren
    FOREACH (child IN existingChildren | DETACH DELETE child)
    MERGE (c:Child {name:'CA'})
    CREATE (p)-[:parent_of]->(c)
    

    【讨论】:

    • 不删除之前的关系和节点
    • 应该的。模式理解获取所有现有子节点,FOREACH 对每个子节点执行 DETACH DELETE(这也删除了这些节点上的任何关系)。然后新节点被合并并附加。请记住,如果有多个节点具有相同的 name 属性,则 MERGE 将匹配所有节点并附加它们。
    【解决方案2】:

    试试这个,它适用于我的 neo4j 桌面;

    1. 查找 CA 和父级之间的关系(可选,因为如果找不到匹配项,它将继续查询)
    2. 删除关系
    3. 找到该父级并在未找到时创建 (MERGE)
    4. 使用子节点和父节点,创建新关系
    OPTIONAL MATCH (c:Child)-[r:parent_of]-(:Parent{name:'Parent'})
    DELETE r
    MERGE (p2:Parent{name:'Parent'})
    MERGE (p2)-[r2:parent_of]->(c2:Child{name:'CA'})
    RETURN c2, r2, p2
    

    您不能删除 c 和 p,因为它仍然是创建期间查询的一部分。

    【讨论】:

      猜你喜欢
      • 2013-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多