0

我对 Neo4j 相当陌生。尝试迭代 ExecutionResult 结果集时遇到一个特殊错误。在以下代码片段中,最后一个 res.hasNext() 需要近 50 秒才能在最后一次迭代中返回。

我正在使用的密码查询是

start p=node(*) where (p.`process-workflowID`? = '" + Id + "') and (p.type? = 'process') return ID(p);

我正在使用 neo4j-community-1.8.1 和 java 1.6.0_41,针对具有 226710 个节点的数据库进行测试。

有没有人知道为什么会这样?我假设查询在 engine.execute(query) 返回时完成,但如果不是这种情况,将不胜感激有人在查询实际完成时有所了解。先感谢您。

ExecutionResult result = engine.execute(query);
Iterator<Map<String, Object>> res =  result.iterator();
while(res.hasNext()) {
   Map<String, Object> row = res.next();
   for(Entry<String, Object> column : row.entrySet()){
                ...
   }
   long t1 = System.currentTimeMillis();
   res.hasNext(); // <--------------------------- statement in question
   long t2 = System.currentTimeMillis();
   System.out.println(t2-t1);
}
4

1 回答 1

2

在迭代结果集时执行查询。所以每次调用 hasNext/next 都会涉及到图上的一些操作。然而,50 秒的停顿和大约 250k 个节点的图表表明你做的事情基本上是错误的。

你可能会调查:

  1. 您的查询效率非常低,您应该使用索引。最简单的方法是为您正在搜索的属性设置自动索引,请参阅http://docs.neo4j.org/chunked/stable/auto-indexing.html。请注意,预先存在的数据不会被重新索引!

    重建数据库后,请改用以下密码语句:

    Map<String,Object> = Collections.singletonMap("id", Id);
    executionEngine.execute("start p=node:node_auto_index('process-workflowID:{id} type:process') return ID(p)", params)
    

    我不确定“process-workflowID”是否需要在 lucene 语法中额外引用。

  2. 使用 jvisualvm 确保您没有遇到 gc/内存问题

  3. 根据http://docs.neo4j.org/chunked/stable/configuration-caches.html设置映射内存并多次运行您的查询以从预热缓存中受益。

于 2013-03-02T21:53:47.950 回答