我使用的是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吗?
发布于 2015-10-08 15:07:49
如果像您的前两个查询运行得足够快,并且您的目的只是对结果进行过滤,那么像您编写的那样的查询应该会为您执行(据我所知)。但是,您也可以通过使一个子查询组合查询。这不应该有什么区别,但可能会有帮助。也就是说,你可以做这样的事情:
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 }
}发布于 2017-01-13 18:55:25
?a a someclass呢?https://stackoverflow.com/questions/33009068
复制相似问题