neo4j - Neo4j 删除、更新多个节点和连接
问题描述
我在 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”并与他一起执行以下步骤:
- 中断(删除)用户“Helmut”的连接“livesInCity”、“livesInCountry”、“isFriendsWith”
- 其他用户,例如“Doe”,具有通过“ORIGIN”连接与其他节点连接的节点。这意味着该节点是来自另一个节点的共享。在我的示例中,用户“Doe”节点 1 和 2 是“Helmut”节点的共享。与来自用户“Helmut”的绿色节点(通过 FEED_ITEMS 或 NEXT 连接)具有“ORIGIN”连接的所有节点都需要具有“已删除”状态 - 这只是一个表示“已删除”的字符串。
- 删除来自用户“Helmut”的所有 feed_items 和下一个节点
- 删除用户“Helmut”节点。
我对 neo4j 很陌生,所以我想知道这是否可以在单个查询中实现,或者需要单独处理。
我希望在某些时候会有很多带有“ORIGIN”连接的节点。源连接意味着这是一个源共享。我想知道设置许多状态为“已删除”的节点的速度意味着什么。我需要在单独的调用中执行此操作(例如作为 MQ 进程),或者在表单/url 服务器请求中执行此操作会很好吗?
另外,如果我删除节点“Helmut”而不是国家和城市之间的连接,比如说,这些连接是否会作为幽灵连接保留在那里,或者一旦节点消失,它们就会被删除?
解决方案
由于您不知道已删除用户的帖子中存在多少共享,因此最好对这些帖子进行批量修改,然后进行批量删除。为此,我们可以使用 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 用于同时删除节点和节点本身的关系。
推荐阅读
- css - div溢出父级但不会滚动
- java - 如何在javaFX中不单击按钮从其他类打开弹出窗口?
- python - Django中两个模型之间的ManyToMany关系
- excel - 如何在 Excel 中将 8.991M 和 0.785M 转换为 8.911.000 和 785.000 之类的数字?
- google-apps-script - 从 GDrive 回收站中删除文件
- python - 如何在 aws sagemaker 中提供每日预先计算的预测?
- facebook - 权限错误 Facebook 自定义转换统计
- python - 使用多处理导入外部模块时使用 Django 视图
- swift - 导航栏中的搜索栏行为在 iOS 13 中不一致
- domain-driven-design - 与患者、牙医、治疗和病史的实体和聚合根源混淆