После создания 128-го узла в индексе neo4j больше нет доступа к узлам - PullRequest
1 голос
/ 19 ноября 2011

Это кажется очень странной проблемой.Я стресс-тестирую свою графическую базу данных 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)), который является вторым узлом, dataService.getUser (BigInteger.valueOf (127)), который является 128-м узлом, и dataService.getUser (BigInteger.valueOf (i-1)), который является последним созданным узлом.И отладчик сообщает мне, что после создания узла 128 узел 129 и выше не создаются, потому что getUser () генерирует исключение DoesNotExistException для этих узлов, но все равно дает значения для узла 2 и узла 128.

Идентификатор пользователя, который я передаю в createUser (), автоматически индексируется.

Есть идеи, почему он не создает больше узлов (или не индексирует эти узлы)?

1 Ответ

2 голосов
/ 19 ноября 2011

Это звучит подозрительно, как преобразование байтового значения, которое меняется на 128. Не могли бы вы убедиться, что в вашем коде ничего подобного не происходит?

...