fr:human-1 を使用して、同じ部屋にいる人間よりも数が多い場合にのみオンになるエイリアンの可視性を計算したいと思います (これは、この人間が見ているものです)。
うまく機能するが冗長に見える、かなり複雑なクエリを思いつきました。
SELECT ?actor
WHERE {
?room o:contains fr:human-1 .
?actor o:in ?room .
{?actor a o:Human . }
UNION
{?actor a o:Alien .
filter(?aliens < ?humans) {
SELECT (count(distinct ?alien) as ?aliens)
(count(distinct ?human) as ?humans)
WHERE {
?room o:contains fr:human-1 .
?human a o:Human .
?human o:in ?room .
?alien a o:Alien .
?alien o:in ?room .
}
}
}
}
明らかに、一部の関係?room o:contains fr:human-1
は 2 回トラバースされます。内側のクエリからを返そうとした?room
ので、外側のクエリで使用され、外側のクエリから が削除されました?room o:contains fr:human-1
。ただし、クエリ全体?room
がサブクエリによって返されなかった値を返したため、これはパターンを壊しているようです。私が考えたように、これはactor o:in ?room .
関係が事前計算されたものだけでなく一致するため?room
です。
今、代わりにサブクエリから戻っ?human
て、それらを外部クエリの変数に結合できるかどうか疑問に思っています。?alien
?actor