Neo4j ExecutionEngine не возвращает действительные результаты

1

Попытка использовать аналогичный пример из приведенного здесь кода примера

Моя функция выбора:

void query()

{
    String nodeResult = "";
    String rows = "";
    String resultString;
    String columnsString;

    System.out.println("In query");
    // START SNIPPET: execute
    ExecutionEngine engine = new ExecutionEngine( graphDb );

    ExecutionResult result;
    try ( Transaction ignored = graphDb.beginTx() )
    {
        result = engine.execute( "start n=node(*) where n.Name =~ '.*79.*' return n, n.Name" );
        // END SNIPPET: execute
        // START SNIPPET: items
        Iterator<Node> n_column = result.columnAs( "n" );
        for ( Node node : IteratorUtil.asIterable( n_column ) )
        {
            // note: we're grabbing the name property from the node,
            // not from the n.name in this case.
            nodeResult = node + ": " + node.getProperty( "Name" );
            System.out.println("In for loop");
            System.out.println(nodeResult);

        }
        // END SNIPPET: items



        // START SNIPPET: columns
        List<String> columns = result.columns();
        // END SNIPPET: columns

        // the result is now empty, get a new one
        result = engine.execute( "start n=node(*) where n.Name =~ '.*79.*' return n, n.Name" );
        // START SNIPPET: rows
        for ( Map<String, Object> row : result )
        {
            for ( Entry<String, Object> column : row.entrySet() )
            {
                rows += column.getKey() + ": " + column.getValue() + "; ";
                System.out.println("nested");
            }
            rows += "\n";
        }
        // END SNIPPET: rows
        resultString = engine.execute( "start n=node(*) where n.Name =~ '.*79.*' return n.Name"  ).dumpToString();
        columnsString = columns.toString();
        System.out.println(rows);
        System.out.println(resultString);
        System.out.println(columnsString);

        System.out.println("leaving");

    }

}

Когда я запускаю это в веб-консоли, я получаю много результатов (так как есть несколько узлов, у которых есть атрибут Name, который содержит шаблон 79. Однако запуск этого кода не возвращает никаких результатов. Отладочные операторы печати "в цикле" и "вложенные", никогда не печатайте. Таким образом, это должно означать, что в Итераторе результатов нет, но это не имеет смысла.

И да, я уже проверил и убедился, что переменная graphDb такая же, как и путь к веб-консоли. У меня есть другой код раньше, который использует одну и ту же переменную для записи в базу данных.

EDIT - Дополнительная информация Если я помещаю содержимое запроса в ту же функцию, которая создает мои данные, я получаю правильные результаты. Если я запускаю запрос сам по себе, он ничего не возвращает. Это почти так, как запрос работает только в том экземпляре, где я добавляю данные, а не в том случае, если я возвращаюсь к базе данных в отдельном экземпляре.

EDIT2 -

Вот фрагмент кода, который показывает больший контекст того, как он называется, и совместного использования того же DBHandle

package ContextEngine;

import ContextEngine.NeoHandle;
import java.util.LinkedList;


/*
 * Class to handle streaming data from any coded source
 */
public class Streamer {

    private NeoHandle myHandle;

    private String contextType;

    Streamer()
    {

    }


    public void openStream(String contextType)
    {

        myHandle = new NeoHandle();
        myHandle.createDb();
    }

    public void streamInput(String dataLine)
    {
        Context context = new Context();
        /*
         * get database instance
         * write to database
         * check for errors
         * report errors & success
         */
        System.out.println(dataLine);

        //apply rules to data (make ContextRules do this, send type and string of data)
        ContextRules contextRules = new ContextRules();
        context = contextRules.processContextRules("Calls", dataLine);

        //write data (using linked list from contextRules)
        NeoProcessor processor = new NeoProcessor(myHandle);
        processor.processContextData(context);
    }

    public void runQuery()
    {
        NeoProcessor processor = new NeoProcessor(myHandle);
        processor.query();

    }

    public void closeStream()
    {
        /*
         * close database instance
         */
        myHandle.shutDown();
    }

}

Теперь, если я вызываю streamInput И запрос в том же экземпляре (родительские вызовы), запрос возвращает результаты. Если я вызываю только запрос и не вводя никаких данных в этот экземпляр (пока веб-консоль показывает данные для одного запроса), я ничего не получаю. Почему мне нужно создавать узлы и вводить их в базу данных во время выполнения, чтобы вернуть действительный запрос. Должен ли я ВСЕГДА получать одинаковые результаты с таким запросом?

  • 0
    Возможно, вы можете поделиться примером проекта на GitHub, который демонстрирует это неправильное поведение, например. в модульном тесте?
  • 0
    Я сделаю это. Позвольте мне сначала попробовать вариант ниже, затем очистить некоторые не-neo4j вещи (специальный соус для моего приложения), проверить проблему существует и затем опубликовать. Должно помочь всем нам, и я обязан вам, ребята, полным примером с помощью, которую вы оказали.
Показать ещё 1 комментарий
Теги:
neo4j

1 ответ

3
Лучший ответ

Вы упоминаете, что используете браузер Neo4j, который поставляется с Neo4j. Однако приведенный вами пример относится к Neo4j Embedded, который является in-process версией Neo4j. Вы уверены, что разговариваете с одной и той же базой данных при попытке запроса в браузере?

Чтобы поговорить с Neo4j Server с Java, я бы рекомендовал посмотреть драйвер Neo4j JDBC, который имеет хорошую поддержку для подключения к серверу Neo4j с Java.

http://www.neo4j.org/develop/tools/jdbc

Вы можете настроить простое соединение, добавив банку JDBC Neo4j в свой путь к классам, доступный здесь: https://github.com/neo4j-contrib/neo4j-jdbc/releases. Тогда просто используйте Neo4j как любой драйвер JDBC:

Connection conn = DriverManager.getConnection("jdbc:neo4j://localhost:7474/");
ResultSet rs = conn.executeQuery("start n=node({id}) return id(n) as id", map("id", id));

while(rs.next()) {
    System.out.println(rs.getLong("id"));
}

Обратитесь к документации JDBC для более широкого использования.

Чтобы ответить на ваш вопрос о том, почему данные не хранятся долгое время, это может быть одной из многих причин. Я попытался бы постепенно уменьшить сложность кода, чтобы попытаться найти виновника. Например, пока вы не нашли свою проблему, выполните следующие действия:

  1. Вместо того, чтобы перебирать результат, распечатайте его с помощью System.out.println(result.dumpToString());

  2. Вместо запроса регулярного выражения попробуйте просто MATCH (n) RETURN n, чтобы вернуть все данные в базу данных

  3. Убедитесь, что данные, которые вы видите в браузере, не являются "старыми" данными, вставленными ранее, но на самом деле это вставка из вашего последнего запуска программы Java. Вы можете проверить это, удалив данные через браузер перед запуском программы Java, используя MATCH (n) OPTIONAL MATCH (n) - [r] ->() DELETE n, r;

  4. Убедитесь, что вы фактически работаете с одними и теми же каталогами баз данных. Вы можете проверить это, оставив сервер работать. Если вы все еще можете запустить свою java-программу, если ваша Java-программа не использует привязки REST Neo4j, вы не используете один и тот же каталог. Две базы данных Neo4j не могут работать одновременно с одним и тем же каталогом баз данных.

  • 0
    Данные принимаются. Если я иду к консоли, я вижу данные. Я также добавил больше кода, показывающего, как я использую одну и ту же базу данных каждый раз.
  • 0
    Имейте в виду, что query () - это отдельная функция в классе NeoProcessor, но с той же ссылкой NeoHandle. Этот вызов выполняется после транзакции для фиксации данных в базе данных. Если я закомментирую вызов streamInput в ссылочном методе, запрос ничего не даст. Если я вызываю этот метод, запрос возвращает данные. Каждый вызов processContextData имеет свою собственную транзакцию. Я тоже могу опубликовать это, если вам нужно это увидеть.
Показать ещё 14 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню