在Clojure中为Neo4j Embedded投射DynamicLabel到Label

时间:2014-04-10 22:00:21

标签: clojure neo4j clojure-java-interop

我正在尝试在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))))

我尝试了各种类型的提示,但我仍然遇到同样的错误。

2 个答案:

答案 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])))

让它发挥作用。又过了一个下午,我又回来了!