2013-03-01 153 views
0

我对Neo4j相当陌生。尝试遍历ExecutionResult结果集时,我遇到了一个特殊的错误。在下面的代码片段中,最后一个res.hasNext()需要接近50秒才能返回上一次迭代。ExecutionResult result.hasNext()花费很长时间返回

我使用的暗号查询

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

我使用的Neo4j社区-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

请发布您正在使用的密码查询。 – 2013-03-02 14:14:18

+0

对不起,只是。 – 2013-03-02 15:02:55

回答

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) 
    

    我不知道,如果“过程workflowID”需要更多的Lucene的语法引用。

  2. 确保您没有受到使用例如gc/memory问题的困扰。 jvisualvm

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

+0

非常有帮助的解释!你能否解释更多关于“预先存在的数据没有被重新编制索引”的含义?这是否意味着我必须首先设置索引,并重新获取我的数据?谢谢一堆! – 2013-03-03 00:50:31

+0

。对自动索引设置的更改不会更改当前索引内容,它们只是在每次更改配置数据时更新索引。 – 2013-03-03 11:23:50