在嵌入式数据库中使用Scala的Cypher失败

时间:2014-06-02 14:55:51

标签: scala neo4j

我使用来自Scala 2.11.1和Neo4J数据库2.0.3的neo4j-jdbc 2.0.2。虽然通过rest接口向Neo4J服务器发出Cypher查询非常有效,但在嵌入式数据库中使用Cypher查询失败。在研究了Neo4J源代码之后,我发现原因在于Cypher API内部调用ExecutionEngine中的执行。我该怎么做才能解决它?

def main(args: Array[String]) {
  val db = new GraphDatabaseFactory().newEmbeddedDatabase("D:/Datenbanken/neo4j/testsnn")
  val engine = new ExecutionEngine(db)
  val result = engine.execute("MATCH (n) return n")
  println(result)
}

执行此代码在运行时生成

Exception in thread "main" java.lang.NoClassDefFoundError: scala/runtime/AbstractPartialFunction$mcVL$sp
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:455)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:367)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at org.neo4j.cypher.internal.compiler.v2_0.executionplan.verifiers.HintVerifier$.<init>(HintVerifier.scala:31)
at org.neo4j.cypher.internal.compiler.v2_0.executionplan.verifiers.HintVerifier$.<clinit>(HintVerifier.scala)
at org.neo4j.cypher.internal.compiler.v2_0.CypherCompiler.<init>(CypherCompiler.scala:33)
at org.neo4j.cypher.internal.CypherCompiler$VersionProxy.<init>(CypherCompiler.scala:47)
at org.neo4j.cypher.internal.CypherCompiler$.apply(CypherCompiler.scala:37)
at org.neo4j.cypher.ExecutionEngine$$anonfun$org$neo4j$cypher$ExecutionEngine$$createCompiler$2.apply(ExecutionEngine.scala:131)
at org.neo4j.cypher.ExecutionEngine$$anonfun$org$neo4j$cypher$ExecutionEngine$$createCompiler$2.apply(ExecutionEngine.scala:129)
at scala.PartialFunction$AndThen.applyOrElse(PartialFunction.scala:185)
at org.neo4j.cypher.ExecutionEngine.org$neo4j$cypher$ExecutionEngine$$createCompiler(ExecutionEngine.scala:133)
at org.neo4j.cypher.ExecutionEngine$$anonfun$2.apply(ExecutionEngine.scala:78)
at org.neo4j.cypher.ExecutionEngine$$anonfun$2.apply(ExecutionEngine.scala:78)
at org.neo4j.cypher.ExecutionEngine$$anon$1.apply(ExecutionEngine.scala:119)
at org.neo4j.cypher.ExecutionEngine$$anon$1.apply(ExecutionEngine.scala:118)
at org.neo4j.kernel.impl.api.KernelSchemaStateStore.getOrCreate(KernelSchemaStateStore.java:72)
at org.neo4j.kernel.impl.api.SchemaStateConcern.schemaStateGetOrCreate(SchemaStateConcern.java:37)
at org.neo4j.kernel.impl.api.LockingStatementOperations.schemaStateGetOrCreate(LockingStatementOperations.java:124)
at org.neo4j.kernel.impl.api.OperationsFacade.schemaStateGetOrCreate(OperationsFacade.java:412)
at org.neo4j.cypher.ExecutionEngine.getOrCreateFromSchemaState(ExecutionEngine.scala:121)
at org.neo4j.cypher.ExecutionEngine.prepare(ExecutionEngine.scala:77)
at org.neo4j.cypher.ExecutionEngine.execute(ExecutionEngine.scala:59)
at org.neo4j.cypher.ExecutionEngine.execute(ExecutionEngine.scala:54)
at org.neo4j.cypher.javacompat.ExecutionEngine.execute(ExecutionEngine.java:65)
at de.richertt.scalaneonodes.example.Main2$.main(Main2.scala:17)
at de.richertt.scalaneonodes.example.Main2.main(Main2.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)s

3 个答案:

答案 0 :(得分:4)

恢复Mikesname和Michael Hunger的有用评论我能够自己回答这个问题:如果我想使用Scala的嵌入式Neo4j数据库版本和Cypher查询,我必须使用与之相同的Scala版本对于Cypher实现(目前是Scala 2.10),因为它在同一个JRE中运行。

答案 1 :(得分:1)

在Foofighter2146上进一步恢复,我建议不要屏住Scala 2.11支持。如cleishm

所述
  

数据库是一个复杂的软件,更新内部依赖关系不是轻易或快速完成的,特别是对于scala版本这样的基础知识。因此,虽然我们希望提供这样做的时间表,但在此阶段是不可能的。支持具有依赖关系组合的多个版本也不是我们目前能够做的事情。

以及一个很好的建议

  

我强烈建议您尽量减少与Neo4j库在同一JVM中运行的代码量,并避免任何具有与Neo4j当前所需内容不兼容的依赖性或依赖性的内容。理想情况下,请考虑使用Neo4j服务器 - 并将任何定制软件编写为插件或非托管扩展。

我使用的是Neo4j的Traversal框架,因此我可以使用更高级的遍历。在使用embdedded版本找到一些限制后,我将把我的遍历移到extention

干杯。

答案 2 :(得分:1)

更新:Neo4j现在与Scala 2.11兼容,我刚刚更新了gremlin-scala的示例:https://github.com/mpollmeier/gremlin-scala-examples