2012-12-12 62 views
1
用戶定義的步驟通過arugument(多個)

我創建稱爲otherV用戶定義的步驟,其從邊緣(e)開始和使用單個頂點參數(無論是e.inVe.outV或) ,並在該邊上輸出其他頂點。怪異結果與在的Gremlin

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作爲我的步驟的參數,它失敗與錯誤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} 

回答

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中兩個V的頂點是否與傳入的頂點相反是不夠的,因爲它可能不匹配頭部和尾部。基本上,我使用except()來獲取傳入的對象頂點,然後將不匹配的列表收集到列表中,然後檢查列表以查看大小是否大於1。如果是,那麼這意味着傳入的頂點既不在邊的頭部也不在尾部(並且我返回null),否則列表中的單個頂點就是相反的頂點。

+0

謝謝,斯蒂芬。是的,它並不失敗,但請注意,結果中有兩個額外的路徑,都是'[marko,knows,marko]'。但是,當傳遞'otherV(g.v(1))'時,只返回兩個正確的路徑(如我的問題中的第一種情況所示)。 – user1030497

+0

對不起。我想我很高興看到錯誤以外的東西,並認爲我有正確的事情。我已經重新處理了我的答案。 –

+0

謝謝,您對自定義步驟的修改適用於我的問題中的特定示例。然而,我對'otherV'步驟的想法是從任何邊緣開始,並且在給定其頂點之一的情況下,返回另一個頂點,而不考慮邊緣標籤。我在問題的最後添加了一個簡單的插圖。 – user1030497