【问题标题】:Deleted node reappears in Neo4j删除的节点重新出现在 Neo4j 中
【发布时间】:2026-02-04 04:20:05
【问题描述】:

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

【问题讨论】:

    标签: neo4j graph-databases


    【解决方案1】:

    你的代码是正确的。

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

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

    【讨论】:

    • 谢谢,我会试试的——不过我遵循了常见问题解答中的建议:wiki.neo4j.org/content/…
    • 好的,FAQ 是错误的,应该是“当前分配的 id 数”。
    • 再次感谢 - 每次使用 graphDb.getAllNodes() 都会返回预期值 1-2-1(尽管它已被弃用!)。
    最近更新 更多