テストされていませんが、1 つのアプローチは次のようになります。
select distinct ?keyword ?document
where {
?keyword ns:isKeywordIn ?document;
ns:phrase ?phrase.
FILTER regex( ?phrase, "^(testing3|n00b|fubared)$", "i" )
}
これにより、ドキュメントとキーワードのペアが得られます。キーワードは、ユーザー入力パターンのいずれかに一致します。^ ... $
アンカーの使用に注意して、部分一致ではなく単語全体の一致のみを取得します。ただし、クエリをインデックス化するための特徴的な情報があまりないため、これは遅くなる可能性があります。そのため、クエリ エンジンはコーパス内の各キーワードをテストする必要があります。
別の方法は、複数のキーワードのテストを結合することです。
select distinct ?keyword ?document
where {
{?keyword ns:phrase "testing3" ; ns:isKeywordIn ?document}
union
{?keyword ns:phrase "n00b" ; ns:isKeywordIn ?document}
union
{?keyword ns:phrase "fubared" ; ns:isKeywordIn ?document}
}
:phrase
合理的なクエリ オプティマイザーは、より具体的なトリプルを使用してクエリをインデックス化できるはずです。ただし、クエリの作成は少し複雑です。もう 1 つの欠点は"i"
、regex の例にある ignore-case ( ) フラグに相当するものがないため、ユーザー入力がキーワード テキストと正確に一致する必要があることです。
最後の代替手段は、SPARQL 拡張機能を使用して、トリプル ストアと共にフリーテキスト インデックスを活用することです。たとえば、Jena についてはLARQを参照してください。