Запрос Sparql для детей, внуков, .. класса

У меня есть файл owl, который я создал в Protege. Что такое запрос sparql, который выберет все подклассы класса и все подклассы этих подклассов и т. д. и т. д. (поиск в ширину)?


person Nick    schedule 15.04.2014    source источник
comment
Я почти уверен, что это дубликат. Основная идея заключается в том, что вы должны использовать путь к свойству: select ?subclass where { ?subclass rdfs:subClassOf+ <some-particular-class> }.   -  person Joshua Taylor    schedule 16.04.2014


Ответы (2)


На этот вопрос может ответить Sparql query Subclass или EquivalentTo, но этот вопрос и его ответ содержат гораздо больше информации, чем то, что вы повторно спрашивать здесь. Вы не можете на самом деле применить стратегию поиска (сначала в глубину или сначала в глубину), но вы можете (как бы) упорядочить подклассы по их расстоянию от корня, если есть уникальный путь от корня к подклассу. Во-первых, давайте получим некоторые образцы данных:

@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
@prefix : <https://stackoverflow.com/q/23094361/1281433/>.

#            a
#          /   \
#         b     c
#        / \   / \
#       d   e f   g 

:b rdfs:subClassOf :a .
:c rdfs:subClassOf :a .

:d rdfs:subClassOf :b .
:e rdfs:subClassOf :b .

:f rdfs:subClassOf :c .
:g rdfs:subClassOf :c .

Вы можете использовать такой запрос, чтобы получить подклассы :a:

prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix : <https://stackoverflow.com/q/23094361/1281433/>

select ?subclass where {
  ?subclass rdfs:subClassOf* :a
}
------------
| subclass |
============
| :a       |
| :c       |
| :g       |
| :f       |
| :b       |
| :e       |
| :d       |
------------

Результаты включают :a, потому что мы использовали путь rdfs:subClassOf*. Это логически правильно, поскольку класс является подклассом самого себя, но если вы не хотите включать :a, вы можете использовать rdfs:subClassOf+ или отфильтровать :a с помощью filter( ?subclass != :a ).

В случае, если есть единственный путь от корня к подклассу, вы можете подсчитать промежуточные узлы между ними, чтобы определить их глубину. Если вы упорядочиваете таким образом по глубине, то вы получите результаты, похожие на то, что поиск в ширину даст вам следующее. Этот метод более подробно описан в разделе Можно ли получить положение элемента в коллекции RDF в SPARQL? и Рассчитать длину пути между узлами?.

prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix : <https://stackoverflow.com/q/23094361/1281433/>

select ?subclass (count(?intermediate)-1 as ?depth) where {
  ?subclass rdfs:subClassOf* ?intermediate .
  ?intermediate rdfs:subClassOf* :a .
}
group by ?subclass
order by ?depth
--------------------
| subclass | depth |
====================
| :a       | 0     |
| :b       | 1     |
| :c       | 1     |
| :d       | 2     |
| :e       | 2     |
| :f       | 2     |
| :g       | 2     |
--------------------
person Joshua Taylor    schedule 15.04.2014
comment
Замечательный пример. Спасибо! - person Vitaly Isaev; 30.09.2014
comment
Есть ли способ сделать это наоборот? От объекта вверх по дереву для каждого возможного пути, как вы показали здесь? Я также хотел бы знать, как это сделать для объекта, который имеет несколько родителей; например от g до c до a или от g до b до a. - person ibrahimab; 22.07.2020
comment
@ibrahimab Конечно. В SPARQL обратное направление :p равно ^:p. Но вам даже это не обязательно. Вместо select ?subclass ... { ?subclass rdfs:subClassOf* ... rfds:subClassOf* :a . } просто поменяйте константу и переменную на: select ?superclass ... { :mySubclass rdfs:subClassOf* ... rdfs:subClassOf* ?superclass }. - person Joshua Taylor; 22.07.2020

ВЫБЕРИТЕ ?x ГДЕ { ?x rdfs:subClassOf* ?y. }

Используйте subClassof* для получения всех подклассов и их подклассов.

person Mayur Madhekar    schedule 23.04.2021
comment
Я думаю, что требуется больше информации о том, чего вы пытаетесь достичь и что вы пробовали. - person Travis; 23.04.2021