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