SPARQL: получить все сущности подклассов определенного класса - PullRequest
11 голосов
/ 09 февраля 2012

Мне нужно получить все экземпляры класса 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 ]

26 голосов
/ 09 февраля 2012

Лучшим решением является использование выражений пути к свойствам в SPARQL 1.1

Это будет переписано как:

SELECT ?entity
WHERE {
  ?entity rdf:type ?type.
  ?type rdfs:subClassOf* :C.
}
4 голосов
/ 09 февраля 2016

Основываясь на спецификации SPARQL 1.1 , правильный способ сделать это будет:

SELECT ?entity
WHERE {
    ?entity rdf:type/rdfs:subClassOf* :C
}

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

...