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

时间:2018-12-09 12:52:23

标签: neo4j cypher

我想删除Neo4j数据库中特殊的“根”节点。

我已经在SO中找到了一些问题/答案,但是由于不同的原因,它们没有用。

我们使用db:DATABASE节点将租户数据存储在Neo4j中,所有其他节点都以某种方式连接到该节点。因此,真正的Neo4j根节点仅具有与此数据库的连接。这意味着在租户下创建了一个新节点,该新节点中间与DATABASE节点具有连接,并且连接名称为CON​​TAINS。

这是DATABASE节点的创建代码

      CREATE (db:Database { Name: 'TenantName' } ) " )

我想删除整个租户,这意味着我想删除整个DATABASE,以及连接到DATABASE节点的所有节点。

如果使用此简单密码删除节点,则会删除该节点,但所有连接的节点仍保留在数据库中。

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

挑战在于:我们不知道任何节点名称或DATABASE节点下的任何连接。


已经回答过以下问题:

  1. How to delete a node and its connected nodes with Neo4j cypher query?在此答案中,我们知道关系的名称。 “ ACTED_IN”,并假定我们只有与已删除节点的此连接。
  2. Neo4j: How to delete all nodes and relationships beyond a node?在这种情况下,我们知道真实的节点结构,但是在我们的情况下我们不知道。
  3. cypher delete node and all the list of related node这假定路径中的每个节点不再锚定到路径中的节点以外的任何其他对象,否则它们将无法删除。在我们的情况下,这是不正确的。
  4. Neo4j how to delete nodes recursively from some start node在这种情况下,整个图结构是已知的。

谢谢你们!

1 个答案:

答案 0 :(得分:2)

好的,这应该很简单。

提供了要删除租户的:Database节点及其中所有可访问节点的方法,而无需考虑连接它们的节点标签或关系类型,最快的方法是使用path expander procs from APOC Procedures来匹配所有节点子图中的节点并将其删除:

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

如果要删除的节点数量很大(> 10k左右),则可能要使用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
相关问题