我正在尝试使用TinkerGraph初始化内存图。
首先,我已经在我的上下文xml文件中定义了bean,并尝试初始化TinkerGraph。
我的目的是对我为形成 gremlin 查询而创建的类进行单元测试,我从这些类中获得的结束查询采用字符串的形式,因此为了通过 TinkerGraph 执行它们,我使用了以下帖子中给出的方法: 将 Gremlin 查询作为字符串获取并在 java 中执行它,而无需将其提交给 GremlinServer
我还想知道我采用的方法是否是首选方法,用于将 gremlin 查询作为单元测试的一部分运行?
以下是我在pom中包含的依赖项.xml:
<dependency>
<groupId>org.apache.tinkerpop</groupId>
<artifactId>tinkergraph-gremlin</artifactId>
<version>3.2.4</version>
</dependency>
<dependency>
<groupId>org.apache.tinkerpop</groupId>
<artifactId>gremlin-groovy</artifactId>
<version>3.0.2-incubating</version>
</dependency>
EmbeddedGremlinQueryEngine 如下:
import org.apache.tinkerpop.gremlin.driver.Result;
import org.apache.tinkerpop.gremlin.driver.ResultSet;
import org.apache.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.script.Bindings;
import javax.script.ScriptEngine;
import javax.script.ScriptException;
import java.util.List;
public class UcsEmbeddedGremlinQueryEngine implements GremlinEngine{
private static final Logger logger = LoggerFactory.getLogger(UcsEmbeddedGremlinQueryEngine.class);
private GraphTraversalSource graphTraversalSource = null;
private Graph graph = null;
private ScriptEngine engine = null;
private Bindings bindings = null;
public UcsEmbeddedGremlinQueryEngine() {
graph = TinkerGraph.open();
graphTraversalSource = graph.traversal();
engine = new GremlinGroovyScriptEngine();
bindings = engine.createBindings();
bindings.put("g", graphTraversalSource);
}
public void shutdown() throws Exception {
if (graph != null){
graph.close();
}
logger.info("TinkerGraph shutdown complete.");
}
@Override
public List<Result> query(String query) {
List<Result> res = null;
try {
ResultSet results = (ResultSet) engine.eval(query, bindings);
res = results.all().join();
for (Result r : res) {
System.out.println("result: " + r + 'n');
}
} catch (ScriptException e) {
e.printStackTrace();
}
return res;
}
// This function reads the initScript and run them as gremlin queries.
public synchronized void initialize() {
logger.debug("Initializing embedded TinkerGraph. This will only take a few seconds....");
//TODO include the execution of queries as part of initialisation
}
}
堆栈跟踪如下:
java.lang.NoClassDefFoundError: org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource$GraphTraversalSourceStub
at org.apache.tinkerpop.gremlin.groovy.loaders.StepLoader.load(StepLoader.groovy:54)
at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:236)
at org.apache.tinkerpop.gremlin.groovy.loaders.GremlinLoader.load(GremlinLoader.groovy:28)
at org.apache.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine.<init>(GremlinGroovyScriptEngine.java:189)
at org.apache.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine.<init>(GremlinGroovyScriptEngine.java:172)
at com.intuit.gro.mcsdata.gemlinengine.UcsEmbeddedGremlinQueryEngine.<init>(UcsEmbeddedGremlinQueryEngine.java:28)
EmbeddedGremlinQueryEngine 在 xml 文件中被定义为一个 bean,当 bean 被加载时,我得到的错误为 构造函数抛出异常;嵌套的例外是java.lang.NoClassDefFoundError: org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource$GraphTraversalSourceStub
我不明白 GraphTraversalSourceStub 在初始化期间是如何出现的,我无法找到有关它的任何信息。 任何帮助将不胜感激。
我认为你的问题是你:
- 使用非常非常旧版本的TinkerPop
- 您使用的旧版本可能不兼容
我不确定您是否有理由使用 3.2.4,但如果是这样,请确保 gremlin-groovy 也是 3.2.4。请注意,此时基本上没有维护 3.2.x 行代码,最后一个版本是大约 6 个月前的 3.2.11。如果您正在开发一个新应用程序,那么我强烈建议您仅使用几周前发布的最新版本的3.4.2。
至于你的测试方法,我想这很好。如果你有测试Gremlin字符串,那么你真的没有太多其他选择,除了使用Gremlin服务器。显然,为GremlinGroovyScriptEngine
提供测试工具要容易得多。
对于版本3.4.0,您至少需要以下类路径。
set cp=%cp%;C:pathToM2Repoorgapachetinkerpopgremlin-core3.4.0gremlin-core-3.4.0.jar
set cp=%cp%;C:pathToM2Repoorgapachetinkerpopgremlin-driver3.4.0gremlin-driver-3.4.0.jar
set cp=%cp%;C:pathToM2Repoorgapachetinkerpopgremlin-groovy3.4.0gremlin-groovy-3.4.0.jar
set cp=%cp%;C:pathToM2Repoorgapachetinkerpopgremlin-server3.4.0gremlin-server-3.4.0.jar
set cp=%cp%;C:pathToM2Repoorgapachetinkerpopgremlin-shaded3.4.0gremlin-shaded-3.4.0.jar
set cp=%cp%;C:pathToM2Repoorgapachetinkerpoptinkergraph-gremlin3.4.0tinkergraph-gremlin-3.4.0.jar
set cp=%cp%;C:pathToM2Repoorgapachetinkerpoptinkerpop3.4.0tinkerpop-3.4.0.jar
set cp=%cp%;C:pathToM2Repocommons-configurationcommons-configuration1.10commons-configuration-1.10.jar
set cp=%cp%;C:pathToM2Repoorgslf4jslf4j-api1.7.25slf4j-api-1.7.25.jar
set cp=%cp%;C:pathToM2Repoorgapachelogginglog4jlog4j-slf4j-impl2.11.1log4j-slf4j-impl-2.11.1.jar
set cp=%cp%;C:pathToM2Repoorgapachelogginglog4jlog4j-api2.11.1log4j-api-2.11.1.jar
set cp=%cp%;C:pathToM2Repoorgapachelogginglog4jlog4j-core2.11.1log4j-core-2.11.1.jar
set cp=%cp%;C:pathToM2Repoorgcodehausgroovygroovy2.5.4groovy-2.5.4-indy.jar
set cp=%cp%;C:pathToM2Repoorgcodehausgroovygroovy-json2.5.4groovy-json-2.5.4-indy.jar
set cp=%cp%;C:pathToM2Repoorgcodehausgroovygroovy-xml2.5.5groovy-xml-2.5.5.jar
set cp=%cp%;C:pathToM2Repoorgcodehausgroovygroovy-templates2.5.5groovy-templates-2.5.5.jar
set cp=%cp%;C:pathToM2Repoorgjavatuplesjavatuples1.2javatuples-1.2.jar
set cp=%cp%;C:pathToM2Repocommons-collectionscommons-collections3.2.2commons-collections-3.2.2.jar
set cp=%cp%;C:pathToM2Repoionettynetty-all4.1.31.Finalnetty-all-4.1.31.Final.jar