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

时间:2014-04-23 13:24:05

标签: neo4j graph-traversal

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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();
        }