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)就是使用三元存储的空间索引。

此外,当我使用此查询时,称为 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

如果像前两个这样的查询运行得足够快,并且您的意图只是过滤结果,那么像您编写的查询这样的查询应该为您完成(据我所知)。但是,您也可以通过将查询设为子查询来组合查询。这不应该有所作为,但它可能会有所帮助。即,您可以执行以下操作:

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 回答
0
  1. 为什么不直接使用?a a someclass
  2. 您是否尝试过解释查询?http://graphdb.ontotext.com/documentation/standard/explain-plan.html
于 2017-01-13T18:55:25.027 回答