2011-12-14 121 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