0

2 つ以上のランダム ノードがあるシナリオがあります。

3 つのノードすべてを接続するすべての可能なパスを取得する必要があります。関係の方向と関係のタイプがわかりません。

: グラフ データベースに 3 つのノードがありperson->Purchase->Productます。

これら 3 つのノードを接続するパスを取得する必要があります。しかし、クエリを実行する必要がある順序がわかりません。たとえば、クエリを person-Product-Purchase として指定すると、順序が正しくないため行が返されません。

では、この場合、クエリをどのようにフレーム化すればよいでしょうか?

一言で言えば、ユーザーが知っている順序で match 句を指定できる 2 つ以上のノード間のパスを見つける必要があります。

4

3 に答える 3

2

の複数のバインドされた識別子にあるすべてのノードを一覧表示すると、一致するノードが任意の順序で見つかりますstartmatch必要に応じて、N 個のアイテムに対してこれを行うことができます。たとえば、次の 3 つのアイテムに対するクエリは次のとおりです。

start a=node:node_auto_index('name:(person product purchase)'), 
      b=node:node_auto_index('name:(person product purchase)'), 
      c=node:node_auto_index('name:(person product purchase)') 
match p=a-->b-->c 
return p;

http://console.neo4j.org/r/tbwu2d

start私は実際にどのように機能するかについてのブログ投稿を作成しました

于 2013-03-15T20:51:57.730 に答える
0

複数のクエリを作成することはできませんか? あなたの場合、可能なすべての組み合わせで6つのクエリを自動的に生成します(変数の数の階乗)

于 2013-03-15T11:42:07.403 に答える
0

考えられる解決策は、最初に 3 つのノード セット ( sme) を取得することです。これらのセットは、質問と同じ (または部分的または完全に異なるノードを含む) 場合があります。開始ノード、中間ノード、終了ノードが固定されていないため、セットは重要です。

ノードが追加されたマトリックスの例のコードを次に示します。

match (s) where s.name in ["Oracle", "Neo", "Cypher"]
match (m) where m.name in ["Oracle", "Neo", "Cypher"] and s <> m 
match (e) where e.name in ["Oracle", "Neo", "Cypher"] and s <> e and m <> e 
match rel=(s)-[r1*1..]-(m)-[r2*1..]-(e)
return s, r1, m, r2, e, rel;

追加のwhere節により、同じノードが 1 つの結果行で 2 回使用されないようにします。リレーションは、方向を無視して、ノードとまたはとそれぞれの間の1 つ以上のエッジ ( *1..) またはホップと一致します。smme

ここでは cypher 3 構文が使用されていることに注意してください。

于 2016-11-03T16:26:42.983 に答える