1

私は GraphDB を使用しており、トリプル ストアは空間的にインデックス付けされています。

Q1 と呼ばれるこのクエリを使用している場合:

PREFIX geo-pos: <http://www.w3.org/2003/01/geo/wgs84_pos#> 
PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> 
PREFIX omgeo: <http://www.ontotext.com/owlim/geo#> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 
select ?a ?lat ?long 
WHERE {
    ?a omgeo:within(22.92 -142.38 75.23 183.69) . 
    ?a geo-pos:lat ?lat . 
    ?a geo-pos:long ?long .

} limit 5000

omgeo:within(22.92 -142.38 75.23 183.69)トリプル ストアの空間インデックスを使用して、1 秒もかかりません。

また、Q2 と呼ばれるこのクエリを使用すると、次のようになります。

PREFIX geo-pos: <http://www.w3.org/2003/01/geo/wgs84_pos#> 
PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> 
PREFIX omgeo: <http://www.ontotext.com/owlim/geo#> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 
select ?a ?lat ?long 
WHERE {
    ?a a ?o .
    filter(?o = someclass) .
    ?a geo-pos:long ?long .

} limit 5000

または、Q3 と呼ばれるこのクエリ:

PREFIX geo-pos: <http://www.w3.org/2003/01/geo/wgs84_pos#> 
PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> 
PREFIX omgeo: <http://www.ontotext.com/owlim/geo#> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 
select ?a ?lat ?long 
WHERE {
    ?a a someclass .    
    ?a geo-pos:lat ?lat . 
    ?a geo-pos:long ?long .
} limit 5000

どちらも同じ結果を返し、どちらも約 1 秒かかります。

しかし、Q4 と呼ばれるこのクエリを使用すると、次のようになります。

PREFIX geo-pos: <http://www.w3.org/2003/01/geo/wgs84_pos#> 
PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> 
PREFIX omgeo: <http://www.ontotext.com/owlim/geo#> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 
select ?a ?lat ?long 
WHERE {
    ?a omgeo:within(22.92 -142.38 75.23 183.69) . 
    ?a a ?o .
    filter(?o = someclass) .
    ?a geo-pos:lat ?lat . 
    ?a geo-pos:long ?long .

} limit 5000

60秒以上かかります。なぜこれが起こるのか知っていますか?Q2 と Q3 が 0 の結果を返した場合でも、これはsomeclass照会したインスタンスがないことを意味しますが、Q4 にはまだ 60 秒以上かかります。Q4 をより効率的に書く方法はありますか?

4

2 に答える 2

2

最初の 2 つのようなクエリが十分に速く実行され、目的が結果を絞り込むことだけである場合、作成したようなクエリがそれを実行するはずです (私が知る限り)。ただし、1 つをサブクエリにして、クエリを結合することもできます。これは違いを生むべきではありませんが、役立つかもしれません。つまり、次のようなことができます。

select ?a ?lat ?long {
  values ?o { <some-class> }
  ?a a ?o .
  { select ?a ?lat ?long  {
      ?a omgeo:within(22.92 -142.38 75.23 183.69) . 
      ?a geo-pos:lat ?lat . 
      ?a geo-pos:long ?long .
    } limit 5000 }
}
于 2015-10-08T15:07:49.657 に答える