首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编写更高效的sparql查询

编写更高效的sparql查询
EN

Stack Overflow用户
提问于 2015-10-08 07:16:07
回答 2查看 157关注 0票数 1

我使用的是GraphDB,三重存储是空间索引的。

当我使用这个查询时,称为Q1:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-08 15:07:49

如果像您的前两个查询运行得足够快,并且您的目的只是对结果进行过滤,那么像您编写的那样的查询应该会为您执行(据我所知)。但是,您也可以通过使一个子查询组合查询。这不应该有什么区别,但可能会有帮助。也就是说,你可以做这样的事情:

代码语言:javascript
复制
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 }
}
票数 2
EN

Stack Overflow用户

发布于 2017-01-13 18:55:25

  1. 为什么不直接使用?a a someclass呢?
  2. 你试过解释查询了吗?http://graphdb.ontotext.com/documentation/standard/explain-plan.html
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33009068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档