Clojure:协议中没有方法的实现

时间:2010-07-19 14:07:43

标签: java clojure lisp rdf

我正在尝试在Clojure REPL中为RDF clj-plaza加载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)中,协议RDFModel中有一个名为load-stream的方法

(defprotocol RDFModel
  "Operations for the manipulation of RDF"
  ....
  (load-stream [model stream format] "Load triples from a 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 个答案:

答案 0 :(得分:3)

(defn document-to-model ...)代码段未实现load-stream;它实现了一个名为document-to-model的函数,它使用一堆参数调用load-stream,其中第一个参数 - *rdf-model* - 需要是RDFModel的类型协议已被扩展(或直接实现协议或相应的接口)。

clj-plaza在命名空间RDFModel中提供了plaza.rdf.implementations.sesame的两个实现(请参阅源代码中的(deftype SesameModel ...line 218)和plaza.rdf.implementations.jena(见(deftype JenaModel ...line 167)。 require - 它们应该足以引入所述实现;然后你可以使用适当类型的*rdf-model*

答案 1 :(得分:1)

之后又一步(要求...是(init-jena-framework)或(init-sesame-framework)。