SPARQL: Как получить экземпляр онтологии, если глубина иерархии классов неизвестна?

У меня вопрос по SPARQL. У меня есть онтология животных:

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)

Можно ли найти с помощью SPARQL "всех животных , которые являются «белыми» или «все экземпляры животных»? И наоборот: как я могу узнать, принадлежит ли экземпляр (собака1) к животным?

ПРИМЕЧАНИЕ: Глубина и широта иерархии классов заранее неизвестно

Также запрос ниже не будет работать

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

А следующий запрос (найти всех животных, которые являются «белыми») работает, только если известна глубина иерархии классов. (Таким образом, если иерархия известна, могу ли я выполнить указанные шаги (сверху иерархии вниз), чтобы достичь цели: в данном случае 2 шага.

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

То же верно и для следующего примера — «найти все экземпляры Животные"

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

Что делать, если иерархия неизвестна?

Запрос будет обработан с помощью SDB(является компонентом Jena).

Хочу что-то типа : выберите ?x, где {?x rdfs:subClassOf :Animals . ?x :hasСolor "white"})

UPD. Решение для «найти все животные (экземпляры) белого цвета» может выглядеть следующим образом:

SELECT ?y WHERE { ?x rdfs:subClassOf* :Animals . ?y rdf:тип ?x . ?y :hasColor "white"}

6
задан ERG 30 March 2012 в 14:15
поделиться