1

1 億 5000 万のステートメントを持つトリプル ストアがあり、そのすべてにジオメトリが含まれています。現在、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 クエリの効率は重要です。60 秒などのクエリ時間は受け入れられません。この状況を改善する方法はありますか?サーバー側 (geosparql クエリ) または Web マップ側 (javascript を使用しています) のどちらですか? ありがとう!

4

1 に答える 1

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 用のコネクタもあります。

于 2016-04-18T17:02:49.277 に答える