首页 > 解决方案 > Neo4j 删除、更新多个节点和连接

问题描述

我在 Neo4J 中有以下架构:

在此处输入图像描述

简短的介绍:

我想删除节点“Helmut”并与他一起执行以下步骤:

  1. 中断(删除)用户“Helmut”的连接“livesInCity”、“livesInCountry”、“isFriendsWith”
  2. 其他用户,例如“Doe”,具有通过“ORIGIN”连接与其他节点连接的节点。这意味着该节点是来自另一个节点的共享。在我的示例中,用户“Doe”节点 1 和 2 是“Helmut”节点的共享。与来自用户“Helmut”的绿色节点(通过 FEED_ITEMS 或 NEXT 连接)具有“ORIGIN”连接的所有节点都需要具有“已删除”状态 - 这只是一个表示“已删除”的字符串。
  3. 删除来自用户“Helmut”的所有 feed_items 和下一个节点
  4. 删除用户“Helmut”节点。

我对 neo4j 很陌生,所以我想知道这是否可以在单个查询中实现,或者需要单独处理。

我希望在某些时候会有很多带有“ORIGIN”连接的节点。源连接意味着这是一个源共享。我想知道设置许多状态为“已删除”的节点的速度意味着什么。我需要在单独的调用中执行此操作(例如作为 MQ 进程),或者在表单/url 服务器请求中执行此操作会很好吗?

另外,如果我删除节点“Helmut”而不是国家和城市之间的连接,比如说,这些连接是否会作为幽灵连接保留在那里,或者一旦节点消失,它们就会被删除?

标签: neo4jneo4j-ogm

解决方案


由于您不知道已删除用户的帖子中存在多少共享,因此最好对这些帖子进行批量修改,然后进行批量删除。为此,我们可以使用 APOC 程序中的 apoc.periodic.iterate()。

CALL apoc.periodic.iterate("
MATCH (d:Doctor {name:${nameToDelete})-[:FEED_ITEM]->()-[:NEXT*0..]->(feedItem)
OPTIONAL MATCH (feedItem)<-[:ORIGIN]-(share)
RETURN feedItem, share",
"SET share.status = 'deleted'
 WITH DISTINCT feedItem
 DETACH DELETE feedItem", {}) YIELD batches, total, errorMessages
 RETURN batches, total, errorMessages

这一次使用 10k 个条目的默认 batchSize(从外部查询流式传输,然后将内部查询应用于批处理)

无论是在同一个查询中(在程序调用之后)还是一个单独的查询中,您都可以对医生进行 MATCH 和 DETACH DELETE 删除。

Neo4j 不允许悬空关系,必须删除节点的所有关系才能删除节点,DETACH DELETE 用于同时删除节点和节点本身的关系。


推荐阅读