Clojure: нет реализации метода в протоколе - PullRequest
5 голосов
/ 19 июля 2010

Я пытаюсь загрузить библиотеку Clojure для RDF clj-plaza в REPL Clojure следующим образом:

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

У меня есть папка с именем plaza и подпапка с именем rdf ифайл core.clj доступен, и, насколько я могу судить, Clojure REPL загружает библиотеку как следует.

Теперь, если я сделаю

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

И снова, насколько ямогу сказать, что библиотека core.clj сообщает как следует.Теперь я делаю

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

Я получаю тот же результат, если я пытаюсь использовать f.ex.

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

В исходном коде (core.clj) есть метод, называемый load-stream, в протоколе RDFModel

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

И load-stream этореализовано

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

Я не могу точно определить, что здесь не так, в исходном коде все это, кажется, складывается.

Ответы [ 2 ]

3 голосов
/ 20 июля 2010

Фрагмент (defn document-to-model ...) не реализует load-stream;он реализует функцию с именем document-to-model, которая вызывает load-stream с кучей аргументов, первый из которых - *rdf-model* - должен относиться к типу, к которому был расширен протокол RDFModel (или который реализуетпротокол или соответствующий интерфейс напрямую).

clj-plaza обеспечивает две реализации RDFModel в пространствах имен plaza.rdf.implementations.sesame (см. (deftype SesameModel ..., строка 218 в источнике)и plaza.rdf.implementations.jena (см. (deftype JenaModel ..., , строка 167 ).require - их должно быть достаточно, чтобы использовать указанные реализации;тогда вы можете использовать их с *rdf-model* s соответствующего типа.

1 голос
/ 14 июня 2011

еще один шаг после (требуется ... - для (init-jena-framework) или (init-sesame-framework).

...