Оптимизация запроса SPARQL - PullRequest
       4

Оптимизация запроса SPARQL

2 голосов
/ 14 декабря 2011

Вчера я начал учить себя SPARQL, и я тренируюсь против dbpedia. Я пытаюсь получить список всех футболистов, которые играли в двух клубах рядом с указанными пунктами назначения (то есть Суонси и Оксфорд). У меня есть следующий запрос, который работает, но очень медленно:

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.

Спасибо за любую помощь, которую вы можете оказать!

1 Ответ

2 голосов
/ 14 декабря 2011

Ваш запрос является абсолютно корректным, и в идеальном мире механизм запросов SPARQL, который обрабатывает ваш запрос, будет работать оптимальным образом. Однако многие реализации SPARQL еще не имеют таких хороших оптимизаторов запросов, поэтому вам часто приходится оптимизировать запрос самостоятельно. Обычно вы делаете это, переупорядочивая части запроса.

Одним из распространенных методов является попытка упорядочить графовые шаблоны в вашем запросе, чтобы количество результатов запроса было уменьшено как можно скорее. Имейте в виду, что каждый шаблон графика будет работать против каждого совпадения предыдущих шаблонов. Вы можете думать о своем запросе как о серии вложенных циклов; Вы хотите избежать выполнения множества операций во внутренних циклах.

В вашем примере запроса вы можете, например, изменить его порядок следующим образом:

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)
}

Таким образом, вместо того, чтобы искать другой город и потенциально очень большое количество комбинаций городов, клубов и игроков, ограничьте выбор вторых команд, на которые вы смотрите, ограничив его только теми, за которых играли "интересные" игроки. Я также добавил проверку, чтобы избежать совпадения с той же командой для ?team и ?team2.

Не могу с уверенностью сказать, улучшит ли это ситуацию в вашем случае, это очень сильно зависит от конкретной конечной точки DBPedia, с которой вы работаете. Но с такими оптимизациями вы можете поэкспериментировать.

...