簡體   English   中英

遍歷圖形時無法刪除節點-Neo4j Java Embedded API

[英]Unable to delete nodes while traversing the graph - neo4j java embedded api

我正在使用這種遍歷來獲取所有要刪除的節點。 我進行遍歷,並將節點保持在單獨的結構中,以免破壞遍歷。 然后,我遍歷單獨的結構,刪除所有關系,將所有關系附加到節點(這樣我就可以安全地刪除節點),最后是所有節點。 我沒有提出任何例外,刪除似乎有效。 我正確完成了事務並關閉了數據庫。 但是當我重新運行代碼時,我看到節點和關系仍然存在。 我嘗試了2個單獨的事務,使用“ delete”屬性標記節點和rel,然后在單獨的事務中嘗試刪除它們。 似乎沒有任何作用。 有任何想法嗎?

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() ,也沒有在使用try-with-resources(在較新的版本中會自動調用close() )。

您正在使用什么版本的neo4j?

如果它具有close()方法,則無論事務是否失敗,都必須在finally中調用它。

如果沒有close()方法,則必須調用finish() 兩者都應該做同樣的事情。

但是要注意的是,當您使用try-with-resources (Java 7+)創建事務時,它實現了java.lang.AutoCloseable ,因此您不需要close()方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM