2011-12-14 124 views
2

我昨天开始自学SPARQL,并且正在针对dbpedia进行练习。我试图找回所有在指定目的地附近的两家俱乐部(即斯旺西和牛津)踢球的球员名单。我有以下查询,这工作,但速度很慢:优化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 . 

    :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的查询页面中不超时运行。

感谢您提供任何帮助!

回答

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端点。但这是你可以尝试的一种优化。

+0

由于DBPedia得到了一个更成熟的商店的支持,所以你希望他们的优化器是合理的,但是对于一般性的忠告建议是+1,但仍然有很多商店没有/次优化器 – RobV 2011-12-15 00:59:39