2016-08-01 12 views
3

GraphAwareの時間ツリーと空間rツリーを設定して、グラフの大きなノードセットを参照できます。私は時間と空間でこれらのレコードを検索しようとしています。個別Neo4jで複数の手続き呼び出しの結果を効率的にフィルタリングするには

私は約5秒でこれらのクエリからの結果を収集することができます:私は、パフォーマンスが大幅に低下し、これらの結果をフィルタ処理しようとすると

WITH 
({start:1300542000000,end:1350543000000}) as tr 
CALL ga.timetree.events.range(tr) YIELD node as n 
RETURN count(n); 
> ~ 500000 results 

WITH 
({lon:120.0,lat:20.0}) as smin, ({lon:122.0,lat:21.0}) as smax 
CALL spatial.bbox('spatial_records', smin, smax) YIELD node as n 
RETURN count(n); 
> ~ 30000 results 

。 Neo4jは既にシステムで大量のメモリを使い果たしているので、このコマンドのメモリフットプリントがシステム上であまりにも多く、クエリが終了しないという印象を受けています。

WITH 
({start:1300542000000,end:1350543000000}) as tr, 
({lon:120.0,lat:20.0}) as smin, ({lon:122.0,lat:21.0}) as smax 

CALL ga.timetree.events.range(tr) YIELD node as n 
CALL spatial.bbox('spatial_records', smin, smax) YIELD node as m 

WITH COLLECT(n) as nn, COLLECT(m) as mm 

RETURN FILTER(x in nn WHERE X in mm); 

(私はこれらのコマンドを実行するのNeo4j-シェルに使用しています)私は、効率的にこれらの二つの文のコールの結果をフィルタリングするための最良の方法は何であるか疑問に思って。私はREDUCE句を使用しようとしましたが、構文を理解できませんでした。

これは、私がデータベースに発行する最も一般的なタイプのクエリであることを考えると、これを行うには良い方法です(時間ツリーとrツリーを使用して、ノード)?私は、neo4jの中で、単一の構造体で空間と時間の両方の索引付けをサポートする他のツールを見つけていないので、これは私の現在の実装です。

答えて

2

最初の手順で500kノードが返され、収集はコストのかかる操作なので、非常にメモリが重くなります。

ここでは、ノードが少なくても、プロシージャではなくcypherを使用することから始めます。ここでは、timetreeプロシージャの呼び出しをCypherのレンジクエリフィルタで置き換えます。 ( - 冗談そう私は<を解雇されるだろう)私はtimetreeを削除するにはお勧めしません

CALL spatial.bbox('spatial_records', smin, smax) YIELD node as m 
WITH m 
WHERE m.timestamp > 1300542000000 and m.timestamp < 1350543000000 
RETURN m 

:あなたはを持っていると仮定すると

はあなたのノード上timestampプロパティをインデックス化。いくつかの時間問合せでは、特に解像度が高く(ミリ秒)、非常に連続したタイムスタンプが多い場合には、timetreeはレンジ問合せの問合せより優れています。

それ以外の場合は、neo4jのスラックまたは個人的に(graphawareドットコムのchristophe)詳細を送信できる場合は、これはネオ4jとGraphAwareが多分もっと多くのものをサポートするのに役立ちますノードの集合を渡し、範囲内にないものや空間との滑らかな組み合わせを除外するような手続きを介して、それが十分に一般的である限り、より良い方法で行うことができます。

一方、オープンソース製品を使用している場合、特定のユースケースに対して2つの手順を組み合わせた手順を簡単に作成できます。

+0

お返事ありがとうございます。私は間違いなくJavaの世界に入って、自分自身を呼び出すことができるかどうかを検討しました。これは、並行して実行される結果に低コストのハッシュベースの結合を何らかの形で実行するかどうかを示します。しかし、正直言って私はJavaに多くの経験を持っていないので、私はほとんど怖がらない。 私はapocライブラリを簡単に見て、面白い呼び出しを見つけました。まだそこに何かが役立っているかどうかはわかりません。 – spanishgum

関連する問題