2014-10-26 2 views
0

Когда я запускаю следующее в консоли gremlin, я получаю ожидаемый результат.Gremlin.compile() не может выполнить запрос, который работает в консоли 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(), each (groovy.lang.Closure), grep(), tree ([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(), each (groovy.lang.Closure), grep(), grep (java.lang.Object), a ny(), dump()

Любые идеи?

ответ

0

Эта линия выглядит подозрительным мне:

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

Вы пытаетесь скомпилировать Pipe из чего-то, что не оценить в Pipeline. Другими словами, вы начинаете с идентификационной трубы (_()), но затем вы ее выходите() и выпадаете в запрос вершин, который возвращает edges(). edges() возвращает Iterator, а не Pipeline. Если вы посмотрите на пример 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 запроса Vertex, тогда как шаг Gremlin order - это просто сортировка в памяти.

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 не работает, надеюсь, выше, будет полезным для кого-то другого.