2011-12-02 73 views
1

我剛剛開始使用Neo4j並運行「Hello World」類型的示例。刪除的節點重新出現在Neo4j中

我創建一個新的數據庫並打印出節點的數量,這是1(因爲在創建數據庫時似乎有一個默認節點)。

我創建一個節點並將其添加到圖形中。該圖報告現在有2個節點 - 確定。

然後我再次刪除節點,圖形報告有1個節點 - 確定。

然後我關閉了數據庫。

但是,當我再次運行相同的代碼(沒有刪除數據庫文件)。它現在報告最初有2個節點。而不是1-2-1,我得到2-3-2。這隻會發生一次 - 第一次運行後它總是報告2-3-2。

爲什麼我的刪除節點重新出現,但只有第一次?下面

代碼:

package com.foo.neo.example; 

import org.neo4j.graphdb.*; 
import org.neo4j.kernel.EmbeddedGraphDatabase; 

public class Deleting 
{ 
    static GraphDatabaseService graphDb; 

    public static void main(String[] args) 
    { 
     graphDb = new EmbeddedGraphDatabase("data"); 
     System.out.println("STARTED"); 

     printNodeCount(); 

     Node firstNode; 

     Transaction tx = graphDb.beginTx(); 
     try 
     { 
      firstNode = graphDb.createNode(); 
      tx.success(); 
     } 
     finally 
     { 
      tx.finish(); 
     } 

     printNodeCount(); 

     // delete the data again 
     tx = graphDb.beginTx(); 
     try 
     { 
      firstNode.delete(); 
      tx.success(); 
     } 
     finally 
     { 
      tx.finish(); 
     } 

     printNodeCount(); 
     graphDb.shutdown(); 
    } 

    private static void printNodeCount() 
    { 
     long nodecount = ((EmbeddedGraphDatabase) graphDb).getConfig() 
       .getGraphDbModule().getNodeManager() 
       .getNumberOfIdsInUse(Node.class); 
     System.out.println("Node count = " + nodecount); 
    } 
} 

輸出:

STARTED 
Node count = 1 
Node count = 2 
Node count = 1 

二(以及隨後的)運行:

STARTED 
Node count = 2 
Node count = 3 
Node count = 2 

回答

2

你的代碼是正確的。

但是getNumberOfIdsInUse()不是節點(或關係)的數量,而是分配的id的數量,它們之間可能有未使用的間隔。 Id重用不會自動發生,但必須啓用。

您是否可以嘗試使用graphDb.getAllNodes()來計算節點並增加計數器,如果它仍然報告錯誤的數字?

+0

謝謝,將嘗試 - 我是在遵循常見問題的建議,雖然:http://wiki.neo4j.org/content/FAQ#How_can_I_get_the_total_number_of_nodes_and_relationships_currently_in_Neo4j.3F – DNA

+0

好的,那裏的常見問題是錯的,應該說,「當前分配的ID號「。 –

+0

再次感謝 - 使用graphDb.getAllNodes()每次都會返回期望值1-2-1(儘管它已被棄用!)。 – DNA