SPARQL: Как получить представление об онтологии, если глубина иерархии классов неизвестна? - PullRequest
6 голосов
/ 30 марта 2012

У меня вопрос по 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 найти "всех животных, которые" белые "или" все экземпляры животных "?И наоборот: как я могу узнать, принадлежит ли экземпляр (dog1) Animals?

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

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

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 ).

Я хочу что-то вроде: select ?x where {?x rdfs:subClassOf :Animals . ?x :hasСolor "white"})

UPD. Решение для "найти всех животных (экземпляров), которые'white' 'может выглядеть так:

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

1 Ответ

12 голосов
/ 30 марта 2012

Вы можете использовать транзитивность в вашем запросе SPARQL (используя *):

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