2

私は昨日SPARQLを学び始め、dbpediaに対して練習しています。指定された目的地(スウォンジーとオックスフォード)の近くの2つのクラブでプレーしたすべてのサッカー選手のリストを取得しようとしています。私は次のクエリを持っていますが、これは機能しますが非常に遅いです:

SELECT ?player ?team ?team2
WHERE
{
  :Swansea geo:geometry ?point1_1 .
  ?team dbpedia-owl:ground ?ground .
  ?ground geo:geometry ?point1_2 .  
  FILTER (bif:st_distance( ?point1_1, ?point1_2) < 5)
  ?player dbpedia2:clubs ?team .

  :Oxford geo:geometry ?point2_1 .
  ?team2 dbpedia-owl:ground ?ground2 .
  ?ground2 geo:geometry ?point2_2 .
  FILTER (bif:st_distance( ?point2_1, ?point2_2) < 5)
  ?player dbpedia2:clubs ?team2 .
}

私の問題は、dbpediaのクエリページで実行するとクエリがタイムアウトすることが多いことです(http://tinyurl.com/d9pkluqを参照)。このクエリを最適化する方法はありますか?より多くの町を入力したり、検索する半径を大きくしたりした場合でも、dbpediaのクエリページでタイムアウトせずに実行したいと思います。

あなたが提供できるどんな助けにも感謝します!

4

1 に答える 1

2

クエリは完全に有効なものであり、理想的な世界では、クエリを処理するSPARQLクエリエンジンが最適な方法で実行されます。ただし、多くのSPARQL実装には、まだその優れたクエリオプティマイザーがないため、クエリを自分で最適化する必要があります。通常、これを行うには、クエリの一部を並べ替えます。

一般的な手法の1つは、クエリのグラフパターンを並べ替えて、クエリ結果の数をできるだけ早く減らすことです。各グラフパターンは、前のパターンのすべての一致に対して実行されることに注意してください。クエリは一連のネストされたループと考えることができます。内側のループで多くの操作を行わないようにします。

クエリの例では、たとえば次のように並べ替えることができます。

SELECT ?player ?team ?team2
WHERE
{
  :Swansea geo:geometry ?point1_1 .
  ?team dbpedia-owl:ground ?ground .
  ?ground geo:geometry ?point1_2 .  
  FILTER (bif:st_distance( ?point1_1, ?point1_2) < 5)
  ?player dbpedia2:clubs ?team .

  ?player dbpedia2:clubs ?team2 .
  FILTER(?team != ?team2)

  :Oxford geo:geometry ?point2_1 .
  ?team2 dbpedia-owl:ground ?ground2 .
  ?ground2 geo:geometry ?point2_2 .
  FILTER (bif:st_distance( ?point2_1, ?point2_2) < 5)
}

したがって、別の町や、町、クラブ、プレーヤーの潜在的に非常に多くの組み合わせを探す代わりに、「興味深い」プレーヤーがプレイしたチームだけに制限することで、2番目のチームの選択を制限します。?teamとの同じチームと一致しないようにするためのチェックも追加しました?team2

これがあなたのケースで物事をより良くするかどうかは確かではありません、これはあなたが実行している正確なDBPediaエンドポイントに大きく依存します。しかし、これはあなたが実験できる一種の最適化です。

于 2011-12-14T17:17:39.777 に答える