Рассмотрим дерево:
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
Я пробовал разные подходы, такие как:
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"