如何通过查询字符串在TinkerGraph中执行外部文件的Gremlin查询?
在TinkerGraph中执行外部文件里的Gremlin查询字符串
直接可行的实现方案
要实现从外部文件读取Gremlin字符串并执行,核心是用Gremlin自带的脚本引擎,把你的遍历源实例绑定到脚本上下文,让脚本能识别g变量。下面是完整的可运行代码:
完整代码示例
import org.apache.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONReader; import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph; import javax.script.Bindings; import javax.script.ScriptEngine; import javax.script.ScriptException; import java.io.FileInputStream; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; public class RunExternalGremlinQuery { public static void main(String[] args) throws IOException, ScriptException { // 初始化TinkerGraph并导入数据 TinkerGraph graph = TinkerGraph.open(); GraphTraversalSource g = graph.traversal(); try (FileInputStream input = new FileInputStream("graph.json")) { GraphSONReader reader = GraphSONReader.build().create(); reader.readGraph(input, graph); } // 读取外部文件中的Gremlin查询语句 String gremlinScript = new String(Files.readAllBytes(Paths.get("gremlin_query.txt"))); // 初始化Gremlin Groovy脚本引擎 ScriptEngine gremlinEngine = new GremlinGroovyScriptEngine(); // 把我们的遍历源g绑定到脚本上下文 Bindings contextBindings = gremlinEngine.createBindings(); contextBindings.put("g", g); // 脚本里的g就指向我们创建的这个遍历源 // 执行查询并输出结果 Object queryResult = gremlinEngine.eval(gremlinScript, contextBindings); System.out.println("查询结果:" + queryResult); // 关闭图资源 graph.close(); } }
核心步骤拆解
- 读取外部查询文件:用
Files.readAllBytes直接读取文本文件内容,拿到完整的Gremlin脚本字符串。 - 初始化脚本引擎:
GremlinGroovyScriptEngine是官方提供的专门解析Gremlin脚本的引擎,支持执行字符串形式的Gremlin语句。 - 绑定上下文变量:通过
Bindings把我们自己创建的g实例注入到脚本环境中,这样脚本里写的g.V()才能正确关联到你的TinkerGraph,而不是重新生成一个空的遍历源。 - 执行并获取结果:调用
eval方法执行脚本,传入绑定好的上下文,就能得到查询的结果对象。
关于ConcurrentBindings的说明
之前看到的ConcurrentBindings就是线程安全版的Bindings,如果你的程序是多线程并发执行查询的场景,就用它替换普通的Bindings;单线程场景下,用普通Bindings完全够用。
内容的提问来源于stack exchange,提问作者Incognitex
相关产品推荐
相关产品推荐

