使用Cypher批量更新Neo4J中的关系(删除和创建关系)

33qvvth1  于 2023-05-17  发布在  其他
关注(0)|答案(1)|浏览(222)

我正在尝试批量更新两组节点之间的关系列表。
在这个过程中,一些关系将被删除,一些将被保留,而另一些将被创建。
这是一个示例数据结构(左表示之前,右表示之后)

要在一个查询中实现这一点,这是我找到的算法

1. MATCH (f:Foo)-[r]-(Bar) WHERE id(f)=1
 2. SET r.delete = true
 3. UNWIND [2, 3, 4] as $node_id
 4.   MERGE (f)-[r2]-(b:Bar) WHERE id(b)=$node_id
 5.   SET r2.delete = false
 6. MATCH (Foo)-[r3:{delete: true}]-()
 7. DELETE r3

有没有更简单/有效的方法来做到这一点?(我需要在一次传递中从单个Foo节点中为多个关系执行此操作,这会导致一些非常庞大的查询)。我在apoc库中搜索了这个函数,但没有找到一个函数来做这个。

ttcibm8c

ttcibm8c1#

您不需要伪delete属性。假设您将f的本地ID和所需Bar节点的ID列表作为parameters$fId$barIds传递,您可以执行以下操作:

MATCH (f:Foo) WHERE ID(f) = $fId
FOREACH(r IN [(f)-[rel:X]->(:Bar)|rel] |
  DELETE r
)
WITH f
MATCH (b:Bar) WHERE ID(b) IN $barIds
MERGE (f)-[:X]->(b)

注意,关系的MERGE需要一个关系类型,所以我随意使用了X作为类型。

相关问题