Pergunta

I am trying to rewrite the neo4j sample code located here in clojure. But when I try to create a node, I get the following error

ClassCastException Cannot cast org.neo4j.graphdb.DynamicLabel to [Lorg.neo4j.graphdb.Label;  java.lang.Class.cast (Class.java:3094)

Here is my code:

(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))))

I have tried type-hinting of all kinds and in all places, and I still get the same error.

Foi útil?

Solução

It's because of the varargs Label... parameter. This was a bit of Clojure/Java interop I didn't know about: you have to pass the parameter in as an array (even if there's only one), so you need to do something like:

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

to make it work. There's another afternoon I won't be getting back!

Outras dicas

the calls to dynamicLabel in the example java code look like:

DynamicLabel.label( "User" )

which would translate to:

(DynamicLabel/label "user")

because label is a static method of the class org.neo4j.graphdb.DynamicLabel which has the signature:

 static Label   label(String labelName) 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top