Sparql заявка за деца, внуци, .. от клас

Имам файл с бухал, който създадох в 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 заявка 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

SELECT ?x WHERE { ?x rdfs:subClassOf* ?y. }

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

person Mayur Madhekar    schedule 23.04.2021
comment
Мисля, че е необходима повече информация за това какво се опитвате да постигнете и какво сте опитали. - person Travis; 23.04.2021