2013-01-10 78 views
0

在小鬼如下我可以定義一個函數:如何在Gremlin過濾器中使用自定義函數?

def name_is_potato (v) { return v.has('name','potato').count() == 1} 

當我打電話

name_is_potato(g.V[0]) 

我得到

==>true 

但是,當我進入

g.V[0].filter{name_is_potato(it)} 

我得到

==>java.lang.StackOverflowError 

這是怎麼回事?我怎樣才能讓它運行? 我使用Rexster的狗窩網頁界面。

當我想寫一個函數時,遇到了這個問題,如果在給定頂點的某條線的任何地方有任何頂點,就返回true。 儘管我對這個問題的其他解決方案很感興趣,但我在這個階段(作爲初學者Gremliner)的目標是Gremlin的評估/學習,感受它是如何工作的,嘗試不同的解決方案,而不是找到最好的一。

+0

對不便,但您似乎遇到了一個錯誤。它存在於Dog House中,並且在Rexster控制檯中也失敗。有趣的是,它可以在獨立的Gremlin發行版中使用。從腳本引擎返回結果時發生故障,並且正在轉換爲字符串行以返回到控制檯,但我沒有立即看到原因。這個例外特別沒有幫助。我在rexster中創建了一個問題來跟蹤:https://github.com/tinkerpop/rexster/issues/263 –

+0

它也可以通過相同Rexster實例的RESTful界面工作,指示錯誤的位置與您寫的相同 –

+0

我在github上更新了這個問題。有一種解決方法,但還不是解決方案。 –

回答

0

一個修復一直致力於此問題的Gremlin爲2.3.0-快照的一部分:

https://github.com/tinkerpop/gremlin/issues/331

從源大廈rexster應出示解決問題的辦法。以下是我在Rexster Console中所做的測試:

rexster[groovy]> def isVadas(v){v.name=="vadas"} 
==>null 
rexster[groovy]> g = rexster.getGraph("tinkergraph") 
==>mocktinkertransactionalgraph[vertices:6 edges:6 directory:data/graph-example-1] 
rexster[groovy]> isVadas(g.v(2)) 
==>true 
rexster[groovy]> isVadas(g.v(1)) 
==>false 
rexster[groovy]> g.V.filter{isVadas(it)} 
==>v[2] 
相關問題