与gremlin shell相比,我试图确定rexster处理用户定义的Gremlin查询的方式似乎存在差异的原因。
我正在使用:
我已经加载了一个图表来表示一个简单的层次结构树。每个节点都有一个标记为“父”的边,指向其父节点。这是一个DAG。
我在Gremlin中定义了一个user-defined step(通过init-scripts加载到rexster中),如下所示:
Gremlin.defineStep('children',
[Vertex, Pipe],
{int depth -> _().out('parent').loop(1)
{it.loops < depth}
{it.object != null}
})
在rexster doghouse中使用命令行gremlin工具时,使用这些命令,我收到以下错误(向右滚动以查看整个错误消息):
gremlin> g.V('type', 'LSNetwork')
==>v[#9:6312]
gremlin> g.V('type', 'LSNetwork').out('parent').out('parent').name
==>Leaf 0
==>Leaf 1
==>Leaf 2
==>Leaf 3
gremlin> g.V('type', 'LSNetwork').children(2)
==>javax.script.ScriptException: groovy.lang.MissingMethodException: No signature of method: com.tinkerpop.gremlin.groovy.GremlinGroovyPipeline.children() is applicable for argument types: (java.lang.Integer) values: [2]
但是,如果我启动gremlin.sh,连接到我的图表,定义步骤,并执行它,它完美地运行:
gremlin> Gremlin.defineStep('children', [Vertex, Pipe], {int depth -> _().out('parent').loop(1){it.loops < depth}{it.object != null}})
==>null
gremlin> sg=new OrientGraph('remote:localhost/scratch')
==>orientgraph[remote:localhost/scratch]
gremlin> sg.V('type','LSNetwork').children(3).name
==>Spine 0
==>Spine 1
==>Leaf 0
==>Leaf 1
==>Leaf 2
==>Leaf 3
(注意:名称是正确的,我期望看到的)。
为什么我的gremlin脚本在gremlin控制台上运行,而不是通过灯泡/ rexster?
提前致谢,我们非常感谢任何帮助,见解或对相应文档的指示。
答案 0 :(得分:0)
使用文档中定义的codeveloper
步骤版本时,我没有遇到任何问题:
$ curl "http://localhost:8182/graphs/tinkergraph/tp/gremlin?script=g.v(1).codeveloper.name"
{"success":true,"results":["josh","peter"],"version":"2.5.0","queryTime":39.294181}
似乎也适用于狗屋。我最好的猜测是Rexster找不到脚本。您确定自己的路径适合<init-scripts>
设置吗?如果正确指定并加载了init脚本,您应该看到此日志条目:
[INFO] EngineHolder - ScriptEngine initializing with a custom script
在ScriptEngine
启动之前你不会看到它,直到你提出请求才会发生这种情况(例如我上面的curl命令)。