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