compile()无法执行在Gremlin控制台中工作的查询

compile()无法执行在Gremlin控制台中工作的查询,gremlin,titan,Gremlin,Titan,当我在gremlin控制台中执行以下操作时,我得到了预期的结果 g.V('name', 'a').next().query().has('b', GREATER_THAN_EQUAL, 100).orderBy('timestamp', Order.DESC).edges() 现在,我正试图按照Java指南执行同样的操作,但是我无法让它工作 我试过这个 Pipe pipe = Gremlin.compile("_().query().has('b', GREATER_THAN_EQUAL, 1

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

g.V('name', 'a').next().query().has('b', GREATER_THAN_EQUAL, 100).orderBy('timestamp', Order.DESC).edges()
现在,我正试图按照Java指南执行同样的操作,但是我无法让它工作

我试过这个

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.gremlingroovypepeline.query是 适用于参数类型:值:[]可能的解决方案: every,everygroovy.lang.Close,grep, 树[Lcom.tinkerpop.pipes.PipeFunction;, tree[Lgroovy.lang.Closure;, treecom.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,everygroovy.lang.Closure,grep,grepjava.lang.Object, 任何,倾倒


有什么想法吗?

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

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不起作用,希望上面的内容对其他人有所帮助。

我觉得这句话很可疑:

Pipe pipe = Gremlin.compile("_().next().query().has('b', GREATER_THAN_EQUAL, 100).orderBy('timestamp', Order.DESC).edges()");
您正试图将一个管道编译成一个管道。换句话说,您先从标识管道开始,然后再将其编译成顶点查询,该查询返回一个迭代器,而不是管道。如果您查看Gremlin的示例,请编译Gremlin s的评估代码tring返回一个管道

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,而order Gremlin步骤只是内存排序