1

これは非常に奇妙な問題のようです。私はneo4jグラフデータベースのストレステストを行っているので、私のテストの1つでは、多数のユーザーを作成する必要があります(この特定のテストでは、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番目のユーザーを作成するまで、すべてが順調に進んでいます。デバッガーをフォローして、2番目のノードであるdataService.getUser(BigInteger.valueOf(1))、128番目のノードであるdataService.getUser(BigInteger.valueOf(127))、およびdataServiceの値を監視しています。最後に作成されたノードであるgetUser(BigInteger.valueOf(i-1))。また、デバッガーは、ノード128が作成された後、getUser()がそれらのノードに対してDoesNotExistExceptionをスローするため、ノード129以上は作成されないが、ノード2とノード128の値を提供することを通知します。

createUser()に渡すユーザーIDは自動インデックス付けされます。

より多くのノードを作成しない(またはこれらのノードにインデックスを付けない)理由はありますか?

4

1 に答える 1

2

疑わしいことに、128で反転するバイト値変換のように聞こえます。コードでそのようなことが起こっていないことを確認できますか?

于 2011-11-19T10:01:00.337 に答える