编写更高效的 sparql 查询
write more efficient sparql query
我正在使用 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
它们 return 相同的结果,都需要大约 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的结果都是returns 0,也就是我查询的someclass
没有实例,Q4还是需要60多秒。 Q4有没有更高效的写法?
如果像前两个这样的查询运行得足够快,而您的目的只是过滤结果,那么像您编写的查询这样的查询 应该你(据我所知)。但是,您也可以通过将一个查询设为子查询来组合这些查询。这 不应该 有所作为,但它可能会有所帮助。即,您可以执行以下操作:
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 }
}
- 为什么不直接使用
?a a someclass
?
- 您尝试过解释查询吗? http://graphdb.ontotext.com/documentation/standard/explain-plan.html
我正在使用 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
它们 return 相同的结果,都需要大约 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的结果都是returns 0,也就是我查询的someclass
没有实例,Q4还是需要60多秒。 Q4有没有更高效的写法?
如果像前两个这样的查询运行得足够快,而您的目的只是过滤结果,那么像您编写的查询这样的查询 应该你(据我所知)。但是,您也可以通过将一个查询设为子查询来组合这些查询。这 不应该 有所作为,但它可能会有所帮助。即,您可以执行以下操作:
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 }
}
- 为什么不直接使用
?a a someclass
? - 您尝试过解释查询吗? http://graphdb.ontotext.com/documentation/standard/explain-plan.html