Показать все пути дерева в SPARQL - PullRequest
0 голосов
/ 21 февраля 2020

Рассмотрим дерево:

prefix : <http://example.org/random#>

    :A a :Black .
    :B a :Black .
    :C a :Red .
    :D a :Black .
    :E a :Red .
    :F a :Black .
    :G a :Black .
    :H a :Red .
    :A :hasChild :B .
    :A :hasChild :C .
    :B :hasChild :D .
    :C :hasChild :E .
    :C :hasChild :F .
    :F :hasChild :G .
    :F :hasChild :H .

Каждый нижний узел представляет один путь.

Как подсчитать количество «изменений класса» при следовании по пути от узла root: A к каждому нижнему узлу?

Изменение класса происходит, если родительский и дочерний узлы имеют разные классы красный / черный. Результаты должны выглядеть следующим образом:

?bottom  ?num
:D       0
:E       1
:G       2
:H       3

RDF Tree

Я пробовал разные подходы, такие как:

prefix : <http://example.org/random>
SELECT ?bottom (COUNT(distinct IF(?type1 != ?type2,1,0)) AS ?num)
WHERE {

       :A :hasChild* ?child, ?mid, ?bottom .

        ?child a ?type1 .
        ?mid a ?type2 .


       FILTER NOT EXISTS {?bottom :hasChild ?x}


} group by ?bottom

Это дает мне:

bottom  num

E       "2"
D       "2"
G       "2"
H       "2" 

1 Ответ

0 голосов
/ 10 мая 2020
prefix : <http://example.org/random#> 

select (?end as ?bottom) (sum(?change) as ?num) 

where { 

?begin :hasChild* ?midI . 
FILTER NOT EXISTS { [] :hasChild ?begin } 
?midI :hasChild ?midJ . 
?midI a ?iType . 
?midJ a ?jType . 
BIND(IF(?iType != ?jType, 1, 0) as ?change) 
?midJ :hasChild* ?end . 
FILTER NOT EXISTS { ?end :hasChild [] } 

} group by ?begin ?end order by ?num

ответил @ Uninformeduser

...