如何在Gremlin过滤器中使用自定义功能?

时间:2013-01-10 11:46:52

标签: filter user-defined-functions gremlin

在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的doghouse web界面。

当我想编写一个函数时,我遇到了这个问题,如果在给定顶点的行下面有任何名为potato的顶点,则返回true。 虽然我对这个问题的任何其他解决方案感兴趣,但我在这个阶段(作为初学者Gremliner)的目标是评估/学习Gremlin,了解它是如何工作的,尝试不同的解决方案,而不是找到最好的解决方案

1 个答案:

答案 0 :(得分:0)

作为2.3.0-SNAPSHOT的一部分,已针对此问题向Gremlin提交了修复程序:

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]