У меня вопрос по 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"}