SPARQL子查询变量范围

时间:2013-05-30 03:55:02

标签: subquery sparql

我想计算外星人的能见度,这些外星人只有当他们在同一个房间里人类人数超过人类时才会打开:人类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变量中。

2 个答案:

答案 0 :(得分:2)

如果你说你要回来的话会有帮助吗?

看起来你回来了一个扮演人类的演员名单,以及一个扮演外星人的演员名单,但前提是外星人少于人类 - 是

你有o:contains和o:in,这似乎是多余的,你肯定可以使用o:包含和反转主语和宾语?

答案 1 :(得分:1)

所以,答案似乎是“除了拆分它之外,没有办法消除这个复杂查询中的冗余”。