2010-07-19 36 views
5

Tôi cố gắng để tải các thư viện Clojure cho RDF clj-plaza trong Clojure REPL như vậy:Clojure: Không thực hiện phương pháp trong giao thức

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

Tôi có một thư mục có tên plaza, và một thư mục con tên là rdf và tập tin core.clj có sẵn và theo như tôi có thể nói, Clojure REPL tải thư viện như nó cần.

Bây giờ, nếu tôi làm

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

Và một lần nữa, như xa như tôi có thể nói với các thư viện core.clj được báo cáo như mong muốn. Bây giờ tôi làm

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

Tôi nhận được kết quả tương tự nếu tôi thử f.ex.

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

Trong mã nguồn (core.clj) có một phương pháp gọi là tải dòng trong giao thức RDFModel

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

Và tải dòng được thực hiện

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

tôi có thể không thực sự dường như để xác định những gì là sai ở đây, trong mã nguồn nó tất cả dường như thêm lên.

Trả lời

3

Đoạn mã (defn document-to-model ...) không triển khai load-stream; nó thực hiện một hàm gọi là document-to-model gọi là load-stream với một loạt đối số, đầu tiên trong số đó - *rdf-model* - cần phải là loại mà giao thức RDFModel đã được mở rộng (hoặc thực hiện giao thức hoặc giao diện tương ứng trực tiếp) .

clj-plaza cung cấp hai triển khai của RDFModel, trong không gian tên plaza.rdf.implementations.sesame (xem (deftype SesameModel ..., line 218 trong nguồn) và plaza.rdf.implementations.jena (xem (deftype JenaModel ..., line 167). require -ing chúng nên đủ để kéo vào việc triển khai đã nói; sau đó bạn có thể sử dụng chúng với *rdf-model* s loại thích hợp.

+0

Marczyk Tôi gặp vấn đề tương tự nhưng tôi nhận được "Không triển khai phương thức:: theo nghĩa đen của giao thức: # 'plaza.rdf.core/RDFNode được tìm thấy cho lớp: Từ khoá. Tôi yêu cầu cả hai plaza.rdf.implementations.sesame và plaza.rdf.implementations.jena. Tôi sẽ bắt đầu một câu hỏi khác nếu bạn cần thêm – aduric

+0

@aduric: Dường như bạn đang sử dụng từ khóa ở đâu đó nơi một loại thực thi 'RDFNode' được mong đợi - có thể trong lệnh gọi đến' alter-root-model' hoặc 'with-model'? Nếu bạn có thể ' Tôi thấy một câu hỏi có vấn đề như vậy, tôi đoán một câu hỏi riêng biệt với nhiều chi tiết hơn sẽ hữu ích (NB. Tôi đã không xem clj-plaza trong một thời gian, vì vậy nếu có một số vấn đề thường gặp ở đây, tôi có thể thiếu nó.) –

1

một bước nữa sau (yêu cầu ... là (init-jena-framework) hoặc (init-mè-framework).

Các vấn đề liên quan