【问题标题】:Neo4j delete, update multiple nodes and connectionsNeo4j 删除、更新多个节点和连接
【发布时间】:2019-01-23 19:11:50
【问题描述】:

我在 Neo4J 中有以下架构:

简短说明:

  • 来自“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”而不是连接,比如说国家和城市之间的连接,这些连接是否会作为幽灵连接保留在那里,或者一旦节点消失,它们就会被删除?

【问题讨论】:

  • 你能改写第 2 步吗?我觉得很不清楚。例如,“Doe”的第一个和第二个节点是什么意思?究竟哪些节点需要具有“删除”状态,是布尔“删除”属性还是字符串“状态”属性,还是...?
  • @cybersam 嘿,请查看我更新的问题。我希望这次我说得够清楚了。谢谢!

标签: neo4j neo4j-ogm


【解决方案1】:

由于您不知道已删除用户的帖子中有多少共享,因此最好先对这些帖子进行批量修改,然后再进行批量删除。为此,我们可以使用 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 用于同时删除节点和节点本身的关系。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多