4

リモート エンドポイントと SPARQL を使用して、大量のデータを取得する必要があります。問題は次のとおりです。これは非常に遅いです。グローバル パフォーマンス スキームにおけるネットワーク遅延の影響を軽減するために、リクエストをグループ化したいと考えています。

私のクエリは非常に単純です。

PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
SELECT * WHERE
{
  <my_id> skos:prefLabel ?prefLabel
}

しかし、それらを適切にグループ化する方法がわかりません。たとえば、次のように推測します。

PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
SELECT * WHERE
{
  ?id skos:prefLabel ?prefLabel .
  FILTER(?id IN ('my_id1', 'my_id2', 'my_id3'))
}

フィルタリングする前にエンドポイントがすべてのインスタンスをざっと見てしまうので、これはひどい考えです。

そのリクエストのグループ化を実装する方法に関するヒントは大歓迎です。

4

1 に答える 1

6

エンドポイントが SPARQL 1.1 をサポートしていると仮定すると、次のVALUESように句を使用できます。

PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
SELECT * WHERE
{
  VALUES ( ?id )
  {
    ( <id1> )
    ( <id2> )
    ( <id3> )
    # etc.
  }
  ?id skos:prefLabel ?prefLabel
}

エンドポイントの背後にある基礎となる SPARQL エンジンが、ネストされたループ結合ではなくハッシュ結合を使用して共有変数との結合を評価すると仮定すると (最新の実装がそうでない場合は非常に驚くでしょう)、これは同等のFILTER (?id IN ( <id1>, <id2>, <id3> ) )形式よりもはるかにパフォーマンスが高いはずです。

注意- 優れたオプティマイザーはFILTER (?id IN ( <id1> ))、エンドポイントの背後にある SPARQL エンジンに応じて、YMMV が上記のような形式に変換される場合があります。

于 2013-05-07T16:26:57.687 に答える