3

非常に遅い正規表現を含むdbpediaのsparqlクエリを作成しました:

PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX dbpedia-owl:<http://dbpedia.org/ontology/>

select ?label where {
    ?s rdfs:label ?label.
    ?s dbpedia-owl:thumbnail ?photo.
    ?s dbpedia-owl:abstract ?abstract.
    FILTER langMatches( lang(?label), "FR" ).
    FILTER langMatches( lang(?abstract), "FR" ).
    FILTER regex(?label, "^Jules V", "i").

}
LIMIT 10

パブリックエンドポイントhttp://fr.dbpedia.org/sparqlを使用して試してみて、数秒待つ必要があることを確認できます。

最終的な品質がそれほど良くない場合でも、これでより良いパフォーマンスを得る方法はありますか?

ありがとう、サミュエル

4

1 に答える 1

8

REGEXクエリがデータセットの十分に小さい部分に制限されていない限り、を使用するクエリはほぼ確実に遅くなります。基本的に処理するREGEXには、ストアが潜在的な結果に対して線形スキャンを実行し、それぞれが正規表現と一致するかどうかを確認する必要があります。

あなたの場合のように十分に単純な正規表現がある場合は、次の2つのいずれかを試す必要があります。

解決策1-軽量の文字列関数を使用する

あなたの場合、特定の部分文字列で始まる文字列を探しているので、STRSTARTS完全な正規表現を必要としないので、代わりに関数を使用する方がほぼ確実に効率的です。もちろん、これは、SPARQLエンジンが最新のSPARQL1.1ドラフト仕様に準拠していることを前提としています。

解決策2-全文検索を使用する

多くのストアには、代わりに使用できる全文検索拡張機能が含まれREGEXており、潜在的な結果に対して線形スキャンを実行するのではなく、全文インデックスにアクセスしているため、多くの場合、パフォーマンスが大幅に向上します。

DBPediaの場合、その背後にあるVirtuosoストアは次の構文をサポートします。

?label bif:contains "Jules"

Virtuosoの全文構文は多少制限さJules Vれているため、各用語は少なくとも4文字(場合によっては3文字)でなければならないため、そのまま使用することはできません。ただし、これをさらに組み合わせて、FILTER必要な結果に絞り込むことができます。

PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX dbpedia-owl:<http://dbpedia.org/ontology/>

select ?label where {
    ?s rdfs:label ?label.
    ?s dbpedia-owl:thumbnail ?photo.
    ?s dbpedia-owl:abstract ?abstract.
    FILTER langMatches( lang(?label), "FR" ).
    FILTER langMatches( lang(?abstract), "FR" ).
    ?label bif:contains "Jules" .
    FILTER (CONTAINS(?label, "V"))

}
LIMIT 10

このクエリはほぼ瞬時に実行されます

于 2012-11-27T17:47:51.913 に答える