Neo4j ExecutionEngine不会返回有效结果

时间:2014-04-01 05:49:42

标签: java neo4j

尝试使用找到的示例代码here

中的类似示例

我的示例功能是:

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");

    }

}

当我在Web控制台中运行时,我得到了很多结果(因为有多个节点具有包含模式79的Name属性。但是运行此代码不会返回任何结果。调试打印语句&#39; in循环&#39;嵌套&#39;从不打印。因此,这必然意味着在迭代器中找不到结果,但这没有意义。

是的,我已经检查并确保graphDb变量与Web控制台的路径相同。我之前有其他代码使用相同的变量写入数据库。

编辑 - 更多信息 如果我将查询内容放在创建数据的同一个函数中,我会得到正确的结果。如果我自己运行查询则不返回任何内容。它几乎与查询仅在我添加数据的实例中有效,而不是在我在单独的实例中冷回数据库时。

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 AND query,则查询返回结果。如果我只调用查询并且不在该实例中输入任何数据(但是Web控制台显示相同查询的数据),我什么也得不到。为什么我必须创建节点并在运行时将它们输入数据库以返回有效查询。我不应该总是通过这样的查询获得相同的结果吗?

1 个答案:

答案 0 :(得分:3)

您提到您正在使用Neo4j附带的Neo4j浏览器。但是,您发布的示例适用于Neo4j Embedded,这是Neo4j的进程内版本。在浏览器中尝试查询时,您确定要与同一数据库通信吗?

为了与Java交谈Neo4j服务器,我建议您查看Neo4j JDBC驱动程序,该驱动程序可以很好地支持从Java连接到Neo4j服务器。

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

您可以通过将Neo4j JDBC jar添加到类路径来设置简单连接,可在此处获取: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程序的插入。您可以通过浏览器删除数据来验证这一点,然后再使用MATCH运行Java程序(n)OPTIONAL MATCH(n) - [r] - &gt;()DELETE n,r;

  4. 确保您实际上正在使用相同的数据库目录。您可以通过让服务器运行来验证这一点。如果您仍然可以启动Java程序,除非您的Java程序使用的是Neo4j REST绑定,否则您不会使用相同的目录。两个Neo4j数据库无法同时针对同一数据库目录运行。