我正在尝试在clojure中重写位于here的neo4j示例代码。但是当我尝试创建节点时,我收到以下错误
ClassCastException Cannot cast org.neo4j.graphdb.DynamicLabel to [Lorg.neo4j.graphdb.Label; java.lang.Class.cast (Class.java:3094)
这是我的代码:
(ns neotest.handler
(:import (org.neo4j.graphdb
DynamicLabel
GraphDatabaseService
Label
Node
ResourceIterator
Transaction
factory.GraphDatabaseFactory
schema.IndexDefinition
schema.Schema)))
(def db
(let [path "C:\\Users\\xxx\\code\\neotest\\resources\\db1"]
(. (new GraphDatabaseFactory) (newEmbeddedDatabase path))))
(defn create-node []
(try (let [tx (. db beginTx)
l (. DynamicLabel (label "User"))]
(. db (createNode l))
(. tx success))))
我尝试了各种类型的提示,但我仍然遇到同样的错误。
答案 0 :(得分:1)
示例java代码中对dynamicLabel的调用如下所示:
DynamicLabel.label( "User" )
将转换为:
(DynamicLabel/label "user")
因为label是类org.neo4j.graphdb.DynamicLabel
的静态方法,它具有签名:
static Label label(String labelName)
答案 1 :(得分:1)
这是因为varargs Label ...参数。这是一个我不知道的Clojure / Java互操作:你必须将参数作为数组传递(即使只有一个),所以你需要做类似的事情:
(. db (createNode (into-array Label [l])))
让它发挥作用。又过了一个下午,我又回来了!