2010-07-19 13 views
5

Estoy tratando de cargar la biblioteca Clojure para RDF clj-plaza en Clojure REPL así:Clojure: No aplicación del método en el protocolo de

user=> (use 'plaza.rdf.core) 
nil 

tengo una plaza carpeta llamada, y una RDF subcarpeta con el nombre y el archivo core.clj disponible y por lo que puedo decir, Clojure REPL carga la biblioteca como debería.

Ahora, si hago

user=> (alter-root-rdf-ns “http://www.example.org/”) 
"http://www.example.org" 

Y de nuevo, por lo que yo puedo decir la biblioteca core.clj informa como debería. la actualidad aún

(def e (document-to-model “http://www.snee.com/rdf/elvisimp.rdf” :xml)) 
java.lang.IllegalArgumentException: No implementation of method: :load-stream of protocol: #’plaza.rdf.core/RDFModel found for class: nil (NO_SOURCE_FILE:2) 

puedo obtener el mismo resultado si intento f.ex.

(make-triples [["http://triple1" "http://triple2" "http://triple3"]]) 

En el código fuente (core.clj) hay un método llamado de carga de la corriente en el protocolo de RDFModel

(defprotocol RDFModel 
    "Operations for the manipulation of RDF" 
    .... 
    (load-stream [model stream format] "Load triples from a stream") 
    .... 

y la carga de la corriente se implementa

(defn document-to-model 
    "Adds a set of triples read from a serialized document into a model" 
    ([stream format] 
    (load-stream *rdf-model* stream format))) 

Realmente no puedo parecer para identificar lo que está mal aquí, en el código fuente todo parece sumarse.

Respuesta

3

El fragmento (defn document-to-model ...) no implementa load-stream; implementa una función llamada document-to-model que llama a load-stream con un grupo de argumentos, el primero de los cuales - *rdf-model* - debe ser de un tipo al que se ha extendido el protocolo RDFModel (o que implementa el protocolo o la interfaz correspondiente directamente) .

clj-plaza proporciona dos implementaciones de RDFModel, en los espacios de nombres plaza.rdf.implementations.sesame (véase (deftype SesameModel ..., line 218 en la fuente) y plaza.rdf.implementations.jena (véase (deftype JenaModel ..., line 167). require -ellas debería ser suficiente para tirar de dichas implementaciones; luego puede usarlos con *rdf-model* s del tipo apropiado.

+0

Marczyk Tengo un problema similar pero me sale "No aplicación del método.:: is-literal del protocolo: # 'plaza.rdf.core/RDFNode encontrado para la clase: palabra clave. Necesité tanto plaza.rdf.implementations.sesame como plaza.rdf.implementations.jena. Comenzaré otra pregunta si necesita más Detalles – aduric

+0

@aduric: Parece que está usando una palabra clave en algún lugar donde se espera un tipo que implementa 'RDFNode', posiblemente en una llamada a' alter-root-model' o 'with-model'? Si puede ' Para encontrar un lugar problemático como ese, creo que una pregunta separada con más detalles sería útil. (NB. No he mirado clj-plaza desde hace tiempo, así que si hay algún problema relacionado aquí, podría no te lo pierdas). –

1

un paso más después (requiere ... es (init-Jena-marco) o (init-sésamo-marco)

Cuestiones relacionadas