optimization - 优化SPARQL查询

标签 optimization sparql dbpedia

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

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

最佳答案

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

关于optimization - 优化SPARQL查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8507692/

相关文章:

javascript - 缩短Jquery条件

error-handling - 如何在jena sparql中执行删除查询?

sparql - 或在 sparql 查询中

sparql - 如何获取维基百科根类别的终端叶子

javascript - 世界上有没有针对简单函数式语言自身的强大优化编译器?

.net - 使用 ThreadStatic 替换昂贵的 locals —— 好主意?

c++ - 优化 “coincidence search”算法以提高速度

java - 为 MESH 端点执行 SPARQL 查询时出现问题

Sparql-实体和实例的数量?

java - SPARQL 查询返回 null