1

我刚刚开始使用 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
4

1 回答 1

2

你的代码是正确的。

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

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

于 2011-12-03T00:23:34.030 回答