我想计算外部人的可见度,只有当他们在与fr:human-1(这是人类看到的)相同的房间中人数超过时才会开启。SPARQL子查询变量范围
我想出了一个相当复杂的查询工作正常,但似乎是多余的:
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
变量中。
没错。我计算了外星人的能见度,只有当他们在同一个房间里人数超过人数时,才会开启这个外星人,这是人类看到的。是的,'o:contains'被定义为'o:in'的倒数,虽然是冗余的,但至少不会产生多次计算。 – user1048677
我希望我可以使用在子查询中计算的结果来消除来自外部查询的代码重复,例如'?room'。 – user1048677