0

ノードが定義されたグラフデータベースがあります。開始ノードと最後のエッジ (終了ノードが存在する) を指定して、終了ノードを見つけたいと考えています。例えば:

A-(知っている)->B-(いいね)->C-(シェア)->D ここで (....) は関係です

ここで、ノード「A」が与えられたときに、それが直接的または間接的に「共有」しているノードを教えてくれるような質問をしたい場合。そして、それは「D」で応答するはずです。したがって、基本的に開始ノードと終了エッジがあれば、必要なノードを見つけることができます。

私の質問は、これは Cypher (またはおそらく gremlin ) で可能ですか? もしそうなら、それを行う正しい方法は何ですか?

4

2 に答える 2

2

これは、jjaderberg から受け入れられた回答と同じ注意事項をすべて備えた Gremlin です (つまり、高価なので、グラフで触れるものを制限しようとすることが必要になる可能性があります)。

gremlin> g = new TinkerGraph()                                                                                   
==>tinkergraph[vertices:0 edges:0]
gremlin> g.loadGraphML('data/graph-example-2.xml')                                                               
==>null
gremlin> ends=[] as Set;g.v(1).as('x').outE.as('e').inV.sideEffect{v,m->if (m.e.label=="followed_by") {ends<<v}}.loop('x'){it.loops<3}.iterate()                 
==>null
gremlin> ends        
==>v[2]
==>v[3]
==>v[4]
==>v[5]
==>v[6]
==>v[50]
...

そのステートメントを少し分解するために、基本的にends、「followed_by」エッジの最後にある一意の頂点を集約する Set を呼び出します。頂点から開始し、頂点1までのすべてのエッジをトラバースします...基本的に、Gremlin のこの部分:

g.v(1).as('x').outE.as('e').inV

次にsideEffect、それらの頂点が「followed_by」ラベルを介して来た場合、それらの頂点をセットに入れます。の 2 パラメーター ステップ クロージャーsideEffectは、Gremlin では見落とされることがあると思います...詳細については、こちらを参照してください。ステートメントは、パイプラインをループバックして、これらの頂点からさらにトラバースすることで終了します。3段階でループを強制的に切断します。

于 2013-10-30T12:40:03.647 に答える
1

「開始ノードと最後のエッジが既知であり、終了ノードを見つける」というパターンは、Cypher で次のように記述できます。

START a=node:nodeIndex({indexQueryParam})
MATCH a-[?*]->()-[:SHARES]->d
RETURN d

?、パターンのこの部分はオプションであり*、任意の長さにできることを示しています。可変長はゼロの長さを意味する可能性があるため、両方が必要なわけではありませんが、パターンをさらに肉付けするときは両方を念頭に置いてください。ノードは実際には必要Bないので、バインドする必要はありません。空の括弧でかまいません。

ただし、このパターンは非常に一般的であり、データによっては費用がかかる場合があります (ダイナマイトで釣りをするのと少し似ています)。KNOWSグラフで見つかると予想される他の関係タイプの例を示しますLIKES。パターンを指定するために導入できるものはすべて、クエリのパフォーマンスを向上させます。

MATCH a-[?:KNOWS|LIKES*]->()-[:SHARES]->d

または、これらがどの順序で発生するかを知っている場合

MATCH a-[?:KNOWS]->()-[LIKES*]->()-[:SHARES]->d

ここでKNOWSは、パターンの一部の深さは 1 つだけですが、その部分の深LIKESさは 0 から無限大です。パーツはオプションです。KNOWSつまり、aこのオプション パーツを介してリンクされたパターンのパーツ全体もオプションです。

最後に、変数の深さの範囲を 0 から無限大にすることは、通常は良い考えではありません。次のように、データにとって意味のある上限または下限を導入します

MATCH a-[?:KNOWS]->()-[LIKES*1..4]->()-[:SHARES]->d

データで見つけた(または課した)パターンを見て、それに応じて暗号クエリパターンを開発し、常にできるだけ多くの暗号パターンを指定し、埋めたい部分だけを未定義のままにする必要があります。グラフで。

于 2013-10-29T10:53:01.530 に答える