2011-12-02 30 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