编写更高效的sparql查询

时间:2015-10-08 07:16:07

标签: indexing sparql graphdb

我正在使用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?

2 个答案:

答案 0 :(得分: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 }
}

答案 1 :(得分:0)

  1. 为什么不使用?a a someclass
  2. 您是否尝试过解释查询? generate setter which returns self (this)