2017-03-07 16 views
0

Neo4jにネストされたツリーが格納されています。各ノードは、他のノードとの関係を(n)-[:CHILD]->(c)とすることができます。与えられたノードからツリー全体をMATCH (n)-[c:CHILD*]-(m)で照会できるようにします。ネストされた階層にユーザートラバーサルパスを格納します。

私が問題を抱えているのは、ユーザーがツリーを歩いているときのパスを保存する方法です。たとえば、パスを返すクエリは(user)-[:USER_PATH*]->(node)となります。

ただし、パスは:CHILDの行に沿っていなければなりません。ブランチの外側にジャンプすることはできません。あるユーザーのパスは、ある分岐のリーフから別のブランチのリーフにジャンプすることはできません。最初にパスを戻すことなく、フォークが見つかるまでそのパスをバックアップします。

また、私は最短経路は私が望んでいないので、私はユーザーの実際のパスが欲しいので、最短経路は動作するとは思わない。しかし、ユーザーがどの支店からも退職したときに放棄された関係は無視する必要があります。死んだ道を離れることは避けてください。

各ノードを歩いてグラフを更新すると、これらのルールはそのまま維持されます。

新しいブランチにドリルダウンして、それが唯一の兄弟の1つの以上のセットにステップスルーできると想定することができます。しかし、それが来るすべてのブランチはまだ開いているので、兄弟を選択することができます。

私は理解することができますベスト、それはする必要があるということである:限り、それができるよう

  • :USER_PATH関係を歩く「好む」
  • それは新しいノードに到達するためにそのパスを破るために必要になるまで
  • は、それがどんな新しい関係
  • そのパス上でなくなった古い関係を削除を作成するポイント

しかし私はそれを達成する方法を知らない。

私は試行錯誤に時間のトンを過ごし、無駄にグーグルでてきました。

ありがとうございます! =ユーザー

  • 緑色ノード=有効ノードが新たな "標的" と
  • 青色ノード=無効なターゲット・ノード
    • 赤色ノード:イメージ以下を考える


      チェーンのRATIONAL_PATH関係:あなたはそれが現在であるリーフノードのうち、バックアップした場合

      だから、それはその最終的に削除します。

      またパスが選択された緑色のノードのいずれかに調整するが、既存の維持すべきである:可能な限りのためにタクトでRATIONAL_PATHを。

      enter image description here

    +0

    私はまだ、RATIONAL_PATHの関係がどのような経路になっているのか、どのように生成されているのか、はっきり分かりません。あるいは、あなたは何らかの形でMATCH(n) - [c:CHILD *] - (m)のクエリからそれらを推測しようとしていますか? – InverseFalcon

    +0

    最終的な結果のように聞こえるのは、RATIONAL_PATHといういくつかのエンドノードとの1つのパスです。ユーザーが探索して戻ったパスをクリーンアップする方法が必要です。それはあなたの後のことですか?私はバックアウトプロセスが作成されていると仮定しています:RATIONAL_PATHの関係は、元のノードに戻る方向(彼らが来た方向の反対)に戻ります。無関係のパスをいつどのように整理しようとしますか? – InverseFalcon

    +0

    はい、単一です:ルートノードからツリーのいくつかのノードまでのRATIONAL_PATHパス。しかし、彼らがナビゲートするときに逆の方向に戻るのではなく、その関係を削除するだけで、ルートからターゲットへの一方向のノードのパスを提供するために、私はそれまでの関係を削除することを好みますまずは –

    答えて

    0

    は個人的に私は、既存のパスを削除し、shortestPath()で新しいものを作成することは、おそらく行くための最善の方法だと思います。既存のパスを再利用してクリーンアップを実行するコストは、単純にやり直すよりも高くなり、複雑になることがよくあります。

    それ以外の場合は、パスの最後のノードまでマッチングし、新しいノードにshortestPath()を実行してパスを作成する方法があります。

    次に、クリーンアップを実行する必要があります。これには、すべてのパスをRATIONAL_PATHの関係でエンドノードに一致させることが含まれます。その結果、パスのグループが生成されます。最短距離のものが私たちが保持するものになります。それらの関係を収集し、有効でなくなった他のパスの他の関係を収集し、最短パスで使用されていない関係を取得するためにいくつかの減算を行い、それらを削除する必要があります。

    これはおそらく避けなければならないかなりの作業です。

    +0

    今私は基本的にちょうど:ルートにマッチしています。すべて削除:そのノードのRATIONAL_PATHを完全に削除します。最短パスを見つけて、次のものを作成してください:それぞれの間にRATIONAL_PATH; –

    関連する問題