2013-10-07 49 views
4

我想要標題中沒有「The Lord of the rings」字符串的所有電影。我在Linked Movie Database SPARQL endpoint試過這個,但它不起作用。哪裏不對?SPARQL正則表達式不匹配

PREFIX m: <http://data.linkedmdb.org/resource/movie/> 
SELECT DISTINCT * WHERE { 
    ?film dc:title ?titulo_pelicula. 
    FILTER NOT EXISTS { 
     FILTER (regex(?titulo_pelicula, "The Lord of the Rings","i")) . 
    } 
} 
+0

今後,注意「關於您編寫​​的代碼問題的問題必須在問題本身中描述具體問題 - 幷包含有效代碼以再現問題。」和「要求提供代碼的問題必須對所解決的問題有最小的理解,包括嘗試的解決方案,爲什麼他們不工作,以及預期的結果。」在這種情況下,「不起作用」不夠明確。起初我以爲你沒有得到你所期望的結果,但在嘗試查詢時,我意識到它會產生一個錯誤。請更詳細地描述 –

+0

發生了什麼(無論您是否遇到錯誤,或者發生了什麼,但結果與預期不同)。 –

回答

4

首先,你應該清楚你的意思是「不工作。」起初,我認爲你的意思是,它不返回任何結果,但是當我在跑了the endpoint,我意識到,你實際上得到一個相當明確的錯誤消息,不好的事:

Parse error: 
PREFIX owl: <http://www.w3.org/2002/07/owl#> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
PREFIX oddlinker: <http://data.linkedmdb.org/resource/oddlinker/> 
PREFIX map: <file:/C:/d2r-server-0.4/mapping.n3#> 
PREFIX db: <http://data.linkedmdb.org/resource/> 
PREFIX dbpedia: <http://dbpedia.org/property/> 
PREFIX skos: <http://www.w3.org/2004/02/skos/core#> 
PREFIX dc: <http://purl.org/dc/terms/> 
PREFIX movie: <http://data.linkedmdb.org/resource/movie/> 
PREFIX m: <http://data.linkedmdb.org/resource/movie/> 
SELECT DISTINCT * WHERE { 
    ?film dc:title ?titulo_pelicula. 
    FILTER NOT EXISTS { 
     FILTER (regex(?titulo_pelicula, "The Lord of the Rings","i")) . 
    } 
} 

Lexical error at line 16, column 14. Encountered: " " (32), after : "NOT" 

你有語法錯誤,當你到NOT。端點基於原始SPARQL Query Language for RDF而不是SPARQL 1.1 Query Language。原始的SPARQL沒有NOT EXISTS

雖然這很容易解決。首先,認識到filter接受一個表達式,並且只保留表達式計算結果爲真的那些結果。當正則表達式匹配標題時,過濾器表達式regex(?titulo_pelicula, "The Lord of the Rings","i")返回true,並且您正在查找返回false的情況,因此您只需要使用!來否定它。 (該!操作是一樣的XPath函數not的映射在SPARQL推薦的部分11.3 Operator Mapping定義。)你需要這樣的查詢:

PREFIX m: <http://data.linkedmdb.org/resource/movie/> 
SELECT DISTINCT * WHERE { 
    ?film dc:title ?titulo_pelicula. 
    FILTER (!regex(?titulo_pelicula, "The Lord of the Rings","i")) . 
} 

SPARQL results

+0

謝謝,但我需要在標題中沒有「The Rorf of the Rings」這部電影,與該查詢完全相反。 – Ortzi

+0

@Ortzi哦,對不起!我誤解了這個問題。在這種情況下,你只需要使用'filter(!regex(...))'(注意'!')。我已經更新了我的答案。 –