2015-02-07 38 views
0

我是新來的SPARQL,我嘗試做以下的事情對我的任務:SPARQL查詢與過濾器在某個日期

我需要拔出演員,但只有那些出生在一個定義日期。我的問題是,每次我嘗試按特定的整數值進行篩選時,我都會收到「出錯查詢,查看詳細原因」(順便說一句,我不知道這個問題是什麼「原因」,沒有錯誤日誌,或任何可點擊的東西來實際檢查出錯的地方)。

這裏是我的查詢:

PREFIX owl: <http://www.w3.org/2002/07/owl#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX movie: <http://data.linkedmdb.org/resource/movie/> 
PREFIX dcterms: <http://purl.org/dc/terms/> 
PREFIX db: <http://dbpedia.org/ontology/> 
PREFIX dbpprop: <http://dbpedia.org/property/> 
prefix xsd: <http://www.w3.org/2001/XMLSchema#> 

SELECT ?actor ?dbpediaLink ?name ?date month(?date) WHERE { 
     ?actor a movie:actor . 
     ?actor owl:sameAs ?dbpediaLink . 
    SERVICE <http://dbpedia.org/sparql> { 
     ?dbpediaLink dbpprop:name ?name . 
     ?dbpediaLink dbpprop:dateOfBirth ?date 
    } 
    FILTER(month(?date) = 2) 
} 
LIMIT 10 

所以,我想在這裏做的就是二月出生的所有行動者,以及與此我得到上述錯誤。

FILTER以下組合返回提到的錯誤:

FILTER(month(?date) = 2) 
FILTER(month(?date) > 1 && month(?date) < 3) 
FILTER(month(?date) >= 2 && month(?date) <=2) 

基本上所有的變化對於找回僅二月出生的人返回錯誤。我甚至嘗試將整數明確地作爲"2"^^xsd:integer(因爲month()函數返回一個整數)並且它仍然失敗。

我也試過(對於其他一些問題)來獲得名稱中有10個字母的演員,但我也遇到了同樣的問題。

看來,任何FILTER我試圖使用=或嘗試FILTER由多個條件(使用&&)失敗。

我被困在這最後2天...我錯過了什麼嗎?

我也許應該提到,我使用的是本地部署的定式服務器LMDB轉儲,而我在http://localhost:3030

回答

2

運行查詢要開始使用您的查詢中有無效的語法,你不能把month(?date)直接在您的SELECT子句中,因爲您必須在其中括起括號 - () - 以及使用AS的別名,例如, -

PREFIX owl: <http://www.w3.org/2002/07/owl#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX movie: <http://data.linkedmdb.org/resource/movie/> 
PREFIX dcterms: <http://purl.org/dc/terms/> 
PREFIX db: <http://dbpedia.org/ontology/> 
PREFIX dbpprop: <http://dbpedia.org/property/> 
prefix xsd: <http://www.w3.org/2001/XMLSchema#> 

SELECT ?actor ?dbpediaLink ?name ?date (month(?date) AS ?month) WHERE { 
     ?actor a movie:actor . 
     ?actor owl:sameAs ?dbpediaLink . 
    SERVICE <http://dbpedia.org/sparql> { 
     ?dbpediaLink dbpprop:name ?name . 
     ?dbpediaLink dbpprop:dateOfBirth ?date 
    } 
    FILTER(month(?date) = 2) 
} 
LIMIT 10 

引用的「原因」是導致顯示給您的異常的異常。如果使用代碼提交查詢,請捕獲異常,並檢查getCause()方法以查看是否存在其他異常對象。

請注意,如果您使用的是標準Fuseki安裝程序,則可能會有更多錯誤信息記錄到您啓動Fuseki服務器的終端窗口(或重定向服務器進程輸出到的任何位置)。

該問題不太可能是過濾器,因爲SPARQL規範定義了FILTER以將表達式評估中的任何錯誤視爲false

如果問題不只是您的錯誤語法,那麼最有可能的罪魁禍首是您的查詢中的SERVICE子句,它要求Fuseki去查詢http://dbpedia.org/sparql中的一些信息。 SERVICE被定義爲如果聯繫遠程服務失敗,則整個查詢失敗。因此,您可能無法從您的計算機訪問該服務,或者DBPedia端存在導致此問題的錯誤(這是前所未聞的)。

您可以在瀏覽器中瀏覽到該URL嗎?如果可以,您是否可以使用其中的Web界面成功運行出現在SERVICE子句中的部分查詢?

請注意,您可以在SERVICE關鍵字後添加SILENT關鍵字,即使遠程服務請求失敗,查詢引擎也會繼續運行。 -

PREFIX owl: <http://www.w3.org/2002/07/owl#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX movie: <http://data.linkedmdb.org/resource/movie/> 
PREFIX dcterms: <http://purl.org/dc/terms/> 
PREFIX db: <http://dbpedia.org/ontology/> 
PREFIX dbpprop: <http://dbpedia.org/property/> 
prefix xsd: <http://www.w3.org/2001/XMLSchema#> 

SELECT ?actor ?dbpediaLink ?name ?date month(?date) WHERE { 
     ?actor a movie:actor . 
     ?actor owl:sameAs ?dbpediaLink . 
    SERVICE SILENT <http://dbpedia.org/sparql> { 
     ?dbpediaLink dbpprop:name ?name . 
     ?dbpediaLink dbpprop:dateOfBirth ?date 
    } 
    FILTER(month(?date) = 2) 
} 
LIMIT 10 
+0

非常感謝你,增加'無聲'解決了我的問題,但我不知道爲什麼。如果對dbpedia的請求失敗,我如何獲得'FILTER'中使用的日期?我得到的結果正是我所需要的,10月2日出生的演員。 – mercin 2015-02-08 11:20:38

+0

@mercin - 您添加的「SILENT」可能似乎是修復,但恰好與其他一些更改(可能是DBpedia重新啓動,或網絡故障已修復等)一致。 – TallTed 2017-08-28 16:13:49