我昨天开始自学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/