16

私は Jena ARQ を使用して、rdfs ラベルに基づいて概念に関連付けられた型を見つけるために、Jena TDB から読み取られる大規模なオントロジーに対して SPARQL クエリを作成しています。

SELECT DISTINCT ?type WHERE {
 ?x <http://www.w3.org/2000/01/rdf-schema#label> "aspirin" .
 ?x <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?type .
}

これは非常にうまく機能し、実際には非常に高速です (<1 秒)。残念ながら、用語によっては、大文字と小文字を区別しない方法でこのクエリを実行する必要があります。たとえば、ラベル"Tylenol"はオントロジーにありますが、ない"tylenol"ため、次のクエリは空になります。

SELECT DISTINCT ?type WHERE {
 ?x <http://www.w3.org/2000/01/rdf-schema#label> "tylenol" .
 ?x <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?type .
}

次のように、FILTER 構文を使用して、このクエリの大文字と小文字を区別しないバージョンを作成できます。

SELECT DISTINCT ?type WHERE {
 ?x <http://www.w3.org/2000/01/rdf-schema#label> ?term .
 ?x <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?type .
 FILTER ( regex (str(?term), "tylenol", "i") )
}

しかし今では、クエリが完了するまでに 1 分以上かかります。大文字と小文字を区別しないクエリをより効率的な方法で作成する方法はありますか?

4

2 に答える 2

19

SPARQL で使用できるすべての可能な文字列演算子の中で、regexおそらく最も高価なものです。代わりにテストの両側でorregexを使用しないで使用すると、クエリの実行速度が向上する可能性があります。何かのようなもの:UCASELCASE

SELECT DISTINCT ?type WHERE {
 ?x <http://www.w3.org/2000/01/rdf-schema#label> ?term .
 ?x <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?type .
 FILTER (lcase(str(?term)) = "tylenol")
}

これは高速かもしれませんが、一般に、トリプル ストアを使用したテキスト検索の優れたパフォーマンスは期待できません。トリプル ストアはグラフ マッチングが得意ですが、文字列マッチングはあまり得意ではありません。

于 2012-05-19T00:35:33.123 に答える
2

FILTER クエリを使用したクエリの実行が遅くなる理由は、?term がバインドされていないためです。PSO または POS インデックスをスキャンして、rdfs:label 述語を含むすべてのステートメントを検索し、正規表現に対してフィルター処理する必要があります。具体的なリソースにバインドされた場合 (最初の例)、OPS または POS インデックスを使用して、rdfs:label 述語と指定されたオブジェクト リソースを含むステートメントのみをスキャンできます。これはカーディナリティがはるかに低くなります。

このタイプのテキスト検索の問題に対する一般的な解決策は、外部テキスト インデックスを使用することです。この場合、Jena はLARQと呼ばれるフリー テキスト インデックスを提供します。これは、Lucene を使用して検索を実行し、結果をクエリの残りの部分と結合します。

于 2012-05-31T20:44:37.203 に答える