2012-03-30 15 views
6

Tengo una pregunta sobre SPARQL. Tengo una ontología de animales:SPARQL: ¿Cómo obtener una ofensa de una ontología, si se desconoce la profundidad de la jerarquía de clases?

Animals (is a superclass with object property <hasColor>) 
------ Mammals (subclass of Animals) 
------------- Dog (subclass of Mammals) 
---------------- dog1 (a instance with property <hasColor>="white") 
---------------- dog2 (a instance with property <hasColor>="red" ) 
------ Bird (subclass of Animals) 

¿Es posible encontrar con SPARQL "todos los animales, que son 'blanco'" o "todas las instancias de los animales"? Y al revés: ¿cómo puedo saber si una instancia (dog1) pertenece a Animals?

NOTA: La profundidad y amplitud de la jerarquía de clases se desconoce de antemano.

También la consulta siguiente no funcionará

SELECT ?x WHERE {?x rdfs:subClassOf :Animals . ?x :hasСolor "white"} 

Y la siguiente consulta (Encontrar todos los animales, que son 'blanco') sólo funciona si se conoce la profundidad de la jerarquía de clases. (Así que si se conoce la jerarquía, puedo hacer que los pasos especificados (desde la parte superior de la jerarquía a abajo) para alcanzar la meta:. En este caso 2 pasos

SELECT ?z WHERE { 
?x rdfs:subClassOf :Animals . 
?y rdfs:subClassOf ?x . 
?z rdf:type ?y . 
?z :hasColor "white" 
} 

Lo mismo es cierto para el siguiente ejemplo - "encontrar todas las instancias de Animales"

SELECT ?z WHERE { 
?x rdfs:subClassOf :Animals . 
?y rdfs:subClassOf ?x . 
?z rdf:type ?y . 
} 

Qué hacer, si el hierarchie se desconoce?

la consulta se procesa con SDB (es un componente de Jena).

Quiero algo como: select ?x where {?x rdfs:subClassOf :Animals . ?x :hasСolor "white"})

UPD. Solución para "encontrar todos los animales (instancias), que son 'blanco'" podría tener este aspecto:??

SELECT y WHERE {x rdfs: subClassOf *: Animales. ? y rdf: tipo? x. ? Y : hasColor "blanco"}

Respuesta

10

Puede utilizar la transitividad en su consulta SPARQL (usando *):

SELECT ?y WHERE { ?x rdfs:subClassOf* :Animals . 
        ?y rdf:type ?x . 
        ?y :hasColor "white" } 
+0

Gracias! Probé la consulta con Protege. SELECCIONAR? X DONDE {? X rdfs: subClassOf *: Animals} funciona bien. ¿Pero SELECCIONAR? X DONDE {? X rdfs: subClassOf *: Animales. ? x: has-color "blanco"} no encuentra coincidencias – ERG

+0

es extraño la consulta SELECCIONAR? x? y DONDE {? x rdfs: subClassOf *: Animales. ? y rdf: type? x. "} funciona bien también y devuelve todas las instancias, pero si se agrega (? x: has-color" blanco ") no encuentra coincidencias – ERG

+0

@ERG: ¿y qué pasa con 'SELECT? x WHERE {? x rdfs : subClassOf *: Animals.? y rdf: type? x.? y: hasColor "white"} '? –

Cuestiones relacionadas