Ваш запрос является абсолютно корректным, и в идеальном мире механизм запросов 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, с которой вы работаете. Но с такими оптимизациями вы можете поэкспериментировать.