首页 文章

如何使用Cypher从单个节点上删除数百万个关系

提问于
浏览
1

我在Neo4j中创建了一个大图,并且有一个空节点,通过我需要删除的图中的1,100万个关系连接 . 我知道,如果我只是删除节点,我会留下所有挂起的关系,但我试图删除它们是不成功的 . 我尝试了以下CYPHER命令,但它们挂起并且无法完成:

MATCH (n:Label {uid: ''}) DETACH DELETE n;

MATCH (n:Label {uid: ''})-[r]-() DELETE r;

我的工作是假设没有足够的资源在内存中加载1100万关系子图,以便分离和删除节点 . 有没有办法循环关系以降低所需的系统资源?

2 回答

  • 1

    您可以批量删除关系,然后删除节点

    MATCH (n:Label {uid: ''})-[r]-() 
    WITH r
    LIMIT 1000
    DELETE r;
    

    如果您连续运行,则会以小批量删除关系 . 玩限制金额,以查看您的运行系统将容忍资源明智 .

  • 2

    1)您可以使用apoc库中的apoc.periodic.commit函数:

    call apoc.periodic.commit(
      'MATCH (n:Label {uid: {uid}})-[r]->() 
       WITH r LIMIT {limit}
       DELETE r 
       RETURN COUNT(r)', {
         limit: 1000,
         uid: ...
    })
    

    2)您可以删除节点,然后使用apoc.create.node函数再次创建它:

    MATCH (n:Label {uid: 2})
    WITH n, {labels: labels(n), properties: properties(n)} AS data
    DETACH DELETE n
    WITH data
    CALL apoc.create.node(data.labels, data.properties) yield node AS newNode
    RETURN newNode
    

相关问题