ExecutionResult result.hasNext()需要很长时间才能返回

时间:2013-03-01 23:01:48

标签: neo4j cypher

我是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(查询)返回时完成的,但如果不是这种情况,那么会感谢有人在查询实际完成时有所了解。提前谢谢。

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

1 个答案:

答案 0 :(得分:2)

在迭代结果集的同时执行查询。因此每次调用hasNext / next都会对图形进行一些操作。然而,停止50秒,图表关闭〜250k节点表明你做了一些基本上错误的事情。

您可以查看:

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

    重建数据库后,请使用以下cypher语句:

    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. 确保您没有使用例如gc /内存问题jvisualvm

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