2

我昨天开始自学 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 的查询页面中运行而不会超时。

感谢您的任何帮助,您可以提供!

4

1 回答 1

2

您的查询是一个完全有效的查询,在理想情况下,处理您的查询的 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 端点。但这是您可以尝试的优化类型。

于 2011-12-14T17:17:39.777 回答