2016-10-13 11 views
-1

現在、Neo4jとPostGISでアイソクロンを扱っています。Neo4jアイソクロナス改善

neo4jの問題は、アイソクロンを計算するためのクエリが効率的でないことです。私は現在、最大ホップ数の制限を持っている上に、それ以外の場合は、最大のコストを計算する前に、私のデータベース内のすべての可能なパスを検索しますので、あなたがコード内で見ることができるように

match (n:node) where n.id_gis='155' 
with n 
match path=(n)-[*0..15]-(e) 
with e, min(reduce(cost=0.0, r IN rels(path) | cost + toFloat(r.cost2)*3600)) as cost 
where cost < 30 
return cost, collect(e) as isochrones 
order by cost 

誰かが私の変更をどのように変更して、「正常な」時間に実行され、関係の量を制限することなくクエリを改善できるか考えていますか?

答えて

1

私はCypherを使用するとうまくできないのではないかと心配しています。

ただし、Javaのtraversal frameworkを使用すると、はるかに優れた処理を実行できます。 DiykstraのアルゴリズムのCypher実装(同様の問題、オープンエンドの代わりに固定開始ノードと終了ノードのみ)をAPOC'spart 1part 2と比較して、この2部のブログ記事を参照してください。

  • は、最大コストが
  • は、これまでのための最高のコストを収集到達されるとすぐに枝を剪定:を横断しながら、

    トラバーサルを使用して、にあなたを可能にし、コストを計算することができますエンド・ノード、および現在のブランチのコストは、あなたがあなたの場合も、コストを収集するためにMap<Node, Double>を使用することができ、同じエンド・ノード

のための最高のコストよりも悪い場合ブランチを剪定(fastutilTroveHPPCKolobokeなど)を使用すると、はるかに少ないメモリを使用し、一般的に高速になります(よりコンパクトでボクシングとアンボクシングが少なくなります。ノードのlong idをキーとして使用してください)。

トラバーサルが完了したら、結果を得るために地図をコストのマルチマップと関連エンドノードに逆転させるだけで済みます。

これはCypherクエリを実行するより複雑ですが、はるかに高速です。

+0

ありがとう、それは良い解決策のようです。 単一のパスごとにマップを保存するにはどうすればよいですか? – roman11

+0

すべてのパスのマップはなぜですか?このマップは、到達可能なノードとコストの両方の集約を表しており、定義上一意です。 –

+0

私はそれを得たと思う。 depthFirstではなくdijkstraのような関係の "コスト"特性に応じてトラバースする方法があるかどうかを知っていますか? 私は独自のCostEvaluatorやPathExpanderの実装について何かを読んだことがありますが、それは非常に複雑です。 – roman11