首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >优化SPARQL查询

优化SPARQL查询
EN

Stack Overflow用户
提问于 2011-12-15 00:09:07
回答 1查看 440关注 0票数 2

我昨天开始自学SPARQL,我正在练习使用dbpedia。我正在尝试检索在指定目的地附近的两个俱乐部(即斯旺西和牛津)踢过球的所有足球运动员的名单。我有以下查询,它可以工作,但非常慢:

代码语言:javascript
运行
复制
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的查询页面中运行而不超时。

感谢您能提供的任何帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-15 01:17:40

您的查询是一个完全有效的查询,在理想情况下,处理您的查询的SPARQL查询引擎将以最佳方式运行。然而,许多SPARQL实现还没有得到很好的查询优化器,因此您经常必须自己优化查询。通常,您可以通过对查询的某些部分进行重新排序来完成此操作。

一种常见的技术是尝试对查询中的图形模式进行排序,以便尽快减少查询结果的数量。请记住,每个图形模式都将针对先前模式的每个匹配运行。您可以将查询看作一系列嵌套循环;您希望避免在内部循环中执行大量操作。

例如,在查询示例中,您可以将其重新排序,如下所示:

代码语言:javascript
运行
复制
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端点。但这是一种你可以尝试的优化方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8507692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档