2012-01-29 14 views

risposta

8

Facile nel SPARQL:

ASK { <instance1> a ?class . <instance2> a ?class . } 

A Jena API:

boolean shareClass = false; 
for (Statement s: instance1.listProperties(RDF.type)) { 
    if (instance2.hasProperty(RDF.type, s.getObject()) { 
     shareClass = true; 
     break; 
    } 
} 

Non ve ry elegante.

+0

+1, solo risposta non fuori tema o ora – ysdx

+0

Ora che SPARQL 1.1 ha percorsi di proprietà, la query SPARQL si semplifica in 'ASK {? Class^a , }'. Cattura molto bene "c'è una classe di cui instance1 e instance2 sono istanze?" –

0

confrontare i loro classi:

boolean same = obj1.getClass().equals(obj2.getClass()); 
+0

+1: è possibile utilizzare anche '=='. –

+1

L'OP non era chiaro al 100%, ma la domanda più probabile riguarda le classi e le istanze RDF/OWL, non il confronto delle classi Java. –

4

Supponendo che si stia utilizzando l'API di ontologia di Jena, è piuttosto semplice. Nota che in RDF, una determinata istanza può avere molti tipi, quindi la tua domanda è davvero "come posso verificare se due istanze hanno uno o più tipi in comune?".

Lo farei come segue. Si assuma le due istanze si desidera testare sono Individual oggetti (si noti che si può fare questo con OntResource, o anche Resource con un leggero cambiamento nel codice):

Individual i0 = ....; 
Individual i1 = ....; 

Elenco dei valori rdf:type per ciascuno, e li convertono a insiemi

Set<Resource> types0 = i0.listRDFTypes(false).toSet(); 
Set<Resource> types1 = i1.listRDFTypes(false).toSet(); 

hanno tipi comuni se l'intersezione non è vuota:

types0.retainAll(types1); 
if (!types0.isEmpty()) { 
    // at least one type in common 
    // types0 contains the common type resources 
} 
+0

Questo è più piacevole. Guava ha 'Sets.intersection' che sarebbe ancora più leggibile. Errore di battitura: '... types1 = i1.listRDFTypes ...' – user205512

+0

Grazie, errore di battitura fisso –

+0

Ciao, ho ancora un po 'di confusione. Spero che tu possa chiarirlo. Come hai suggerito, ottengo i tipi e confronta la loro intersezione. Il problema è: per istanze di due classi diverse, 'listRDFTypes' restituisce ancora' [http://www.w3.org/2002/07/owl#Class] 'come tipo. Di conseguenza, ogni due istanze che prendo sono dello stesso tipo. Mi sto perdendo qualcosa? – PCoder

-1

prendo th è un'estensione del tuo post precedente, quindi

if (resource1.hasProperty(model.createProperty("http://www.w3.org/1999/02/22-rdf-syntax-ns#", "type"), model.createResource("http://typeUri")) && resource2.hasProperty(model.createProperty("http://www.w3.org/1999/02/22-rdf-syntax-ns#", "type"), model.createResource("http://typeUri"))) { 
    // both resources are the same type 
}