Попытка использовать аналогичный пример из приведенного здесь кода примера
Моя функция выбора:
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 И запрос в том же экземпляре (родительские вызовы), запрос возвращает результаты. Если я вызываю только запрос и не вводя никаких данных в этот экземпляр (пока веб-консоль показывает данные для одного запроса), я ничего не получаю. Почему мне нужно создавать узлы и вводить их в базу данных во время выполнения, чтобы вернуть действительный запрос. Должен ли я ВСЕГДА получать одинаковые результаты с таким запросом?
Вы упоминаете, что используете браузер 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 для более широкого использования.
Чтобы ответить на ваш вопрос о том, почему данные не хранятся долгое время, это может быть одной из многих причин. Я попытался бы постепенно уменьшить сложность кода, чтобы попытаться найти виновника. Например, пока вы не нашли свою проблему, выполните следующие действия:
Вместо того, чтобы перебирать результат, распечатайте его с помощью System.out.println(result.dumpToString());
Вместо запроса регулярного выражения попробуйте просто MATCH (n) RETURN n, чтобы вернуть все данные в базу данных
Убедитесь, что данные, которые вы видите в браузере, не являются "старыми" данными, вставленными ранее, но на самом деле это вставка из вашего последнего запуска программы Java. Вы можете проверить это, удалив данные через браузер перед запуском программы Java, используя MATCH (n) OPTIONAL MATCH (n) - [r] ->() DELETE n, r;
Убедитесь, что вы фактически работаете с одними и теми же каталогами баз данных. Вы можете проверить это, оставив сервер работать. Если вы все еще можете запустить свою java-программу, если ваша Java-программа не использует привязки REST Neo4j, вы не используете один и тот же каталог. Две базы данных Neo4j не могут работать одновременно с одним и тем же каталогом баз данных.