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
}

без поддержки путей свойств невозможно выразить иерархии классов произвольной длины.