2013-06-18 3 views
0

Мне нужно использовать запрос gremlin в java, и я не знаю, как это сделать, потому что я попытался выполнить инструкции в https://github.com/tinkerpop/gremlin/wiki/Using-Gremlin-through-Java, но у меня нет никаких результатов, только исключение. Кто-то мне помогает.запрос gremlin через java

Ниже приведен пример запроса, который я должен использовать:

g.V.filter{it.AffiliatedDepartment != null}.copySplit(_().DepartmentDirector, _().inE.filter{it.label == 'Affiliated_Professor'}.outV.AffiliatedProfessor).fairMerge. 

Я пытался в обоих способов, предложенных в официальной документации. компилирование Gremlin Groovy:

Pipe pipe = Gremlin.compile("_().filter{it.AffiliatedDepartment != null}.copySplit(_().DepartmentDirector, _().inE.filter{it.label == 'Affiliated_Professor'}.outV.AffiliatedProfessor).fairMerge"); 
    pipe.setStarts(g.getVertices()); 

Я получаю java.lang.NoSuchFieldError: АСМАП

Использование JSR 223 GremlinGroovyScriptEngine:

ScriptEngineManager manager = new ScriptEngineManager(); 
    ScriptEngine engine = manager.getEngineByName("gremlin-groovy"); 
    List results = new ArrayList(); 
    Bindings bindings = engine.createBindings(); 
    bindings.put("g", g); 
    bindings.put("v", g.getVertices()); 
    engine.eval("v.filter{it.AffiliatedDepartment != null}.copySplit(_().DepartmentDirector, _().inE.filter{it.label == 'Affiliated_Professor'}.outV.AffiliatedProfessor).fairMerge", bindings); 

я получаю javax.script.ScriptException с сообщением:

<p>groovy.lang.MissingMethodException:</p> 
<p>No signature of method: com.tinkerpop.blueprints.impls.neo4j.Neo4jVertexIterable.filter() is applicable for argument types: 
</div> 
<div> 
    (Script1$_run_closure1) values: [[email protected]] 
    </p> 
    <p>Possible solutions: find(), first(), find(groovy.lang.Closure), sleep(long), with(groovy.lang.Closure) at 
     com.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine.eval(GremlinGroovyScriptEngine.java:110) at 
     javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:233)</p> 
</div> 

ответ

1

В подходе ScriptEngine он работает, если вы измените эту строку:

engine.eval("v.filter{it.AffiliatedDepartment != null}.copySplit(_().DepartmentDirector, _().inE.filter{it.label == 'Affiliated_Professor'}.outV.AffiliatedProfessor).fairMerge", bindings); 

к

engine.eval("g.V.filter{it.AffiliatedDepartment != null}.copySplit(_().DepartmentDirector, _().inE.filter{it.label == 'Affiliated_Professor'}.outV.AffiliatedProfessor).fairMerge", bindings); 

или к

engine.eval("v._().filter{it.AffiliatedDepartment != null}.copySplit(_().DepartmentDirector, _().inE.filter{it.label == 'Affiliated_Professor'}.outV.AffiliatedProfessor).fairMerge", bindings); 

Установка v связывания с g.getVertices() устанавливает его в Neo4jVertexIterable, который не признает filter (как это filter бы можно найти в составе трубопровода). Поэтому моя теория с обоими предложениями состоит в том, чтобы анализировать правильно сформированный конвейер.

+0

Ah работает. Ты бил меня минуткой. Это должно сработать. До этого он использовал 'VertexIterable', где гремлин ожидал объект Pipeline. – Nicholas

0

Использование версии 2.2 и исключение:

java.lang.NoSuchFieldError: ASMAP.

Вместо с версии 2.3, я получаю следующее исключение:

Exception in thread "main" java.lang.NoSuchMethodError: com.tinkerpop.pipes.util.FluentUtility.prepareFunction(Lcom/tinkerpop/pipes/util/structures/AsMap;Lcom/tinkerpop/pipes/PipeFunction;)Lcom/tinkerpop/pipes/PipeFunction;

Однако запрос отлично в консоли

+0

Есть ли у вас оригинальный gremlin run в REPL? Какую версию Gremlin вы используете? –

Смежные вопросы