1

特定の基準に基づいて、すべてのノードをトラバースし、すべてのノード (およびその関係と接続されたノード) を削除する必要があります。テスト目的で (トラバース中にノードを削除できることを確認するため)、トラバースの途中で 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

これを解決する 1 つの方法は、トラバーサルが完了するまで何も削除しないことです。代わりに、トラバーサル中に、削除する各ノードと関係を対応する HashSet に追加するだけです。その後、リレーションシップ Set 内のすべてに対して Relationship.delete() を呼び出し、続いて Node セット内のすべてに対して Node.delete() を呼び出します。

于 2014-04-24T02:31:04.180 に答える