【问题标题】:query gremlin through java通过java查询gremlin
【发布时间】:2013-06-18 14:49:45
【问题描述】:

我必须在 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>

【问题讨论】:

    标签: neo4j gremlin


    【解决方案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() 会将其设置为不识别filter 的Neo4jVertexIterable(因为filter 将作为管道的一部分被发现)。所以我对这两个建议的理论是评估一个正确形成的管道。

    【讨论】:

    • 啊。你赢了我一分钟。这应该有效。在此之前,他使用的是 VertexIterable,而 gremlin 期望的是 Pipeline 对象。
    【解决方案2】:

    使用 2.2 版本,例外情况是:

    java.lang.NoSuchFieldError:ASMAP。

    在 2.3 版中,我得到以下异常:

    线程“主”java.lang.NoSuchMethodError 中的异常:com.tinkerpop.pipes.util.FluentUtility.prepareFunction(Lcom/tinkerpop/pipes/util/structures/AsMap;Lcom/tinkerpop/pipes/PipeFunction;)Lcom/ tinkerpop/管道/PipeFunction;

    但是,查询在控制台中运行良好

    【讨论】:

    • 你原来的 gremlin 在 REPL 中运行吗?您使用的是什么版本的 Gremlin?
    猜你喜欢
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    相关资源
    最近更新 更多