2013-03-13 21 views
6

Sto cercando di scoprire se nel modello avevo una risorsa specifica. Per quello che sto usando:Jena - Come sapere se una risorsa specifica è nel modello?

model.getResource("example") 

Controllando il documento, questo metodo si comporta esattamente come createResource. Quindi, anche se non è nel modello, otterrò una nuova risorsa.

Come posso verificare se la risorsa evita la sua creazione quando non lo è?

Grazie in anticipo!

+0

forse questo collegamento [Modello di interfaccia] (http://jena.apache.org/documentation/javadoc/jena/com/hp/hpl/jena/rdf/model/Model.html) è utile. –

+1

Dopo aver studiato un po 'ho trovato il modo successivo. Non so se questo è davvero il modo migliore per ottenerlo, ma funziona: Resource toSearch = ResourceFactory.createResource ("example"); if (! Model.containsResource (toSearch)) ...; – jevora

+1

Se è risolto, inserisci una risposta e accettala, quindi la persona successiva con lo stesso problema troverà la risposta, riceverai anche un badge! :) – Boaz

risposta

11

A Jena, Resource oggetti di per sé non sono nel modello. Il modello contiene solo triple - Statement oggetti contenenti un oggetto, un predicato e un oggetto (in genere SPO abbreviato). Qualunque S, P o O può essere una risorsa (osservando che uno Property è un sottotipo di Resource in Jena e nello standard RDF). Quindi è necessario perfezionare la domanda da "fa questo modello contiene questa risorsa" a uno:

  • Il modello fa il M contengono risorse R come soggetto?

  • il modello M contiene la risorsa R come soggetto, predicato o oggetto?

Ciò può essere ottenuto come:

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

Per inciso, nel codice di esempio si dispone di

model.getResource("example") 

Questo restituisce un oggetto Resource corrispondente al URI, ma non lo fa lato -effetti i tripli nel modello. Questo è il motivo per cui Model ha sia getResource che createResource - l'ottenimento è potenzialmente leggermente più efficiente dal momento che riutilizza gli oggetti risorsa, ma la semantica è essenzialmente identica. Tuttavia, l'argomento che si passa a getResource o createResourcedeve essere un URI. Stai prendendo in prestito problemi dal futuro se inizi a utilizzare token come "example" al posto di URI completi, quindi ti consiglio di interrompere questa cattiva abitudine prima di metterti comodo!

+0

Grazie mille. Questa è sicuramente la soluzione.Riguardo alla cattiva abitudine, non preoccuparti, nel mio sviluppo sto usando veri URI. Ho appena usato "esempio" perché non importava questa volta. – jevora

+0

Controllo della soluzione: ci sono diversi contenuti che si adattano a r, null, null. Vorrei piuttosto suggerire: model.taintains (risorsa, null, (RDFNode) null) – jevora

+0

Buona cattura. Sì, è un dolore che la firma del metodo per 'contains()' sia abbastanza liberale da richiedere un cast sull'argomento 'object', ma è una decisione progettuale che è stata fatta molto tempo fa nella storia di Jena e sarebbe troppo dirompente per cambiare ora. –

2

Dopo aver studiato un po 'ho trovato il modo successivo. Non so se questo è davvero il modo migliore per raggiungerlo, ma funziona:

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

Questa è una risposta giusta ma devo aspettare 2 giorni per contrassegnarla come corretta – jevora

Problemi correlati