2017-01-27 3 views
0

インデックス付きプロパティの範囲をクエリする際に範囲サイズに最大限の制限はありますか?インデックス付きプロパティの範囲クエリ

明確にするために、私はミリ秒単位のタイムスタンププロパティを持っています。このプロパティはインデックスに登録されており、1か月で発生したすべてのイベントを取得しようとしています。だから私はこの

Match (e:Event)-[R:type{'has metadata'}]-> (S:EventMetaData) where e.type=~".*ELec.*" AND e.timestamp IN RANGE (1480550400000,1483228740000) return S.Location, sum(e.value) as sumV order by sumV DESC 

のようなクエリを持っているが、私はそれはのNeo4jはエラー状態としてサイズendRange-startRangeのコレクションを割り当てようという奇妙なのようなものだ、次のエラー

Exception in thread "main" java.lang.OutOfMemoryError: Cannot index an collection of size 2678340001 
at org.neo4j.cypher.internal.compiler.v3_2.commands.expressions.IndexedInclusiveLongRange.length(IndexedInclusiveLongRange.scala:51) 
at scala.collection.SeqLike$class.size(SeqLike.scala:106) 
at org.neo4j.cypher.internal.compiler.v3_2.commands.expressions.IndexedInclusiveLongRange.size(IndexedInclusiveLongRange.scala:30) 
at scala.collection.mutable.Builder$class.sizeHint(Builder.scala:69) 
at scala.collection.mutable.SetBuilder.sizeHint(SetBuilder.scala:20) 
at scala.collection.TraversableLike$class.to(TraversableLike.scala:589) 
at org.neo4j.cypher.internal.compiler.v3_2.commands.expressions.IndexedInclusiveLongRange.to(IndexedInclusiveLongRange.scala:30) 
at scala.collection.TraversableOnce$class.toSet(TraversableOnce.scala:304) 
at org.neo4j.cypher.internal.compiler.v3_2.commands.expressions.IndexedInclusiveLongRange.toSet(IndexedInclusiveLongRange.scala:30) 
at org.neo4j.cypher.internal.compiler.v3_2.commands.indexQuery$.apply(indexQuery.scala:46) 
at org.neo4j.cypher.internal.compiler.v3_2.pipes.NodeIndexSeekPipe.internalCreateResults(NodeIndexSeekPipe.scala:48) 
at org.neo4j.cypher.internal.compiler.v3_2.pipes.Pipe$class.createResults(Pipe.scala:51) 
at org.neo4j.cypher.internal.compiler.v3_2.pipes.NodeIndexSeekPipe.createResults(NodeIndexSeekPipe.scala:29) 
at org.neo4j.cypher.internal.compiler.v3_2.pipes.PipeWithSource.createResults(Pipe.scala:79) 
at org.neo4j.cypher.internal.compiler.v3_2.pipes.PipeWithSource.createResults(Pipe.scala:79) 
at org.neo4j.cypher.internal.compiler.v3_2.pipes.PipeWithSource.createResults(Pipe.scala:79) 
at org.neo4j.cypher.internal.compiler.v3_2.pipes.PipeWithSource.createResults(Pipe.scala:79) 
at org.neo4j.cypher.internal.compiler.v3_2.pipes.PipeWithSource.createResults(Pipe.scala:79) 
at org.neo4j.cypher.internal.compiler.v3_2.pipes.PipeWithSource.createResults(Pipe.scala:79) 
at org.neo4j.cypher.internal.compiler.v3_2.pipes.PipeWithSource.createResults(Pipe.scala:79) 
at org.neo4j.cypher.internal.compiler.v3_2.executionplan.DefaultExecutionResultBuilderFactory$ExecutionWorkflowBuilder.createResults(DefaultExecutionResultBuilderFactory.scala:95) 
at org.neo4j.cypher.internal.compiler.v3_2.executionplan.DefaultExecutionResultBuilderFactory$ExecutionWorkflowBuilder.build(DefaultExecutionResultBuilderFactory.scala:73) 
at org.neo4j.cypher.internal.compiler.v3_2.BuildInterpretedExecutionPlan$$anonfun$getExecutionPlanFunction$1.apply(BuildInterpretedExecutionPlan.scala:99) 
at org.neo4j.cypher.internal.compiler.v3_2.BuildInterpretedExecutionPlan$$anonfun$getExecutionPlanFunction$1.apply(BuildInterpretedExecutionPlan.scala:83) 
at org.neo4j.cypher.internal.compiler.v3_2.BuildInterpretedExecutionPlan$$anon$1.run(BuildInterpretedExecutionPlan.scala:54) 
at org.neo4j.cypher.internal.compatibility.v3_2.Compatibility$ExecutionPlanWrapper$$anonfun$run$1.apply(Compatibility.scala:96) 
at org.neo4j.cypher.internal.compatibility.v3_2.Compatibility$ExecutionPlanWrapper$$anonfun$run$1.apply(Compatibility.scala:94) 
at org.neo4j.cypher.internal.compatibility.v3_2.exceptionHandler$runSafely$.apply(exceptionHandler.scala:84) 
at org.neo4j.cypher.internal.compatibility.v3_2.Compatibility$ExecutionPlanWrapper.run(Compatibility.scala:94) 

を得ました。タイムスタンプを時間数/日で保存することで回避することができますが、インデックス付きプロパティの範囲クエリのパフォーマンスがneo4jで遅い理由と最大許容範囲サイズが分かっているのはまだ不思議です。

P.S.私はあなたがRANGE以来非常に非効率的な技術(それが働いていた場合でも)の範囲をテストするために、使用しようとしているのNeo4jヒープとページキャッシュのサイズの両方を増加させたが、まだインデックス付きプロパティに範囲クエリでパフォーマンスの低下を持っ

答えて

2

Nが範囲の上限と下限の差である)のコレクションを生成するように定義されており、IN操作は、コレクション内のの各アイテム(最悪の場合)と比較してとなります。

MATCH (e:Event)-[R:type{'has metadata'}]-> (S:EventMetaData) 
WHERE e.type=~".*ELec.*" AND 1480550400000 <= e.timestamp <= 1483228740000 
RETURN S.Location, sum(e.value) AS sumV 
ORDER BY sumV DESC; 
+0

ありがとう:あなたは少しあなたのクエリを変更する必要があり

は、行ごとにわずか2数値比較を作ります!実際には、これは私のクエリの最初のバージョンでした。Rangeを使用する前にクエリで "<" and ">"を使用していました。しかし、要点は、クエリのパフォーマンスにインデックスを付けることの影響を調べようとしており、クエリのチューニングのヒント1に基づくインデックスを使用しないことを意味する ">"と "<"はhttps://neo4j.com/blog/ですneo4j-2-2-query-tuning /そのため、インデックスを使用できるようにするには "Range"に切り替えなければなりませんでした。私は現在、効率的な方法で範囲クエリでインデックスを使用する方法があるかどうか疑問に思っていますか? –

関連する問題