2013-05-30 62 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

所以,答案似乎是「除了分裂它之外,沒有辦法消除這個複雜查詢中的冗餘」。