2013-03-01 177 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