我有一个三元组存储,其中有1.5亿条语句,并且所有语句都包含几何图形。我现在使用的是GraphDB triple store和它的geosparql扩展。端点只是在组合geosparql和filter查询时做了一些奇怪的事情。GraphDB方面已经确认他们的geosparql扩展存在一些问题。我只是想知道,当与过滤器查询结合使用时,这对于geosparql查询来说是否正常。如果geosparql应该更快(例如在virtuoso中),我可能会直接迁移到virtuoso。否则,我可能需要想出其他的解决方案。这可能会导致另一个更一般的问题,在处理地理数据时,进行空间查询的有效方法是什么?
这里有一个性能问题的例子。
这个查询(只是一个没有geosparql组件的过滤器查询)需要2-15秒(这仍然是一个很长的时间):
PREFIX geo-pos: <http://www.w3.org/2003/01/geo/wgs84_pos#>
PREFIX geo: <http://www.opengis.net/ont/geosparql#>
PREFIX geof: <http://www.opengis.net/def/function/geosparql/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX sf: <http://www.opengis.net/def/sf#>
select ?a
WHERE {
?a :hasPrimaryName ?o .
FILTER (contains(?o,'Paris'))
} 这个查询(使用GraphDB中的geosparql扩展)大约需要5秒,不管有没有这个限制:
PREFIX geof: <http://www.opengis.net/def/function/geosparql/>
PREFIX geo-pos: <http://www.w3.org/2003/01/geo/wgs84_pos#>
PREFIX geo: <http://www.opengis.net/ont/geosparql#>
PREFIX omgeo: <http://www.ontotext.com/owlim/geo#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
select *
WHERE {
?a geo:hasGeometry ?aGeom .
?aGeom geo:asWKT ?aWKT .
FILTER (geof:sfWithin(?aWKT, '''<http://www.opengis.net/def/crs/OGC/1.3/CRS84> POLYGON((1.549072265625 49.468124067331644,3.31787109375 49.468124067331644,3.31787109375 48.436489955944154,1.549072265625 48.436489955944154,1.549072265625 49.468124067331644))'''^^geo:wktLiteral))
}无论我们是否使用限制,组合这两个查询都会超时(60秒后):
PREFIX geo-pos: <http://www.w3.org/2003/01/geo/wgs84_pos#>
PREFIX geo: <http://www.opengis.net/ont/geosparql#>
PREFIX geof: <http://www.opengis.net/def/function/geosparql/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX sf: <http://www.opengis.net/def/sf#>
select ?a
WHERE {
?a geo:hasGeometry ?aGeom .
?aGeom geo:asWKT ?aWKT .
FILTER (geof:sfWithin(?aWKT, '''<http://www.opengis.net/def/crs/OGC/1.3/CRS84> POLYGON((1.549072265625 49.468124067331644,3.31787109375 49.468124067331644,3.31787109375 48.436489955944154,1.549072265625 48.436489955944154,1.549072265625 49.468124067331644))'''^^geo:wktLiteral))
?a :hasPrimaryName ?o . FILTER (contains(?o,'Paris'))
}由于我们通常使用三元组存储作为web地图界面的服务器,并且我们在web地图中进行大量的空间查询,因此geosparql查询的效率对我们很重要。我们不能接受像60s这样的查询时间。有没有办法改善这种情况?是服务器端(geosparql查询)还是web地图端(我们使用的是javascript)?谢谢!
发布于 2016-04-19 01:02:49
GraphDB的GeoSPARQL支持对基于谓词的查询(如?a geo:sfWithin ?b)使用索引,而基于函数的查询(如filter(geof:sfWithin(?a, ?b)))则需要完整扫描。您可以重写查询以利用谓词索引,例如
PREFIX geo-pos: <http://www.w3.org/2003/01/geo/wgs84_pos#>
PREFIX geo: <http://www.opengis.net/ont/geosparql#>
PREFIX geof: <http://www.opengis.net/def/function/geosparql/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX sf: <http://www.opengis.net/def/sf#>
select ?a
WHERE {
?a geo:hasGeometry ?aGeom .
?aGeom geo:asWKT ?aWKT .
?aWKT geo:sfWithin '''<http://www.opengis.net/def/crs/OGC/1.3/CRS84> POLYGON((1.549072265625 49.468124067331644,3.31787109375 49.468124067331644,3.31787109375 48.436489955944154,1.549072265625 48.436489955944154,1.549072265625 49.468124067331644))'''^^geo:wktLiteral .
}注意,使用文字作为谓词geo:sfWithin的宾语是一种GraphDB扩展,而不是标准的GeoSPARQL特性。
在完整查询中,您还可以使用contains(?o, 'Paris')。这是一个缓慢的操作,因为它需要一个完整的扫描。如果您需要全文搜索,您可以尝试GraphDB Lucene连接器之一,请参阅http://graphdb.ontotext.com/documentation/free/lucene-graphdb-connector.html了解更多信息。GraphDB的企业版也有用于Solr和Elasticsearch的连接器。
https://stackoverflow.com/questions/36509349
复制相似问题