如何在Neo4j中删除节点及其所有关系以及与之相连的节点

4
我想要删除Neo4j数据库中特殊的“root”节点。
我已经在SO上找到了一些问题/答案,但它们由于不同的原因并不有用。
我们使用一个db:DATABASE节点来存储Neo4j中的租户数据,所有其他节点都与此节点有某种连接。因此,真正的Neo4j根节点仅与这些DATABASE-s连接。这意味着当在租户下创建新节点时,此新节点立即与DATABASE节点建立连接,连接名称为CONTAINS。
以下是DATABASE节点的创建代码:
      CREATE (db:Database { Name: 'TenantName' } ) " )

我想删除整个租户,也就是删除整个数据库以及连接到数据库节点的所有节点。

如果使用这个简单的Cypher语句删除节点,该节点将被删除,但是所有连接的节点仍将保留在数据库中。

      MATCH (db:Database)
      WHERE db.Name = 'TeanantName'
      DETACH DELETE db

挑战在于:我们不知道DATABASE节点下的任何节点名称或连接。
已回答的SO问题:
  1. 如何使用Neo4j Cypher查询删除节点及其连接的所有节点? 在这个答案中,我们知道关系的名称“ACTED_IN”,并且假设我们只有与要删除的节点相连的这个关系。
  2. Neo4j:如何删除节点以及节点之外的所有节点和关系? 在这种情况下,我们知道真实的节点结构,但在我们的情况下,我们不知道。
  3. Cypher删除节点以及所有相关节点的列表 这假定路径中的每个节点除了路径中的节点外,不再与任何东西相关联,否则它们将无法被移除。这在我们的情况下是不正确的。
  4. Neo4j如何从某个起始节点递归地删除节点 在这种情况下,整个图结构是已知的。

谢谢大家!

您的描述有些混乱,我无法确定:DATABSE节点是根节点还是根节点连接到:DATABSE节点,或者如何区分租户,以便我们不会误删它们。您能否提供一个图表或输出来说明您所说的内容? - InverseFalcon
抱歉,我修改了问题。 - György Gulyás
1个回答

4

好的,这应该是一个简单的问题。

假设要删除租户的:Database节点以及从该节点可达的所有节点,而不考虑它们之间的节点标签或关系类型,则最快的方法是使用来自APOC Procedures的路径扩展程序来匹配子图中的所有节点并删除它们:

MATCH (db:Database)
WHERE db.Name = 'TenantName'
CALL apoc.path.subgraphNodes(db, {}) YIELD node
DETACH DELETE node

如果需要删除的节点数量较大(>10k),则可以使用apoc.periodic.iterate()进行批量删除。它可以帮助您更有效地处理删除操作。请参考apoc.periodic.iterate()了解更多信息。
CALL apoc.periodic.iterate("
 MATCH (db:Database)
 WHERE db.Name = 'TenantName'
 CALL apoc.path.subgraphNodes(db, {}) YIELD node
 RETURN node",
 "DETACH DELETE node",
 {}) YIELD total, batches, errorMessages
RETURN total, batches, errorMessages

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接