我使用这个遍历来获取我想要删除的所有节点。我进行遍历,并将节点保持在一个单独的结构中,而不是破坏遍历。然后我遍历单独的结构,删除所有关系,所有附加到节点的关系(这样我就可以安全地删除节点),最后删除所有节点。我没有得到任何异常提出,删除似乎工作。我正确地完成了事务并关闭了数据库。但是当我重新运行代码时,我看到节点和关系仍然存在。我尝试了2个单独的事务,用"delete"属性标记节点和节点,然后在单独的事务中尝试删除它们。似乎什么都不管用。什么好主意吗?
public synchronized void cleanDatabase()
{
Transaction tx = null;
try
{
tx = service.beginTx();
ResourceIterator<Node> restaurants = service.findNodesByLabelAndProperty(DynamicLabel.label("Restaurant"), "name", "restaurant").iterator();//GlobalGraphOperations.at(service).getAllNodesWithLabel(DynamicLabel.label("Restaurant")).iterator();//
Node restaurantNode = null;
Set<Relationship> removableRelations = new HashSet<Relationship>();
Set<Node> removableNodes = new HashSet<Node>();
while(restaurants.hasNext())
{
TraversalDescription td = service.traversalDescription()
.uniqueness( Uniqueness.NODE_GLOBAL)
.breadthFirst()
.relationships(AllRelationshipTypes.hasAgents, Direction.OUTGOING)
.relationships(AllRelationshipTypes.hasClients, Direction.OUTGOING)
//etc
restaurantNode = restaurants.next();
Traverser results = td.traverse( restaurantNode );
ResourceIterator<Node> nodeIt = results.nodes().iterator();
int nodeCount = 0;
while(nodeIt.hasNext())
{
nodeCount++;
Node node = nodeIt.next();
removableNodes.add(node);
Iterator<Relationship> relIt = node.getRelationships().iterator();
while(relIt.hasNext())
{
Relationship rel = relIt.next();
removableRelations.add(rel);
}
}
System.out.println("have found "+nodeCount);
}
//System.out.println(uniqueRels.toString());
for(Relationship removableRel:removableRelations){
//removableRel.setProperty("delete", true);
removableRel.delete();
//System.out.println(removableRel.toString());
}
int otherNodeCount = 0;
for(Node remNode:removableNodes){
Iterator<Relationship> relsAttached = remNode.getRelationships().iterator();
while(relsAttached.hasNext())
{
Relationship relAttach = relsAttached.next();
//relAttach.setProperty("delete", true);
relAttach.delete();
}
//remNode.setProperty("delete", true);
remNode.delete();
System.out.println(remNode.getLabels().toString());
otherNodeCount++;
}
System.out.println(otherNodeCount+" other node count");
System.out.println("done");
tx.success();
System.out.println("success");
}
catch(Exception e)
{
System.out.println("exception");
System.out.println(e.getMessage());
tx.failure();
}
}
似乎您没有调用tx.finish()
或tx.close()
,也没有使用尝试使用资源(在新版本中自动调用close()
)。
您使用的是neo4j的哪个版本?
如果它有close()
方法,无论事务是否失败,您都必须在finally中调用它。
如果它没有close()
方法,那么你必须调用finish()
。两者应该做同样的事情。
问题在于,当您使用try-with-resources (Java 7+)来创建事务时,它实现了java.lang.AutoCloseable
,因此您不需要close()
方法。