2011-06-08 63 views
3

我試圖運行http://dbpedia.org/sparql此查詢,但我得到一個錯誤,我的查詢是太昂貴了。當我運行查詢低谷http://dbpedia.org/snorql/我得到:SPARQL查詢的優化。 [預計執行時間超過極限1500(秒)]

The estimated execution time 25012730 (sec) exceeds the limit of 1500 (sec) ... 

當通過我的Python腳本使用SPARQLWrapper我只是得到一個HTTP 500

我想我需要做一些優化我的SPARQL查詢運行查詢。我需要用於迭代教育機構的數據並將其導入到本地數據庫中,也許我正在使用SPARQL錯誤,並應以完全不同的方式執行此操作。

希望有人能幫助我!

查詢

PREFIX owl: <http://www.w3.org/2002/07/owl#> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX dc: <http://purl.org/dc/elements/1.1/> 
PREFIX : <http://dbpedia.org/resource/> 
PREFIX dbpedia2: <http://dbpedia.org/property/> 
PREFIX dbpedia: <http://dbpedia.org/> 
PREFIX skos: <http://www.w3.org/2004/02/skos/core#> 

      SELECT DISTINCT ?uri 
       ?name 
       ?homepage 
       ?student_count 
       ?native_name 
       ?city 
       ?country 
       ?type 
       ?lat ?long 
       ?image 

      WHERE { 
       ?uri rdf:type dbpedia-owl:EducationalInstitution . 
       ?uri foaf:name ?name . 
       OPTIONAL { ?uri foaf:homepage ?homepage } . 
       OPTIONAL { ?uri dbpedia-owl:numberOfStudents ?student_count } . 
       OPTIONAL { ?uri dbpprop:nativeName ?native_name } . 
       OPTIONAL { ?uri dbpprop:city ?city } . 
       OPTIONAL { ?uri dbpprop:country ?country } . 
       OPTIONAL { ?uri dbpprop:type ?type } . 
       OPTIONAL { ?uri geo:lat ?lat . ?uri geo:long ?long } . 
       OPTIONAL { ?uri foaf:depiction ?image } . 
      } 
      ORDER BY ?uri 
      LIMIT 20 OFFSET 10 

回答

3

算了。只有一個SPARQL,您將無法從dbpedia獲取該查詢。這些可選項非常昂貴。

要圍繞你需要先運行類似的工作吧:

SELECT DISTINCT ?uri WHERE { 
       ?uri rdf:type dbpedia-owl:EducationalInstitution . 
       ?uri foaf:name ?name . 
} ORDER BY ?uri 
LIMIT 20 OFFSET 10 

然後在此查詢的結果集進行迭代,以形成單一的查詢中每個dbpedia-owl:EducationalInstitution如......(末尾註意到過濾器的查詢):

 SELECT DISTINCT ?uri 
      ?name 
      ?homepage 
      ?student_count 
      ?native_name 
      ?city 
      ?country 
      ?type 
      ?lat ?long 
      ?image 

     WHERE { 
      ?uri rdf:type dbpedia-owl:EducationalInstitution . 
      ?uri foaf:name ?name . 
      OPTIONAL { ?uri foaf:homepage ?homepage } . 
      OPTIONAL { ?uri dbpedia-owl:numberOfStudents ?student_count } . 
      OPTIONAL { ?uri dbpprop:nativeName ?native_name } . 
      OPTIONAL { ?uri dbpprop:city ?city } . 
      OPTIONAL { ?uri dbpprop:country ?country } . 
      OPTIONAL { ?uri dbpprop:type ?type } . 
      OPTIONAL { ?uri geo:lat ?lat . ?uri geo:long ?long } . 
      OPTIONAL { ?uri foaf:depiction ?image } . 
     FILTER (?uri = <http://dbpedia.org/resource/%C3%89cole_%C3%A9l%C3%A9mentaire_Marie-Curie>) 
     } 

其中<http://dbpedia.org/resource/%C3%89cole_%C3%A9l%C3%A9mentaire_Marie-Curie>已從第一個查詢中獲得。

...是這將是緩慢的,你可能不能夠爲一個在線應用程序運行此。建議:嘗試找出某種緩存機制,使其位於應用程序和dbpedia SPARQL端點之間。

+1

查詢從花費大約3分鐘到42小時運行,但它現在似乎一直工作。謝謝。 – Johan 2011-06-10 05:44:42

2

不要嘗試,並立刻得到了整個數據集!添加LIMITOFFSET條款,並使用通過數據的頁面。

隨着LIMIT 50添加我幾乎立即得到您的查詢結果,我設法得到的限制遠高於此,並仍然得到一個響應,所以玩它。一旦找到適用於您的頁面大小,只需重複查詢,並輸入OFFSET,直到您找不到更多結果,例如

SELECT * WHERE { ... } LIMIT 100 
SELECT * WHERE { ... } LIMIT 100 OFFSET 100 
... 
+0

我認爲問題不在於頁面大小,而在於'order by'和偏移量。隨着偏移的增加,訂單變得越來越昂貴。不完全確定這一點,但這是我的猜測。 – 2011-06-09 07:32:16

+1

我已經使用限制和偏移量來遍歷數據,即使嘗試只獲得1個資源,查詢仍然很昂貴。 – Johan 2011-06-10 05:27:17

+0

@msalvadores當我解釋文件時說它必須在查詢中有LIMIT和OFFSET時指定ORDER BY。 「[使用LIMIT和OFFSET選擇查詢解決方案的不同子集將不會有用,除非通過使用ORDER BY可以預測順序](http://www.w3.org/TR/rdf-sparql-query/#modOffset )」。 – Johan 2011-06-10 05:31:46

1

如果你知道確切的URI(例如,從先前的查詢),然後直接把URI在where子句中更快(在我的經驗至少)不是將URI中的過濾器。

例如,喜歡:

WHERE { <http:/...> ... } 

WHERE { ?uri .... FILTER (?uri...) 

而且我發現聯盟的實際執行比設計來匹配多個資源過濾器更快。

只是因爲我們正在做的SPARQL現在並不意味着我們可以忘記SQL調優的噩夢,歡迎SPARQL調整的奇妙世界!:)