3

我正在尝试重写位于clojure 中的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))))

我在所有地方都尝试过各种类型的提示,但我仍然遇到同样的错误。

4

2 回答 2

1

这是因为 varargs Label... 参数。这是我不知道的一些 Clojure/Java 互操作:您必须将参数作为数组传递(即使只有一个),所以您需要执行以下操作:

(. db (createNode (into-array Label [l])))

让它工作。还有一个下午我不会回来了!

于 2014-12-15T02:24:42.417 回答
1

示例 java 代码中对 dynamicLabel 的调用如下所示:

DynamicLabel.label( "User" )

这将转化为:

(DynamicLabel/label "user")

org.neo4j.graphdb.DynamicLabel因为 label 是具有签名的类的静态方法:

 static Label   label(String labelName) 
于 2014-04-10T23:16:38.150 回答