2017-10-19 71 views
2

當我在nobel prize database執行這句話時我得到了錯誤,當我避免使用LIMIT子句時。SPARQL查詢沒有LIMIT子句不起作用

下一個查詢的工作,因爲它具有LIMIT條款:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX nobel: <http://data.nobelprize.org/terms/> 
PREFIX cat: <http://data.nobelprize.org/resource/category/> 
PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
PREFIX dbo: <http://dbpedia.org/ontology/> 
PREFIX dbp: <http://dbpedia.org/property/> 
PREFIX dbr: <http://dbpedia.org/resource/> 
PREFIX owl: <http://www.w3.org/2002/07/owl#> 

SELECT DISTINCT ?parentName ?childName 
WHERE { 
    ?child owl:sameAs ?personChild ; 
     foaf:name ?childName . 

    SERVICE <http://dbpedia.org/sparql> { 
    { ?personParent dbp:children ?personChild . } 
    UNION 
    { ?personChild dbp:parents ?personParent . } 
    } 

    ?parent owl:sameAs ?personParent ; 
     foaf:name ?parentName . 
} LIMIT 2 

這是奇怪的,因爲相同的查詢不工作的時候我刪除LIMIT條款,而不是結果我得到了一個錯誤信息:

錯誤500:HTTP 400錯誤進行查詢:壞請求

什麼是這種行爲的原因是什麼?難道我做錯了什麼?

謝謝。

+2

這是不是相同的查詢只是沒有'LIMIT'?三重商店是'Fuseki - 版本1.1.0'也許它失敗了,因爲沒有'LIMIT'因爲聯合查詢太昂貴,也許導致超時。實際上,根據實現的不同,在「SERVICE」子句中調用的遠程服務也可能存在問題。 – AKSW

+1

我建議設置您自己的三重商店並在本地加載數據。然後你可以得到更好的錯誤日誌並完全控制。至少加載諾貝爾獎的RDF轉儲不應該那麼耗時。 – AKSW

+1

@AKSW謝謝我要試試這個。 – winter

回答

2

我已經從Fuseki 1中加載了一小部分三元組到我的Fuseki 2並分析了網絡日誌。

執行查詢,定式(或相當ARQ)發送到DBpedia的這種(實際上,前綴擴展)的許多疑問:

SELECT * 
WHERE 
    { { ?personParent dbp:children viaf:58991016 } 
    UNION 
     { viaf:58991016 dbp:parents ?personParent } 
    } 

突然,定式發送此查詢:

SELECT * 
WHERE 
    { { ?personParent dbp:children <Barack Obama> } 
    UNION 
     { <Barack Obama> dbp:parents ?personParent } 
    } 

上述查詢中的這個奇怪的URI無效。你可以自己查看,點擊「Barack Obama」this page

Virtuoso返回一個錯誤,Fuseki停止執行。

如果LIMIT子句沒有被省略,那麼Fuseki在發送錯誤的上述查詢之前從DBpedia中檢索到足夠數量的結果(並且無誤地停止執行)。

我建議一些過濾條件添加到您的查詢:

PREFIX afn: <http://jena.hpl.hp.com/ARQ/function#> 

SELECT DISTINCT ?parentName ?childName 
WHERE { 
    ?child owl:sameAs ?personChild ; 
     foaf:name ?childName . 
    FILTER (afn:namespace(?personChild) = str(dbpedia:)) 

    SERVICE <http://dbpedia.org/sparql> { 
    { ?personParent dbpprop:children ?personChild . } 
    UNION 
    { ?personChild dbpprop:parents ?personParent . } 
    FILTER (isIRI(?personParent)) 
    } 

    ?parent owl:sameAs ?personParent ; 
     foaf:name ?parentName . 
} 

Run it!

結果應該是:

+-------------------------------+----------------------+ 
|   parentName   |  childName  | 
+-------------------------------+----------------------+ 
| "Marie Curie, née Sklodowska" | "Irène Joliot-Curie" | 
| "Pierre Curie"    | "Irène Joliot-Curie" | 
| "Karl Manne Georg Siegbahn" | "Kai M. Siegbahn" | 
+-------------------------------+----------------------+ 

在上面的查詢:

  • PREFIX afn: <http://jena.hpl.hp.com/ARQ/function#> - afn:前綴declaration Fuseki 1;

  • FILTER (afn:namespace(?personChild) = str(dbpedia:)) - 過濾掉不正確的URI(以及非DBpedia URI,減少查詢次數);

  • FILTER (isIRI(?personParent)) - 過濾掉屬性的偶然字面值,稍微減少DBpedia響應大小。


現在我明白了,你爲什麼不直接使用有關諾貝爾獎DBpedia的數據。炫技7條蟲子似乎的DBpedia的數據質量斯庫拉和卡律布狄斯之間的最短路徑,如下所示:

SELECT DISTINCT ?dbpediaChild ?dbpediaParent { 
    VALUES (?award2) { (dbr:Nobel_Prize_in_Chemistry) 
         (dbr:Nobel_Prize_in_Physics) 
         (dbr:Nobel_Peace_Prize) 
         (dbr:Nobel_Prize_in_Physiology_or_Medicine) 
         (dbr:Nobel_Prize_in_Literature) } 
    VALUES (?award1) { (dbr:Nobel_Prize_in_Chemistry) 
         (dbr:Nobel_Prize_in_Physics) 
         (dbr:Nobel_Peace_Prize) 
         (dbr:Nobel_Prize_in_Physiology_or_Medicine) 
         (dbr:Nobel_Prize_in_Literature) } 
    ?award1 a dbo:Award . 
    ?award2 a dbo:Award . 
    ?dbpediaChild dbo:award/(dbo:wikiPageRedirects*) ?award1 . 
    ?dbpediaParent dbo:award/(dbo:wikiPageRedirects*) ?award2 . 
    ?dbpediaChild dbp:parents|^dbp:children ?dbpediaParent . 
} 

Run it!

然而,其結果將是唯一的:

+-------------------------+--------------------+ 
|  dbpediaChild  | dbpediaParent | 
+-------------------------+--------------------+ 
| dbr:Kai_Siegbahn  | dbr:Manne_Siegbahn | 
| dbr:Irène_Joliot-Curie | dbr:Marie_Curie | 
+-------------------------+--------------------+ 
+0

感謝您的建議,我打算應用它! – winter

+0

我有一個關於你的第一個查詢的問題,在你的第一個命題中添加'dbpediaChild(dbpprop:parents |^dbpprop:children)?dbpediaParent .'而不是'UNION'子句,但是現在,你提議使用'UNION'再說一次,這是否存在? – winter

+1

@ winter,不,沒關係。 –