2013-06-18 83 views
0

我必須在java中使用查詢gremlin,我不知道該怎麼辦,因爲我試圖按照 https://github.com/tinkerpop/gremlin/wiki/Using-Gremlin-through-Java中的說明操作,但是我沒有結果,只有例外。請有人幫助我。通過java查詢gremlin

這裏是我必須使用查詢的示例:

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

我在這兩個由官方文檔建議的方式嘗試。 編譯小鬼的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的:asMap

使用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

阿細。你打了我一分鐘。這應該工作。在此之前,他正在使用'VertexIterable',在那裏gremlin期待一個'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在REPL中運行嗎?你使用什麼版本的Gremlin? –