当我在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()
有什么想法吗?
答案 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步骤只是一种记忆中的排序。