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は 2 回トラバースされます。内側のクエリからを返そうとした?roomので、外側のクエリで使用され、外側のクエリから が削除されました?room o:contains fr:human-1。ただし、クエリ全体?roomがサブクエリによって返されなかった値を返したため、これはパターンを壊しているようです。私が考えたように、これはactor o:in ?room .関係が事前計算されたものだけでなく一致するため?roomです。

今、代わりにサブクエリから戻っ?humanて、それらを外部クエリの変数に結合できるかどうか疑問に思っています。?alien?actor

4

2 に答える 2

2

何を返そうとしているのかを教えていただければ助かりますか?

人間を演じている俳優のリストとエイリアンを演じている俳優のリストを返すように見えますが、人間よりもエイリアンが少ない場合に限ります。

o:contains と o:in がありますが、これは冗長に思えますが、o:contains を使用して主語と目的語を逆にすることはできますか?

于 2013-05-30T09:21:07.703 に答える
1

したがって、答えは「この複雑なクエリを分割する以外に冗長性を排除する方法はありません」と思われます。

于 2013-06-02T21:32:43.097 に答える