Имам файл с бухал, който създадох в Protege. Каква е заявката за sparql, която ще избере всички подкласове на клас и всички подкласове на тези подкласове, така нататък и така нататък (Начин на първо търсене в ширина)?
Sparql заявка за деца, внуци, .. от клас
Отговори (2)
На това може да се отговори чрез Sparql заявка 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
SELECT ?x WHERE { ?x rdfs:subClassOf* ?y. }
Използвайте subClassof* за извличане на всички подкласове и техните подкласове.
select ?subclass where { ?subclass rdfs:subClassOf+ <some-particular-class> }
. - person Joshua Taylor   schedule 16.04.2014