图遍历-#Neo4j使用java API遍历时删除节点/关系



我需要遍历所有节点,并根据某些标准删除所有节点(及其关系和连接的节点)。出于测试目的(为了确保我可以在遍历时删除节点),我试图只删除遍历中间的一个节点,并使用另一个遍历来删除所有节点和附加到该节点的关系。我可以删除所有的节点和关系,但在那之后,当循环回到第一次遍历时,我会得到IllegalStateException(节点已被删除)。是否可以在遍历时删除节点/关系?如果是这样的话,遍历所有节点并删除一些节点的有效方法是什么。提前感谢!

private void traverseGivenNode(Node node, TraversalDescription friendsTraversal) {
    for ( Node currentNode : friendsTraversal.traverse(node).nodes() )
    {
        if (currentNode.getProperty("name").equals("AAA")) {
            deleteNodeAndItsConnections(currentNode);
        } 
    }       
}
private void deleteNodeAndItsConnections(Node currentNode) {
    TraversalDescription traversal = graphDb.traversalDescription()
            .breadthFirst()
            .uniqueness( Uniqueness.NODE_PATH ).evaluator(Evaluators.excludeStartPosition() ).relationships( RelTypes.KNOWS, Direction.OUTGOING );

    for ( Node node : traversal.traverse(currentNode).nodes() )
    {
        deleteNode(node);
    }
    deleteNode(currentNode);
}
private void deleteNode(Node node) {
    Iterable<Relationship> allRelationships = node.getRelationships();
    for (Relationship relationship : allRelationships) {
        relationship.delete();
    }
    node.delete();
}

解决此问题的一种方法是在遍历完成之前不删除任何内容。相反,在遍历过程中,只需将要删除的每个节点和关系添加到相应的HashSet中。然后,对关系集中的所有内容调用Relationship.delete(),然后对Node集中的所有对象调用Node.delete)。

为要添加和删除的关系创建集合。

Set<Relationship> removableRelations = new HashSet<Relationship>();
Set<Node> removableNodes = new HashSet<Node>();

在removableRelations和removableNodes 中添加要删除的节点和关系

然后写下面的代码删除这些:

for(Relationship removableRel:removableRelations){
            removableRel.delete();
        }
for(Node remNode:removableNodes){
            remNode.delete();
        }

最新更新