Sparql запрос для детей, внуков, .. класса
У меня есть файл совы, который я создал в Protege. Что такое запрос sparql, который выберет все подклассы класса и все подклассы этих подклассов, и т. Д. И т. Д. (Breadth First Search Sort of Manner)?
2 ответа
На этот вопрос может ответить Sparql-запрос Subclass или EquivalentTo, но этот вопрос и его ответ содержат гораздо больше информации, чем то, что вы просите здесь. Вы не можете реально применить стратегию поиска (сначала глубина, а не глубина сначала), но вы можете (вроде) упорядочить подклассы по их расстоянию от корня, если существует уникальный путь от корня к подклассу. Во-первых, давайте возьмем пример данных:
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
@prefix : <https://stackru.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://stackru.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 Collection в SPARQL? и рассчитать длину пути между узлами?,
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix : <https://stackru.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 |
--------------------
"" ВЫБРАТЬ? X ГДЕ {? X rdfs:subClassOf*? Y.}
Используйте subClassof* для извлечения всех подклассов и их подклассов.