我想计算外星人的能见度,它只有在与 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
被遍历了两次。我尝试?room
从内部查询返回,以便外部查询使用它并?room o:contains fr:human-1
从外部查询中删除。但是,这似乎打破了模式,因为整个查询随后返回?room
了子查询未返回的值。正如我所想,这是因为这种actor o:in ?room .
关系不仅匹配预先计算的?room
.
现在我想知道是否可以改为从子查询返回?human
和?alien
然后在外部查询中以某种方式将它们组合到?actor
变量中。