2013-05-30 44 views
0

我想计算外部人的可见度,只有当他们在与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变量中。

回答

2

如果你说了你想要返回的东西,这会有所帮助吗?

它看起来像你的回归演员扮演人类的列表,以及演员扮演外星人的列表,但只有当有比人类的外星人少 - 是h

你有○:包含和o:中,这似乎是多余的,当然你可以使用o:contains和reverse主题和对象?

+0

没错。我计算了外星人的能见度,只有当他们在同一个房间里人数超过人数时,才会开启这个外星人,这是人类看到的。是的,'o:contains'被定义为'o:in'的倒数,虽然是冗余的,但至少不会产生多次计算。 – user1048677

+0

我希望我可以使用在子查询中计算的结果来消除来自外部查询的代码重复,例如'?room'。 – user1048677

0

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