2013-03-13 11 views
6

Próbuję odkryć, czy miałem konkretny zasób w modelu. W tym używam:Jena - Jak sprawdzić, czy konkretny zasób znajduje się w modelu?

model.getResource("example") 

Sprawdzanie dokumentu, ta metoda zachowuje się dokładnie tak samo jak createResource. Następnie, nawet jeśli nie ma go w modelu, otrzymam nowy zasób.

Jak mogę sprawdzić, czy zasób unika tworzenia, gdy nie jest?

Z góry dziękuję!

+0

Może ten link [Model interfejsu] (http://jena.apache.org/documentation/javadoc/jena/com/hp/hpl/jena/rdf/model/Model.html) jest przydatny. –

+1

Po drobnych poszukiwaniach znalazłem następny sposób. Nie wiem, czy to naprawdę najlepszy sposób, aby to osiągnąć, ale działa: Resource toSearch = ResourceFactory.createResource ("przykład"); if (! Model.containsResource (toSearch)) ...; – jevora

+1

Jeśli zostanie rozwiązany, opublikuj odpowiedź i zaakceptuj ją, aby następna osoba z tym samym problemem znalazła odpowiedź, otrzymasz także odznakę! :) – Boaz

Odpowiedz

11

W Jenie, Resource obiekty same w sobie nie są w model. Model zawiera tylko trójek - Statement obiektów zawierających temat, predykat i obiekt (zwykle w skrócie SPO). Każdy z S, P lub O może być zasobem (zauważając, że Property jest podtypem Resource w Jenie i standardzie RDF). Musisz więc sprecyzować swoje pytanie od "czy ten model zawiera ten zasób" do:

  • czy model M zawiera zasób R jako temat?

  • czy model M zawiera zasób R jako podmiot, predykat lub obiekt?

ten można osiągnąć jak:

Resource r = ... ; 
Model m = ... ; 

// does m contain r as a subject? 
if (m.contains(r, null, (RDFNode) null)) { 
    .. 
} 

// does m contain r as s, p or o? 
if (m.containsResource(r)) { 
    .. 
} 

Nawiasem mówiąc, w próbce kodu masz

model.getResource("example") 

ta zwraca obiekt Resource odpowiadający danym URI, ale nie obok -poprawka trójki w modelu. Jest to powód, dla którego Model ma zarówno getResource jak i createResource - get jest potencjalnie nieco bardziej efektywny, ponieważ ponownie wykorzystuje obiekty zasobów, ale semantyka jest zasadniczo identyczna. Jednak argument, który należy przekazać do getResource lub createResource, powinien być identyfikatorem URI. Pożyczasz kłopoty z przyszłości, jeśli zaczniesz używać tokenów takich jak "example" w miejsce pełnego identyfikatora URI, więc radziłbym powstrzymać ten zły nawyk zanim nie poczujesz się komfortowo!

+0

Dziękuję bardzo. To zdecydowanie rozwiązanie.O złym nawyku, nie martw się, w moim rozwoju używam prawdziwych URI. Po prostu użyłem "przykładu", ponieważ tym razem nie miało to znaczenia. – jevora

+0

Sprawdzanie rozwiązania: istnieje kilka elementów, które pasują do r, null, null. Wolałbym zasugerować: model.contains (resource, null, (RDFNode) null) – jevora

+0

Dobry połów. Tak, to ból, że sygnatura metody 'zawiera()' jest wystarczająco liberalna, aby wymagać rzutowania na argument "obiektu", ale jest to decyzja projektowa, która została podjęta dawno temu w początkowej historii Jeny i byłaby zbyt uciążliwa. zmienić teraz. –

2

Po zbadaniu trochę znalazłem następną drogę. Nie wiem, czy to jest rzeczywiście najlepszym sposobem, aby to osiągnąć, ale działa:

Resource toSearch = ResourceFactory.createResource("example"); 
if(!model.containsResource(toSearch))...; 
+0

To jest odpowiednia odpowiedź, ale muszę poczekać 2 dni, aby oznaczyć ją jako dobrą – jevora

Powiązane problemy