2012-01-29 15 views
7

¿Es posible averiguar si dos instancias son de la misma clase, mediante programación (usando la API como JENA)¿Es posible averiguar si dos instancias son de la misma clase RDF, programáticamente?

+0

¿Puede utilizar métodos puros de Java? – Jivings

+2

¿Por qué Jena? Puede obtener fácilmente la '.class' de los dos objetos y compararlos. –

+2

No creo que la pregunta se refiera a las instancias y clases de Java, sino a las instancias y clases de RDF/OWL. – user205512

Respuesta

8

Fácil en SPARQL:

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

En API de Jena:

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

No es posible ry elegante.

+0

+1, solo respuesta no fuera del tema o ahora – ysdx

+0

Ahora que SPARQL 1.1 tiene rutas de acceso de propiedad, la consulta SPARQL se simplifica a 'ASK {? Class^a , }'. Captura muy bien "¿hay una clase de la cual instancia1 e instancia2 son instancias?" –

0

comparar sus clases:

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

+1: El '==' también se puede usar. –

+1

El OP no era 100% claro al respecto, pero la pregunta más probable es acerca de las clases e instancias RDF/OWL, no la comparación de la clase Java. –

4

Suponiendo que está utilizando la API de ontología de Jena, es bastante sencillo. Tenga en cuenta que en RDF, una instancia determinada puede tener muchos tipos, por lo que su pregunta es realmente "¿cómo puedo probar si dos instancias tienen uno o más tipos en común?".

Lo haría de la siguiente manera. Asumen las dos instancias que desea probar son Individual objetos (tenga en cuenta que usted puede hacer esto con OntResource, o incluso Resource con un ligero cambio en el código):

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

Lista de los rdf:type valores para cada uno, y los convierten a conjuntos

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

tienen tipos en común si la intersección es no vacía:

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

Eso es más agradable. Guava tiene 'Sets.intersection' que sería aún más legible. Typo: '... types1 = i1.listRDFTypes ...' – user205512

+0

Gracias, error corregido –

+0

Hola, todavía tengo algo de confusión. Espero que puedas aclarar eso. Como sugirió, obtengo los tipos y comparo su intersección. El problema es: para instancias de dos clases diferentes, 'listRDFTypes' todavía devuelve' [http://www.w3.org/2002/07/owl#Class] 'como un tipo. Como resultado, dos instancias que tomo son del mismo tipo. ¿Me estoy perdiendo de algo? – PCoder

-1

lo tomo XX es una extensión de su publicación anterior así que

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 
} 
Cuestiones relacionadas