E 'possibile scoprire se due istanze sono della stessa classe, a livello di codice (utilizzando l'API come JENA)È possibile scoprire se due istanze sono della stessa classe RDF, a livello di programmazione?
risposta
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.
+1, solo risposta non fuori tema o ora – ysdx
Ora che SPARQL 1.1 ha percorsi di proprietà, la query SPARQL si semplifica in 'ASK {? Class^a
confrontare i loro classi:
boolean same = obj1.getClass().equals(obj2.getClass());
+1: è possibile utilizzare anche '=='. –
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. –
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
}
Questo è più piacevole. Guava ha 'Sets.intersection' che sarebbe ancora più leggibile. Errore di battitura: '... types1 = i1.listRDFTypes ...' – user205512
Grazie, errore di battitura fisso –
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
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
}
È possibile utilizzare metodi Java puri? – Jivings
Perché Jena? Puoi facilmente ottenere il '.class' dei due oggetti e confrontarli. –
Non penso che la domanda riguardi istanze e classi java, ma istanze e classi RDF/OWL. – user205512