首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >geosparql性能问题

geosparql性能问题
EN

Stack Overflow用户
提问于 2016-04-09 05:06:16
回答 1查看 366关注 0票数 1

我有一个三元组存储,其中有1.5亿条语句,并且所有语句都包含几何图形。我现在使用的是GraphDB triple store和它的geosparql扩展。端点只是在组合geosparql和filter查询时做了一些奇怪的事情。GraphDB方面已经确认他们的geosparql扩展存在一些问题。我只是想知道,当与过滤器查询结合使用时,这对于geosparql查询来说是否正常。如果geosparql应该更快(例如在virtuoso中),我可能会直接迁移到virtuoso。否则,我可能需要想出其他的解决方案。这可能会导致另一个更一般的问题,在处理地理数据时,进行空间查询的有效方法是什么?

这里有一个性能问题的例子。

这个查询(只是一个没有geosparql组件的过滤器查询)需要2-15秒(这仍然是一个很长的时间):

代码语言:javascript
复制
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秒,不管有没有这个限制:

代码语言:javascript
复制
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秒后):

代码语言:javascript
复制
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)?谢谢!

EN

回答 1

Stack Overflow用户

发布于 2016-04-19 01:02:49

GraphDB的GeoSPARQL支持对基于谓词的查询(如?a geo:sfWithin ?b)使用索引,而基于函数的查询(如filter(geof:sfWithin(?a, ?b)))则需要完整扫描。您可以重写查询以利用谓词索引,例如

代码语言:javascript
复制
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的连接器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36509349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档