geosparql性能问题

时间:2016-04-08 21:06:16

标签: sparql graphdb

我有一个拥有1.5亿个陈述的三重商店,所有这些陈述都包含几何形状。我目前正在使用GraphDB三元组及其geosparql扩展。在组合geosparql和过滤器查询时,端点只是做了一些奇怪的事情。 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)?谢谢!

1 个答案:

答案 0 :(得分:0)

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 Connector之一,有关详细信息,请参阅http://graphdb.ontotext.com/documentation/free/lucene-graphdb-connector.html。 GraphDB的企业版还具有Solr和Elasticsearch的连接器。