将Gremlin查询作为String获取并在java中执行它而不将其提交给GremlinServer

时间:2018-05-09 13:16:24

标签: java gremlin gremlin-server

我有一个字符串格式的Gremlin查询(例如" g.V()")。我想执行此String而不将其提交给GremlinServer。

我使用以下依赖项:

<cstddef>

有什么办法吗?

2 个答案:

答案 0 :(得分:4)

您可以直接在GremlinGroovyScriptEngineGremlinExecutor执行Gremlin字符串(它只是将字符串传递给GremlinGroovyScriptEngine,但还有一些额外的功能)。简单地将Gremlin字符串传递给适当的eval()方法,并从该脚本评估中获取结果。这基本上就是Gremlin Server在内部所做的事情。

您可能需要gremlin-groovy依赖项而不是gremlin-driver

答案 1 :(得分:0)

添加基于斯蒂芬答案+评论的“完整”示例:

public static void main(String[] args) throws ScriptException, ExecutionException, InterruptedException {
    Graph graph = TinkerGraph.open();
    Configuration c = graph.configuration();
    GraphTraversalSource g = graph.traversal();

    // Creating graph
    Vertex marko = g.addV("person").property("name","marko").property("age",29).next();
    Vertex lop = g.addV("software").property("name","lop").property("lang","java").next();
    g.addE("created").from(marko).to(lop).property("weight",0.6d).iterate();
    g.io("test.xml").write().iterate(); // saving to file

    //standard query
    GraphTraversal<Vertex, Map<Object, Object>> javaQueryResult = g.V().hasLabel("person").valueMap();

    // preparing GremlinExecutor
    ConcurrentBindings b = new ConcurrentBindings();
    b.putIfAbsent("g", g);

    GremlinExecutor ge = GremlinExecutor.build().evaluationTimeout(15000L).globalBindings(b).create();

    CompletableFuture<Object> evalResult = ge.eval("g.V().hasLabel('person').valueMap()");
    GraphTraversal actualResult = (GraphTraversal) evalResult.get();
}

简单的调试应用程序,用于检查从字符串评估的结果与标准查询的比较。

使用maven依赖项tinkergraph-gremlin gremlin-core gremlin-groovy,版本3.4.6