SPARQL: получить все сущности подклассов определенного класса
Я должен получить все экземпляры класса C и подклассов (прямых или косвенных) C в SPARQL.
Я могу получить все прямые подклассы C таким образом:
SELECT ?entity
WHERE {
?subclass rdfs:subClassOf :C .
?entity rdf:type ?subclass .
}
но я не могу получить экземпляры косвенного подкласса и ни одного экземпляра C.
как я знаю (я предварительно вычислил их) все подклассы (прямые и косвенные из C), и я могу построить динамический запрос, возможно ли построить запрос следующим образом один?
SELECT ?entity
WHERE {
?entity rdf:type in <list>.
}
спасибо всем.
EDIT:
Я только что решил это, даже если и не элегантно.
SELECT ?entity
WHERE {
{ ?entity rdf:type :C }
UNION { ?entity rdf:type :SubClass1 }
UNION { ?entity rdf:type :SubClass2 }
UNION { ?entity rdf:type :SubClass3 }
}
2 ответов
лучшим решением является использование выражений пути свойств в SPARQL 1.1
Это будет переписано как:
SELECT ?entity
WHERE {
?entity rdf:type ?type.
?type rdfs:subClassOf* :C.
}
на основе SPARQL 1.1 спецификация правильный способ сделать это было бы:
SELECT ?entity
WHERE {
?entity rdf:type/rdfs:subClassOf* :C
}
без поддержки путей свойств невозможно выразить иерархии классов произвольной длины.