简体   繁体   中英

Clojure: No implementation of method in protocol

I am trying to load the Clojure library for RDF clj-plaza in Clojure REPL like so:

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

I have a folder named plaza, and a subfolder named rdf and the file core.clj available and as far as I can tell, Clojure REPL loads the library as it should.

Now, if I do

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

And again, as far as I can tell the core.clj library is reporting as it should. Now I do

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

I get the same result if I try f.ex.

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

In the source code (core.clj) there is a method called load-stream in the protocol RDFModel

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

And load-stream is implemented

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

I can't really seem to pinpoint what is wrong here, in the source code it all seems to add up.

The (defn document-to-model ...) snippet does not implement load-stream ; it implements a function called document-to-model which calls load-stream with a bunch of arguments, the first of which -- *rdf-model* -- needs to be of a type to which the RDFModel protocol has been extended (or which implements the protocol or the corresponding interface directly).

clj-plaza provides two implementations of RDFModel , in the namespaces plaza.rdf.implementations.sesame (see (deftype SesameModel ... , line 218 in the source) and plaza.rdf.implementations.jena (see (deftype JenaModel ... , line 167 ). require -ing them should be enough to pull in said implementations; then you can use them with *rdf-model* s of appropriate type.

再过一步(要求...是(init-jena-framework)或(init-sesame-framework)。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM