1

这似乎是一个非常奇怪的问题。我正在对我的 neo4j 图形数据库进行压力测试,因此我的一项测试需要创建大量用户(在此特定测试中为 1000)。所以代码如下,

// Creates a n users and measures the time taken to add another
            n = 1000;
            tx = graphDb.beginTx();
            try {
                for(int i = 0; i < n; i++){
                    dataService.createUser(BigInteger.valueOf(i));
                }

                start = System.nanoTime();
                dataService.createUser(BigInteger.valueOf(n));
                end = System.nanoTime();

                time = end - start;

                System.out.println("The time taken for createUser with " + n + " users is " + time +" nanoseconds.");

                tx.success();
            }
            finally
            {
                tx.finish();
            }

dataService.createUser() 的代码是,

public User createUser(BigInteger identifier) throws ExistsException {
        // Verify that user doesn't already exist.
        if (this.nodeIndex.get(UserWrapper.KEY_IDENTIFIER, identifier)
                .getSingle() != null) {
            throw new ExistsException("User with identifier '"
                    + identifier.toString() + "' already exists.");
        }

        // Create new user.
        final Node userNode = graphDb.createNode();
        final User user = new UserWrapper(userNode);
        user.setIdentifier(identifier);

        userParent.getNode().createRelationshipTo(userNode, NodeRelationships.PARENT);

        return user;
    }

现在我需要在创建这些用户后调用 dataService.getUser() 。getUser() 的代码如下,

public User getUser(BigInteger identifier) throws DoesNotExistException {
        // Search for the user.
        Node userNode = this.nodeIndex.get(UserWrapper.KEY_IDENTIFIER,
                identifier).getSingle();
        // Return the wrapped user, if found.
        if (userNode != null) {
            return new UserWrapper(userNode);
        } else {
            throw new DoesNotExistException("User with identifier '"
                    + identifier.toString() + "' was not found.");
        }
    }

所以一切都很顺利,直到我创建了第 129 个用户。我在调试器中跟踪并观察作为第二个节点的 dataService.getUser(BigInteger.valueOf(1)) 的值、作为第 128 个节点的 dataService.getUser(BigInteger.valueOf(127)) 和 dataService 的值。 getUser(BigInteger.valueOf(i-1)) 这是创建的最后一个节点。调试器告诉我,在创建节点 128 后,不会创建节点 129 及更高版本,因为 getUser() 为这些节点抛出了 DoesNotExistException,但仍然为节点 2 和节点 128 提供了值。

我传递给 createUser() 的用户 ID 是自动索引的。

知道为什么它不制作更多节点(或不索引这些节点)吗?

4

1 回答 1

2

这听起来有点像字节值转换,在 128 左右翻转。你能确定你的代码中没有发生类似的事情吗?

于 2011-11-19T10:01:00.337 回答