2

次のようなグラフがある場合:

N3->member_of->N1
N2->knows->N1
N3->likes->N2
N4->member_of->N1
N5->likes->N2

次のことを行う単一のクエリを実行する方法はありますか?

  1. N3で開始した場合、N2を返します
  2. そして、N4で開始された同じクエリはN2を返します
  3. そして、N5で開始された同じクエリはN2を返します

(できればグレムリンで)

編集:明確化:1次の関係が「member_of」である限り、2次の接続まで通過できます。

4

5 に答える 5

3

かなり古い質問ですが、誰もグレムリンの解決策を思い付かなかったので、ここにあります:

Bobbys初期化スクリプトを使用しました。

g = new TinkerGraph()
(1..5).each { g.addVertex(it) }
g.addEdge(g.v(3), g.v(1), "member_of") 
g.addEdge(g.v(2), g.v(1), "knows")
g.addEdge(g.v(3), g.v(2), "likes")
g.addEdge(g.v(5), g.v(2), "likes") 
g.addEdge(g.v(4), g.v(1), "member_of")

そして、これがあなたのグレムリンクエリです:

gremlin> g.v(3).copySplit(_().out('likes'), _().out('member_of').loop('start'){true}{true}.in('knows')).exhaustMerge().dedup()
==>v[2]
gremlin> g.v(4).copySplit(_().out('likes'), _().out('member_of').loop('start'){true}{true}.in('knows')).exhaustMerge().dedup()
==>v[2]
gremlin> g.v(5).copySplit(_().out('likes'), _().out('member_of').loop('start'){true}{true}.in('knows')).exhaustMerge().dedup()
==>v[2]

乾杯、ダニエル

于 2013-07-12T09:40:56.960 に答える
0

まず、TinkerGraphを使用してGremlinGroovyシェルでグラフを作成します。

g = new TinkerGraph()
(1..5).each { g.addVertex(it) }
g.addEdge(g.v(3), g.v(1), "member_of") 
g.addEdge(g.v(2), g.v(1), "knows")
g.addEdge(g.v(3), g.v(2), "likes")
g.addEdge(g.v(5), g.v(2), "likes") 
g.addEdge(g.v(4), g.v(1), "member_of")

頂点3、4、または5で始まり、頂点2を返すクエリが必要なようです。以下のクエリはアルゴリズムを使用しています。

  • 頂点'x'を取得します
  • 着信と発信の両方の隣接する頂点を取得します
  • 3回ループするか、IDが「2」の頂点が見つかるまで、両方をもう一度ループします。
  • パイプのnext()メンバーを取得することによる重複排除の結果
gremlin> g.v(3).both.loop(1) {it.loops < 3}{it.object.id == "2"}.next()
==>v[2]
gremlin> g.v(4).both.loop(1) {it.loops < 3}{it.object.id == "2"}.next()
==>v[2]
gremlin> g.v(5).both.loop(1) {it.loops < 3}{it.object.id == "2"}.next()
==>v[2]

パスパターンに関するGremlinのドキュメントも役立つ場合があります。

于 2012-07-25T21:01:15.843 に答える
0

ノード(人?)のすべての着信および発信関係、および人がメンバーであるグループのすべての関連ノードを返したいという考えですか?それで、「グループ」は「メンバー」で彼らの関係を通勤しますか?

もしそうなら、そして再帰的なグループが許可されていないと仮定して、私はあなたのユースケースをより明確に説明するかもしれない別のグラフを思いついた-> http://console.neo4j.org/?id= wyr207

実行した場合

start n=node(5) match n-[?:knows|likes]-related, n-[?:member_of]->group-[:knows|likes]-other_related return related, other_related

グラフ上では、ノードがグループのメンバーである場合、related直接関連するother_relatedすべてのノードと、グループから返された他のすべてのノードが返されます。それらを組み合わせるのは私のサイファーの能力を超えていますが、それらは重複排除されたAFAIKになります(のノードはrelated含まれませんother_related)。

いくつかの異なるノードID(N5のノードIDは1)を使用してコンソールリンクでクエリを試して、それがあなたが考えていたものであるかどうかを確認してください。関係の方向性などを追加するのは簡単です。

これをGremlinに変換するのは少し面倒ですが(Cypherでのパターンマッチングの方が自然です)、これが正しい方向であればLMKで行います。

于 2012-08-10T22:00:20.703 に答える
0

これは、暗号でどのように見えるかです。

1: start n=node(3) match n-[:LIKES]->m return m;
2: start n=node(4) match n-[:MEMBER_OF]-m-[]-k return k;  (will return n2,n3. if you want n2 only match n-[:MEMBER_OF]-m-[:KNOWS]-k )
3: the same as 1)
于 2012-07-24T09:01:25.697 に答える
0

セットアップが正しいかどうかわからない場合は、ここで試してみてください:http ://tinyurl.com/d2mjkj2-セットアップは正しいですか?

最初の関係タイプが必要な場合、member_ofN5はN2を返さないはずです。そうでなければ、あなたは次のようなことをすることができます

start s=node(3,4,5) match s-[r1:member_of]->()<-[r2*0..1]-end return s,end

member_ofリレーションシップで始まり、任意のタイプのリレーションシップが0または1のパターンを返します。必要に応じてこれを締めます。詳細については、 http://docs.neo4j.org/chunked/snapshot/query-match.html#match-variable-length-relationshipsを参照してください。

于 2012-07-25T07:50:19.307 に答える