2017-11-08 7 views
3

私はNeo4jとTraversalが何をすることができるかについて複雑な質問があります。Neo4jグラフバックトラッキングアルゴリズム

が私の考えは、グラフ全体をトラバースすることであり、私が「偽」ノードを見つけた場合、その上の彼の隣人にこの状態を拡大し、

Graph

次のNeo4jグラフを持っている想像して、最後に、この例では、すべてのノードに「偽」ステータスを設定します。 (実際の生活の中で、私が横断しながら、trueまたはfalseにこのステータスを設定するにはより多くの条件がありますが、私はそれに質問のビットを簡素化)

私はこれを行うには、いくつかのバックトラッキングアルゴリズムが必要だと思うが、のNeo4jで私はこれをどうやって行うのか、それが可能なのか分からない。さらに、このグラフは非常に大きなグラフになる可能性があります。

これはJavaとNeo4jでどのように行うのですか?

ありがとうございました。

+1

目的のプロパティを持つ任意のノードを 'false'としてマッチングするだけで十分ですが、到達可能なすべての接続ノードもそのノードからfalseに変更しますか? – InverseFalcon

答えて

0

あなたの質問を完全に理解できたかどうかはわかりませんが、シンプルなCypherクエリで十分だと思います。次のようなものがあります。

MATCH ({someProperty : false})-[*]-(neighbours) 
SET neighbours.someProperty = false 
+0

これは任意の深さのfalseプロパティを拡張するので、動作すると思います。私はいくつかの条件を追加する必要がありますが、私はそれを試してみましょう。私の質問では、私はJavaでこれを行うように頼んだ(私は自分自身を説明していない場合は申し訳ありませんが、私はTraversalDescription、Expandersでこれをやりたかった...)。なぜサイファーですか?それは簡単ですか? Thanks – jpadilladev

+0

@jpadilladev Cypherは、このデータベースを処理するクエリ言語であるNeo4jを使用する際の「自然な」選択肢です。また、Java APIに比べてCypherの方が操作が簡単です。しかし、Java APIは柔軟性が高く、抽象度が低くなっています。あなたの要件を完全に理解していれば、横断が行われている間に条件を動的に追加しようとしています...この場合、Java APIを使用する必要があると私は信じています。 –

2

到達可能ノードとの効率的な照合のために、うまくいく傾向がある2つのオプションがあります。

Neo4j 3.2.xでは、可変リレーションシップマッチとDISTINCTの使用により、すべての個別の到達可能ノードに一致する効率的な方法がありますが、可変長関係に上限が必要です。適切に高い数値を使用すると効果があります。以下のような何か:

MATCH (start:SomeLabel{someProperty:false}) 
CALL apoc.path.subgraphNodes(start, {}) YIELD node 
SET node.someProperty = false; 

EDIT

最初のオプションの詳細を追加するには(なぜ:

MATCH (:SomeLabel{someProperty:false})-[*..999999]->(x) 
WITH distinct x 
SET x.someProperty = false 

そうでない場合は、APOC Proceduresも部分グラフで到達可能なノードへの効率的なマッチングを行いapoc.path.subgraphNodes()を提供しています*を使用し、なぜDISTINCTを使用するのか)、*を使用すると、デフォルトでCypherがすべての可能なパスに一致することに注意してください。これらのパスが前のノードと同じノードで終了してもマッチしたパス。これは十分に接続されたグラフ(合理的な上限がなく、LIMITを使用していないとき)でヒープを吹き飛ばしたり、無限にぶら下げる可能性があるため、非効率的になります。

これは、すべての可能なパス、到達可能なすべてのノードだけには関心がないときは、特に避けるべきです。

In Neo4j 3。私たちは、私たちが参照されていないVARレングスの拡張

  • を持って

    1. :2は、最適化が導入された次のすべてに該当する場合場合にトラバーサルロジックを変更する、剪定-varが拡張と呼ばれていました(パス変数をマッチパターンに設定するか、var-length関係に変数を設定するなど)
    2. var-length展開の上限は
    3. DISTINCT拡張から得られるノードまたは値

    基本的に、var-length展開から別個のノード(または別個のノードの値)を必要とし、パスを気にしないという質問がある場合。

    plannerは、プルーニングvarの展開を使用します(EXPLAINまたはPROFILEのクエリプランを確認することで確認できます)。

  • +0

    *のみが機能します(Bruno Peresの回答と[この回答](https://stackoverflow.com/a/26799022/3133256))。 なぜDISTINCTですか? – jpadilladev

    +0

    大きなグラフで '*'を使うことの制限や、刈り込みvar拡張の最適化についていくつかの詳細を追加しました。 – InverseFalcon

    +0

    すごい説明! –