我是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);
}
答案 0 :(得分:2)
在迭代结果集的同时执行查询。因此每次调用hasNext / next都会对图形进行一些操作。然而,停止50秒,图表关闭〜250k节点表明你做了一些基本上错误的事情。
您可以查看:
您的查询效率非常低,您应该使用索引。最简单的方法是为您要搜索的属性设置自动索引,请参阅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语法中进行额外引用。
确保您没有使用例如gc /内存问题jvisualvm
根据http://docs.neo4j.org/chunked/stable/configuration-caches.html设置映射内存并多次运行您的查询以从预热缓存中受益。