2013-03-13 7 views
6

Ich versuche herauszufinden, ob ich eine bestimmte Ressource im Modell hatte. Dazu verwende ich:Jena - Wie kann man wissen, ob eine bestimmte Ressource im Modell ist?

model.getResource("example") 

Überprüfung des Dokuments, diese Methode verhält sich genau wie createResource. Dann, auch wenn es nicht im Modell ist, werde ich eine neue Ressource bekommen.

Wie kann ich überprüfen, ob ich die Ressource habe, die ihre Erstellung vermeidet, wenn sie nicht vorhanden ist?

Vielen Dank im Voraus!

+0

vielleicht ist dieser Link [Schnittstellenmodell] (http://jena.apache.org/documentation/javadoc/jena/com/hp/hpl/jena/rdf/model/Model.html) nützlich. –

+1

Nach etwas Recherche habe ich den nächsten Weg gefunden. Ich weiß nicht, ob dies wirklich der beste Weg ist, um es zu erreichen, aber funktioniert: Ressource toSearch = ResourceFactory.createResource ("Beispiel"); if (! Model.containsResource (toSearch)) ...; – jevora

+1

Wenn es gelöst ist, dann posten Sie eine Antwort und akzeptieren Sie sie, damit die nächste Person mit dem gleichen Problem die Antwort findet, Sie erhalten auch ein Abzeichen! :) – Boaz

Antwort

11

In Jena, Resource Objekte selbst sind nicht in das Modell. Das Modell enthält nur Tripel - Statement Objekte, die einen Subjekt, ein Prädikat und ein Objekt enthalten (normalerweise abgekürzt SPO). Irgendeines von S, P oder O kann eine Ressource sein (wobei angemerkt wird, dass ein Property ein Untertyp von Resource in Jena und in dem RDF-Standard ist). Sie müssen also Ihre Frage verfeinern aus „ist dieses Modell diese Ressource enthalten“ entweder:

  • hat Modell M enthalten Ressource R als Subjekt?

  • enthält Modell M die Ressource R als Subjekt, Prädikat oder Objekt?

Dies kann erreicht werden:

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)) { 
    .. 
} 

Übrigens Sie in Ihrem Codebeispiel

haben
model.getResource("example") 

Dies gibt eine Resource Objekt an die angegebene URI entspricht, tut aber nicht Seite - Wirf die Tripel im Modell auf. Dies ist der Grund, dass Model sowohl getResource als auch createResource hat - get ist möglicherweise etwas effizienter, da es Ressourcenobjekte wiederverwendet, aber die Semantik ist im Wesentlichen identisch. Das Argument, das Sie an getResource oder createResourceübergeben, sollte jedoch eine URI sein. Sie leihen sich Ärger aus der Zukunft, wenn Sie Token wie "example" anstelle von vollständigen URIs verwenden, also würde ich empfehlen, diese schlechte Angewohnheit zu stoppen, bevor Sie sich damit vertraut machen!

+0

Vielen Dank. Das ist definitiv die Lösung.Über die schlechte Angewohnheit, mach dir keine Sorgen, in meiner Entwicklung verwende ich echte URIs. Ich habe nur "Beispiel" benutzt, weil es diesmal keine Rolle spielte. – jevora

+0

Überprüfung der Lösung: Es gibt mehrere enthält, die mit r, null, null passen. Ich würde eher vorschlagen: model.contains (Ressource, null, (RDFNode) null) – jevora

+0

Guter Fang. Ja, es ist ein Schmerz, dass die Methodensignatur für 'contains()' liberal genug ist, um eine Umwandlung in das 'object'-Argument zu verlangen, aber es ist eine Designentscheidung, die vor langer Zeit in der frühen Jenaer Geschichte gemacht wurde und zu störend wäre jetzt ändern. –

2

Nach ein wenig Recherche habe ich den nächsten Weg gefunden. Ich weiß nicht, ob dies wirklich der beste Weg, es zu erreichen, aber funktioniert:

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

Dies ist eine richtige Antwort, aber ich muss 2 Tage warten, um es als richtig zu markieren – jevora