Neo4j删除,更新多个节点和连接

时间:2019-01-23 19:11:50

标签: neo4j neo4j-ogm

我在Neo4J中具有以下架构:

enter image description here

简短说明:

  • “ Helmut”中的节点1、2、3(黑色)是供稿。
  • 来自“ Doe”的节点1、2、3、4、5、6(红色)是提要帖子。但是来自“ Doe”的节点1,2是2的份额,然后来自“ Helmut”的1。因此,来自Doe的节点1是来自“ Helmut”的节点2的份额,来自“ Doe”的节点2是来自“ Helmut”的节点1的份额。共享节点通过“ ORIGIN”连接进行连接,因此我可以获得原始节点的隐私属性。

我要删除节点“ 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”,而不是删除国家和城市之间的连接,比如说,国家和城市之间的连接是否仍将保留为幻像连接,或者一旦节点消失,它们将被删除吗?

1 个答案:

答案 0 :(得分:0)

由于您不知道已删除用户的帖子中有多少共享,因此最好对它们进行批量修改,然后再批量删除。我们可以使用从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

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

在同一查询中(在过程调用之后)或在另一个查询中,您都可以对医生进行MATCH和DETACH DELETE删除。

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