已删除的节点重新出现在Neo4j中

时间:2011-12-02 16:50:46

标签: neo4j graph-databases

我刚刚开始使用Neo4j并运行“Hello World”类型示例。

我创建一个新数据库并打印出节点数,即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

1 个答案:

答案 0 :(得分:2)

您的代码是正确的。

但是getNumberOfIdsInUse()不是节点(或关系)的数量,而是分配的id的数量,它们之间可能有未使用的间隔。 Id重用不会自动发生,但必须启用。

如果仍然报告错误的数字,您是否可以尝试使用graphDb.getAllNodes()计算节点并递增计数器?