2017-12-03 10 views
1

低密度(平均接続< 5)の5000ノードのかなり小さなグラフで作業すると、neo4j 3.3.0にアップグレードする前に私が決して得なかった以下のエラーが発生します。このグラフには、900分子とその足場階層が含まれています(5レベルまで)。クエリで結果が返されない場合、CYPHERクエリの "DISTINCT"がメモリエラーの原因になりますか?

(:Molecule)<-[:substructureOf*1..5]-(:Scaffold) 

Neo.TransientError.General.StackOverFlowError 
There is not enough stack size to perform the current task. This is generally considered to be a database error, so please contact Neo4j support. You could try increasing the stack size: for example to set the stack size to 2M, add `dbms.jvm.additional=-Xss2M' to in the neo4j configuration (normally in 'conf/neo4j.conf' or, if you are using Neo4j Desktop, found through the user interface) or if you are running an embedded installation just add -Xss2M as command line flag. 

クエリは実際には非常に簡単です。いくつかのパスが単一の足場につながる可能性があるため、クエリは実際には非常に簡単です。

match (m:Molecule) <-[:substructureOf*3]- (s:Scaffold) return distinct s limit 20 

このクエリは上記のエラーメッセージを返しますが、次のクエリは機能します。

match (m:Molecule) <-[:substructureOf*3]- (s:Scaffold) return s limit 20 

興味深いことに、クエリが最も深い階層のため最後の問い合わせの結果が「いいえ変更、レコードなし)」ではありません2であることを起こっこの小さなもので、非常に大きなデータベース上で動作します。

クエリにDISTINCTを追加すると、そのメモリエラーでどのように失敗しますか?それを避ける方法はありますか?分子ごとに異なる階層の深さを推測することができないからです。

私は次の値を他の投稿に示唆したように試しました。これらの #dbms.memory.heap.initial_size = 512メートル #dbms.memory.heap.max_size = 512メートル

dbms.memory.heap.initial_size=512m 
dbms.memory.heap.max_size=4096m 

dbms.memory.heap.initial_size=4096m 
dbms.memory.heap.max_size=4096m 

どれも問題に対処していません。 ご協力いただきありがとうございます。

+0

バグのような感じです。まだ3.3.1でテストしましたか? – InverseFalcon

+0

また、クエリに 'CYPHER 3.2'を追加するとどうなりますか? – InverseFalcon

+0

私は3.3.1で試したことはありませんが、私は同じ問題を3.2.6としました。私は3.3.1で試してみます。 – Pierre

答えて

0

これはNeo4j 3.3.0と3.3.1で再現できました。これは、プルーニング-var-expand操作の動作と関連している可能性があります。 3.2.xで導入された可変長の拡張と別個の結果を使用して)、拡張の正確な数(範囲ではない)を使用する場合のみです。 Neo4jのエンジニアがこれを検討しています。

一方、この操作を避ける必要がある結果を得るために、異なる種類のクエリを使用できるようにするという要件があります。

match (s:Scaffold) 
where (s)-[:substructureOf*3]->(:Molecule) 
return distinct s limit 20 

そして、あなたは、このエラーを生成することがクエリを実行する必要がない場合、あなたは生産計画でこれを実行するであろう、CYPHER 3.1でクエリを付加することで、それらを回避することができる場合があります。この1を試して与えてみてください刈り込みvar展開操作を使用しない古いバージョンのCypherによって実行されます。

関連する問題