我正在使用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?
答案 0 :(得分: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 }
}
答案 1 :(得分:0)