У меня есть файл owl, который я создал в Protege. Что такое запрос sparql, который выберет все подклассы класса и все подклассы этих подклассов и т. д. и т. д. (поиск в ширину)?
Запрос Sparql для детей, внуков, .. класса
Ответы (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 |
--------------------
: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* для получения всех подклассов и их подклассов.
select ?subclass where { ?subclass rdfs:subClassOf+ <some-particular-class> }
. - person Joshua Taylor   schedule 16.04.2014