0

次の行に沿った RDF トリプルのデータベースがあります。

1 つのクエリで一致を見つけたいキーワードのリストがあります。たとえば、10 個のドキュメントがあり、(ドキュメントごとに) キーワード「testing3」、「 fubared」、「noob」はドキュメントにあります。

正確な単語のリストを指定できるように、どの SPARQL クエリを構築できますか (正規表現フィルターを試してみましたが、機能していないようでした。部分一致も提供し、ドキュメント名を提供しませんでした)。含まれているドキュメントの名前と一致したキーワードは?

私はこれに何日も立ち往生しており、動作するようになりましたが、いくつかの再帰ループがあり、永遠に時間がかかります.物事を大幅にスピードアップする必要があります.

* *サーバーがダウンしているため、現在トリプルストアにアクセスできませんが、お返事ありがとうございます! 質問があれば再投稿します。どうもありがとうございました。

4

2 に答える 2

3

テストされていませんが、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を参照してください。

于 2012-07-23T17:30:09.167 に答える
2

一般に、SPARQLクエリで正規表現を使用することは避けてください。SPARQLエンジンは通常、それをうまく処理するようには設計されていません。多くの場合、特別なLuceneインデックスに基づいて、リテラル値に対して正規表現またはキーワードタイプの検索を実行するための特定の機能を提供するもの。通常、正規表現は、関連するリテラル値に対して多くの正規表現を実行することになりますが、これは非常に高額になる可能性があります。

これにより、キーワード「testing3」を含むドキュメントが返されます。

select ?doc ?name where {
  ?doc :name ?name .
  ?keyword :isKeywordIn ?doc .
  ?keyword :phrase "testing3" .
}

2つの特定のキーワードを含むすべてのドキュメントを取得する場合:

select ?doc ?name where {
  ?doc :name ?name .
  ?keyword :isKeywordIn ?doc .
  ?keyword :phrase "testing3" .
  ?kw :isKeywordIn ?doc .
  ?kw :phrase "noob" .
}

2つの特定のキーワードのいずれかであるすべてのドキュメントを取得する場合:

select distinct ?doc ?name where { 
  ?doc :name ?name .
  {
    ?keyword :isKeywordIn ?doc .
    ?keyword :phrase "testing3" .
  } union {
    ?kw :isKeywordIn ?doc .
    ?kw :phrase "noob" .
  } 
  }

これにより、あなたが探しているもの、タイプミス、およびドメインオントロジーの正確な使用に耐えられないようになると思います。

于 2012-07-23T17:22:51.583 に答える