1

我需要遍历所有节点并根据某些标准删除所有节点(及其关系和连接节点)。出于测试目的(以确保我可以在遍历时删除节点),我试图只删除遍历中间的一个节点并使用另一个遍历来删除附加到该节点的所有节点和关系。我能够删除所有节点和关系,但之后当循环返回第一次遍历时,我得到了 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();
}
4

2 回答 2

1

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

于 2014-04-24T02:31:04.180 回答
0

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

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();
        }
于 2014-04-24T04:34:38.610 回答