2010-07-19 20 views
5

Próbuję załadować biblioteki Clojure dla RDF clj-plaza w Clojure REPL tak:Clojure: No wdrożenie metody w protokole

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

mam folder o nazwie Plaza i podfolder o nazwie RDF i plik core.clj dostępne i o ile mogę powiedzieć, Clojure REPL ładuje bibliotekę tak, jak powinna.

Teraz, jeśli zrobić

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

i znowu, o ile mogę powiedzieć biblioteka core.clj donosi, jak powinien. Teraz robię

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

uzyskać ten sam rezultat, jeśli spróbuję f.ex.

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

W kodzie źródłowym (core.clj) jest metoda zwana obciążenia strumień w RDFModel protokołu

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

i załadować strumienia jest realizowany

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

nie mogę wydawać aby wskazać, co tu jest nie tak, w kodzie źródłowym wszystko wydaje się zsumować.

Odpowiedz

3

Fragment (defn document-to-model ...) nie implementuje load-stream; implementuje on funkcję o nazwie document-to-model, która wywołuje load-stream z wieloma argumentami, z których pierwszy - *rdf-model* - musi być typu, do którego został rozszerzony protokół RDFModel (lub który implementuje bezpośrednio protokół lub odpowiedni interfejs) .

clj-plaza zawiera dwie implementacje RDFModel, w przestrzeni nazw plaza.rdf.implementations.sesame (patrz (deftype SesameModel ..., line 218 w źródle) i plaza.rdf.implementations.jena (patrz (deftype JenaModel ..., line 167). require -sądzą, że powinny wystarczyć do wykonania wspomnianych implementacji; wtedy możesz użyć ich z odpowiednim rodzajem *rdf-model*.

+0

Marczyk mam podobny problem, ale pojawia się „No wdrożenie metody.:: jest literałem protokołu: # 'plaza.rdf.core/RDFNode znaleziony dla klasy: Słowo kluczowe. Wymagałem zarówno plaza.rdf.implementations.sesame, jak i plaza.rdf.implementations.jena. Zacznę inne pytanie, jeśli potrzebujesz więcej szczegóły: – aduric

+0

@aduric: Wygląda na to, że używasz słowa kluczowego w miejscu, w którym spodziewany jest typ implementujący 'RDFNode' - prawdopodobnie w wywołaniu' alter-root-model' lub 'with-model' .Jeśli możesz ' Jeśli znajdziemy problematyczne miejsce, myślę, że użyteczne byłoby osobne pytanie z większą ilością szczegółów (NB: od jakiegoś czasu nie patrzyłem na clj-plaza, więc jeśli jest tu jakiś wspólny problem, może być zagubionym.) –

1

jeden krok po (wymaga ... jest (init-Jena-ram) lub (init-sezamowym-ram)

Powiązane problemy