0

Java でクエリ gremlin を使用する必要がありますが、 https://github.com/tinkerpop/gremlin/wiki/Using-Gremlin-throughの指示に従おうとしたため、どうすればよいかわかりません 。 -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: 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: [Script1$_run_closure1@5bcf59f5]
    </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>
4

2 に答える 2

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に設定されます。したがって、両方の提案に関する私の理論は、適切に形成されたパイプラインを評価することです。filterfilter

于 2013-06-18T18:01:49.203 に答える