neo4j - 如何删除一个节点和所有关系,以及在 Neo4j 中连接到它的节点

标签 neo4j cypher

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

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

我们使用 db:DATABASE 节点在 Neo4j 中存储租户数据,所有其他节点都以某种方式连接到该节点。所以真正的 Neo4j 根节点只是连接到这个 DATABASE-s。这意味着在租户下创建一个新节点,这个新节点中间有一个到DATABASE节点的连接,连接名称是CONTAINS。

这里是DATABASE节点的创建代码

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

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

如果用这个简单的密码删除节点,节点被删除,但所有连接的节点仍然保留在数据库中。
      MATCH (db:Database)
      WHERE db.Name = 'TeanantName'
      DETACH DELETE db

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

已经回答了 SO 问题:
  • How to delete a node and its connected nodes with Neo4j cypher query?在这个答案中,我们知道关系的名称。 “ACTED_IN”,并假设我们只有与已删除节点的此连接。
  • Neo4j: How to delete all nodes and relationships beyond a node?在这种情况下,我们知道真正的节点结构,但在我们的情况下我们不知道。
  • cypher delete node and all the list of related node这假设路径中的每个节点不再 anchor 定到路径中的节点以外的任何节点,否则它们将无法被移除。在我们的案例中,情况并非如此。
  • Neo4j how to delete nodes recursively from some start node在这种情况下,整个图结构是已知的。


  • 谢谢你们!

    最佳答案

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

    如果要删除租户的: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
    

    关于neo4j - 如何删除一个节点和所有关系,以及在 Neo4j 中连接到它的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53692494/

    相关文章:

    java - 在 Java 的 NEO4J 中按名称选择节点

    neo4j - 升级到 neo4j 2.1 破坏了 Cypher 查询

    node.js - 如何使用 APOC 创建两个 Node 之间的关系,其中 Node 的标签、属性和关系是可变的

    java - 克服 Cypher Lucene 查询上的 NullPointerException

    java - neo4j 慢lucene索引查询

    java - 现在你在 Neo4j 2.0 中创建事务了吗?

    grails - 如何将Javascript变量发送到Grails Controller 以查询Neo4J

    datetime - Neo4j 密码 : set cutofftime (datetime) property of a node

    java - 如何在neo4j中使用cypher查询集合?

    java - Neo4j 中的关系对计数