Gremlin.compile()无法执行在gremlin控制台中运行的查询

时间:2014-10-26 01:31:23

标签: gremlin titan

当我在gremlin控制台中执行以下操作时,我得到了预期的结果。

g.V('name', 'a').next().query().has('b', GREATER_THAN_EQUAL, 100).orderBy('timestamp', Order.DESC).edges()

现在我正在尝试从Java执行相同的操作(遵循this指南)但是我无法让它工作。

我试过这个

Pipe pipe = Gremlin.compile("_().query().has('b', GREATER_THAN_EQUAL, 100).orderBy('timestamp', Order.DESC).edges()");
pipe.setStarts(new SingleIterator<Vertex>(graph.getVertices("name", 'a').iterator().next()));
for(Object name : pipe) {

}
  

javax.script.ScriptException:javax.script.ScriptException:   groovy.lang.MissingMethodException:没有方法签名:   com.tinkerpop.gremlin.groovy.GremlinGroovyPipeline.query()是   适用于参数类型:()值:[]可能的解决方案:   every(),every(groovy.lang.Closure),grep(),   树([Lcom.tinkerpop.pipes.PipeFunction),   树([Lgroovy.lang.Closure),   树(com.tinkerpop.pipes.util.structures.Tree)

这个

Pipe pipe = Gremlin.compile("_().next().query().has('b', GREATER_THAN_EQUAL, 100).orderBy('timestamp', Order.DESC).edges()");
pipe.setStarts(new SingleIterator<Vertex>(graph.getVertices("name", 'a').iterator().next()));
for(Object name : pipe) {

}
  

javax.script.ScriptException:javax.script.ScriptException:   groovy.lang.MissingMethodException:没有方法签名:   com.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine.query()   适用于参数类型:()值:[]可能的解决方案:   every(),every(groovy.lang.Closure),grep(),grep(java.lang.Object),   any(),dump()

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

好的,所以我决定使用GremlinGroovyScriptEngine而不是Gremlin.compile()。这种方法也在同一个guide上描述,我实际上更喜欢这个,因为它给了我参数化,我不需要修改原始查询(用_()代替g。)。

ScriptEngine engine = new GremlinGroovyScriptEngine();

Bindings bindings = engine.createBindings();
bindings.put("g", graph);
bindings.put("value", 100); 
bindings.put("DESC", Order.DESC);

engine.eval("g.V('name', 'a').next().query().has('b', Compare.GREATER_THAN_EQUAL, value).orderBy('timestamp', DESC).edges()", bindings);

我仍然有兴趣知道为什么Gremlin.compile不起作用,希望以上内容对其他人有帮助。

答案 1 :(得分:0)

这条线看起来很可疑:

Pipe pipe = Gremlin.compile("_().next().query().has('b', GREATER_THAN_EQUAL, 100).orderBy('timestamp', Order.DESC).edges()");

您正在尝试从不评估Pipe的内容中编译Pipeline。换句话说,你从身份管道(_())开始,然后你接下来()它然后下拉到一个返回edges() edges()的顶点查询返回{{1}而不是Iterator。如果查看Pipeline的示例,Gremlin字符串的计算代码将返回管道。

Gremlin.compile

我的猜测是,如果您将代码更改为(未经测试):

Pipe pipe = Gremlin.compile("_().out('knows').name");
你可能会取得一些成功。我想如果这样可行,那么你会想知道如何重新优化你的查询,因为我猜有些后端可以优化顶点查询的Pipe pipe = Gremlin.compile("_().outE.has('b', GREATER_THAN_EQUAL, 100).order{it.b.timestamp <=> it.a.timestamp}"); pipe.setStarts(new SingleIterator<Vertex>(graph.getVertices("name", 'a').iterator().next())); for(Object name : pipe) { } ,而orderBy Gremlin步骤只是一种记忆中的排序。