1

otherVエッジ(e)から開始し、単一の頂点引数(e.inVまたは)を取り、そのエッジにもう一方の頂点をe.outV出力する、というユーザー定義のステップを作成しました。

Gremlin.defineStep('otherV', [Edge, Pipe], {Vertex v -> _().bothV.filter{!v.equals(it)}})

私は持っていますg=TinkerGraphFactory.createTinkerGraph();

otherV次のように引数の頂点を渡すと、この手順で正しい結果が得られます。

g.v(1).bothE('knows').otherV(g.v(1)).path{it.name}{it.label}
==>[marko, knows, vadas]
==>[marko, knows, josh]

しかし、最初に引数の頂点をステップの変数(たとえばx)に割り当ててから、引数としてsideEffectステップに渡すxと、ERRORで失敗しますNo such property: x for class: groovysh_evaluate

g.v(1).sideEffect{marko=it}.bothE('knows').otherV(marko).path{it.name}{it.label}
No such property: marko for class: groovysh_evaluate

私が間違っているのは何ですか?


otherVこれは、カスタムステップがどのように機能するかを示す簡単な図です。

// g is the TinkerGraph
marko = g.v(1); vadas = g.v(2); 
edge = g.e(7); // e[7][1-knows->2]

gremlin> edge.otherV(marko).map
==>{name=vadas, age=27}

gremlin> edge.otherV(vadas).map
==>{name=marko, age=29}
4

1 に答える 1

1

この問題は、クロージャー内の変数のスコープに関係しているようです。うまくいけば、あなたが何を求めているかを捉えるために、defineStep を再構築しました。

gremlin> g = TinkerGraphFactory.createTinkerGraph()                                                                                     
==>tinkergraph[vertices:6 edges:6]
gremlin> Gremlin.defineStep('otherV', [Vertex, Pipe], {l -> _().sideEffect{x=it}.bothE(l).bothV.filter{!x.equals(it)}})                          
==>null
gremlin> g.v(1).otherV("knows").path{it.name}{it.label}
==>[marko, knows, vadas]
==>[marko, knows, josh]

これは、カスタム ステップを定義するためのより簡潔な方法のようにも思えます。


これは、任意のエッジを取り、他の頂点を出力する otherV ステップへの別のアプローチです。

gremlin> g = TinkerGraphFactory.createTinkerGraph()                                  
==>tinkergraph[vertices:6 edges:6]
gremlin> Gremlin.defineStep('otherV', [Edge, Pipe], {v -> l=[v];_().bothV.except(l).gather.transform{it.size()>1?null:it[0]}})
==>null
gremlin> g.e(11).otherV(g.v(3))
==>v[4]
gremlin> g.e(11).otherV(g.v(4))
==>v[3]
gremlin> g.e(11).otherV(g.v(5))
==>null

おそらく誰かがこれを行うためのより良い方法を思いつくでしょうが、基本的には、defineStep の bothV からの頂点が渡されたものと反対であるかどうかを単純に評価するだけでは十分ではないことに気付きました。しっぽ。基本的に、except() を使用して、渡された頂点の反対側の頂点を取得し、一致しないものをすべてリストに集めてから、リストをチェックしてサイズが 1 より大きいかどうかを確認しました。そうであれば、渡された頂点がエッジの先頭にも末尾にもなかったことを意味します (そして、null を返します)。それ以外の場合、リスト内の単一の頂点は反対側の頂点です。

于 2012-12-12T11:58:02.500 に答える