用户定义的gremlin步骤适用于gremlin,但不适用于rexster

时间:2014-11-26 21:58:14

标签: groovy gremlin rexster

与gremlin shell相比,我试图确定rexster处理用户定义的Gremlin查询的方式似乎存在差异的原因。

我正在使用:

  • rexster - 服务器 - 2.6.0;
  • 的gremlin-常规-2.5.0;
  • orientdb-社区1.7.9;

我已经加载了一个图表来表示一个简单的层次结构树。每个节点都有一个标记为“父”的边,指向其父节点。这是一个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?

提前致谢,我们非常感谢任何帮助,见解或对相应文档的指示。

1 个答案:

答案 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命令)。