2017-05-18 3 views
0

今、私はNeo4jを使用しており、間違った側からタスクを解決しています。 最初に私はallShortestPathsを取得し、javaでそれらの中で正しいものを検索します。 もちろん、この方法でも結果が保証されるわけではありません。 私は、必要なものをネイティブに検索できるグラフDBMSを探しています。複雑な基準を持つ最短パスは、どのグラフでも可能です。DBMS

データモデルは単純です:

  • ノード:数

  • 関係の識別以外にはプロパティ:それを明確にするダブル

で1つのプロパティを - それは彼らが互いに所有する組織と株式のリスト(すなわち、プロパティ=パーセンテージ> 0 < = 100) 。

基準経路を通過するときである:次の関係ノードが含まれている++ 50

  • 場合(パスが続く)
  • 次関係は、その後、50以下である場合、そのパスに既にすべてのノードこのノードの自身 50+、次いでまだ経路が

を継続これは、アルゴリズムは、パス自体の関係が、好ましくは、必ずしも「側」関係(だけ「次の関係だけでなく、計算する必要があることを意味"は50です - )。

最後に、ネイティブの最短パス(つまり、18ミリノードで数ミリ秒+ 40ミリリットルのリレーションシップ)のパフォーマンスが期待されます。数時間または数分ではありません。今、shortestpathは30-40-50ホップのパスをミリ秒単位で見つけます。それは素晴らしいことです。リレーション値で遊ぶ私はいくつかの長さの最短パスを数秒で得ることができます。しかし、これは理想的な解決策ではありません。

私はこれまでに発見したことから、Neo4jのエキスパートではありません - allsSortestPathsのパフォーマンスはやや厚いものです。余分な条件を追加すると、パフォーマンスがミリ秒から数時間に低下する可能性があります。それは許されません:(10 ++のパスの長さも必見です。

私は推測、私はあまりしたいが、まだ、任意のヒント、アイデア、ソリューションは歓迎されていることを!

答えて

0

小さなデータ - について私はちょうどCypherがいくつかのWHERE条件(最も簡単な解決策、最も効率的でないもの)でそれを処理することを信じるでしょう。

解決策を "プレコンパイル"するのがベストです。いくつかの元帳ノードまたはリレーションシップが必要な情報を格納できるようにし、これらの元帳を更新することはソリューションを完全に再コンパイルするより簡単です。これは、情報を格納および取得する最善の方法である(読み込み、あなたはちょうどいいdで1つのノードまたは関係をプルアップします)。

おそらく解決策を単純化することはできません。には、複雑なトラバーサルを行うためにがあります。 Cypherはこれについては良いですが、それはデータベースにあるものが目に見えず、あなたが知っている事実を悪用することはできません。その場合(最高のパフォーマンスを得るために)Traversal APIを使用することになります(Neo4JにはJava Core APIもありますが、Traversal APIははるかに簡単で、無視できるほど遅くなります)

関連する問題