【问题标题】:write more efficient sparql query编写更高效的 sparql 查询
【发布时间】:2015-10-08 07:16:07
【问题描述】:

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

【问题讨论】:

  • 虽然您之前的查询似乎运行得足够快,但filter (?var = ...) 总是有点可疑。 values ?var { ... } 可能更好,因为它在概念上说“使用这个变量的这些值”,而过滤器说“获取一堆解决方案,然后删除不匹配的解决方案”。一个好的引擎应该优化这个过滤器,但它至少要研究一个领域。
  • @JoshuaTaylor 我试过'values ?var {...}',它和Q4一样。我还尝试使用 'PREFIX geo-pos: w3.org/2003/01/geo/wgs84_pos#> PREFIX geo: w3.org/2003/01/geo/wgs84_pos#> PREFIX omgeo: ontotext.com/owlim/geo#> PREFIX xsd: w3.org/2001/XMLSchema#> select ?a ?lat ?long WHERE { ?a omgeo:within(22.92 -142.38 75.23 183.69)。 ?a someclass 。 ?a geo-pos:lat ?lat 。 ?a geo-pos:long ?long 。 } limit 5000' 也需要60秒左右,和Q4一样

标签: indexing sparql graphdb


【解决方案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 }
}

【讨论】:

  • 谢谢,这个快多了。它可能与查询在后台的实际实现方式有关。也许 graphdb 知道如何解决它。
【解决方案2】:
  1. 为什么不直接使用?a a someclass
  2. 您是否尝试过解释查询? http://graphdb.ontotext.com/documentation/standard/explain-plan.html

【讨论】:

    猜你喜欢
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多