1

我想计算外星人的能见度,它只有在与 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变量中。

4

2 回答 2

2

如果您说您要返回的内容会有所帮助吗?

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

您有 o:contains 和 o:in,这似乎是多余的,您肯定可以使用 o:contains 并颠倒主宾吗?

于 2013-05-30T09:21:07.703 回答
1

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

于 2013-06-02T21:32:43.097 回答