2015-10-08 28 views
1

我使用的是GraphDB,三重存储空间索引。写更有效的sparql查询

当我使用此查询,名为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?

+0

虽然您之前的查询似乎运行得足够快,但是filter(?var = ...)总是有点可疑。 'value?var {...}'可能会更好,因为它在概念上是说“使用这个变量的这些值”,而过滤器则说“得到一堆解决方案,然后移除那些不匹配的解决方案”。应该优化这个过滤器,但至少需要研究一个领域。 –

+0

@JoshuaTaylor我试过'values?var {...}',这和Q4是一样的。我也尝试使用'PREFIX geo-pos: PREFIX geo: PREFIX omgeo: PREFIX xsd: select?a?lat ?长 哪里?多少:在(22.92-142.38 75.23 183.69)内。 ?某个类。 ?a geo-pos:lat?lat。 ?地理位置:长?长。 }限制5000'也需要大约60秒,与Q4相同 – al3xtouch

回答

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 } 
} 
+0

谢谢,这个更快。这可能与查询真正在底层实现的方式有关。也许graphdb知道如何解决它。 – al3xtouch