0

私はNeo4jにかなり慣れていません。ExecutionResultの結果セットを反復処理しようとすると、特有のエラーが発生します。次のコードスニペットでは、最後のres.hasNext()が最後の反復に戻るまでに50秒近くかかります。

私が使用しているcypherクエリは

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

私はneo4j-community-1.8.1とjava1.6.0_41を使用しており、226710ノードのDBに対してテストしています。

なぜこれが起こっているのかについて誰かが何か手がかりを持っていますか?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を呼び出すたびに、グラフ上で何らかの操作が行われます。それにもかかわらず、約25万ノードのグラフで50秒休止すると、基本的に間違ったことをしていることを示します。

あなたは調べるかもしれません:

  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. たとえばjvisualvmを使用して、gc/メモリの問題に悩まされていないことを確認してください

  3. http://docs.neo4j.org/chunked/stable/configuration-caches.htmlに従ってマップトメモリを設定し、クエリを複数回実行して、ウォームアップされたキャッシュを活用します。

于 2013-03-02T21:53:47.950 に答える