【发布时间】: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一样