无法在遍历图时删除节点- neo4j java嵌入式api



我使用这个遍历来获取我想要删除的所有节点。我进行遍历,并将节点保持在一个单独的结构中,而不是破坏遍历。然后我遍历单独的结构,删除所有关系,所有附加到节点的关系(这样我就可以安全地删除节点),最后删除所有节点。我没有得到任何异常提出,删除似乎工作。我正确地完成了事务并关闭了数据库。但是当我重新运行代码时,我看到节点和关系仍然存在。我尝试了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()方法。

最新更新