過濾

2014-02-08 41 views
3

我有以下SPARQL查詢:過濾

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX type: <http://dbpedia.org/class/yago/>  
PREFIX prop: <http://dbpedia.org/property/> 
SELECT * 
WHERE { 
    ?person a foaf:Person; 
    foaf:name ?name; 
    prop:deathCause ?death_cause. 
    FILTER (langMatches(lang(?name), "EN")) . 
} 
LIMIT 50 

如果這個位置運行:http://dbpedia.org/snorql/

你會看到,你得到了不少成果。現在我想過濾一個死亡原因,讓我們說'交通碰撞'。所以這應該添加濾鏡是簡單的:

FILTER (?death_cause = "Traffic collision"). 

所以查詢應該再是:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX type: <http://dbpedia.org/class/yago/>  
PREFIX prop: <http://dbpedia.org/property/> 
SELECT * 
WHERE { 
    ?person a foaf:Person; 
    foaf:name ?name; 
    prop:deathCause ?death_cause. 
    FILTER (?death_cause = "Traffic collision"). 
    FILTER (langMatches(lang(?name), "EN")) . 
} 
LIMIT 50 

然而,這沒有返回。任何知道查詢有問題的人?謝謝。

回答

4

你會看到你會得到很多結果。現在我想過濾一個死亡原因 ,讓我們說'交通碰撞'。所以這應該是 只需添加一個過濾器:

FILTER (?death_cause = "Traffic collision"). 

過濾器定義什麼事情,你保持,刪除不算什麼東西,所以如果你想篩選出交通碰撞,你會其實想:

FILTER (?death_cause != "Traffic collision") 

如果你嘗試,不過,你還是會看到你的成績交通碰撞,因爲有"Traffic collision"和之間的差異210。前者(這是你的代碼將被移除的內容)是一個普通的文字(即沒有數據類型或語言標籤)。後者是帶有語言標記"en"的字面意思。這些是不是一樣,所以過濾掉一個不會過濾出另一個,保持一個不會保留另一個。要刪除"Traffic collision"@en,你可以篩選出來:

FILTER (?death_cause != "Traffic collision"@en) 

或者,您可以使用str函數來獲取文字的詞彙部分,所以你可以過濾掉"Traffic collision"不管語言標記(或數據類型中,如果出現作爲一個類型字面):

FILTER (str(?death_cause) != "Traffic collision") 

因此:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX type: <http://dbpedia.org/class/yago/>  
PREFIX prop: <http://dbpedia.org/property/> 
SELECT * 
WHERE { 
    ?person a foaf:Person; 
    foaf:name ?name; 
    prop:deathCause ?death_cause. 
    FILTER (langMatches(lang(?name), "EN")) . 
    FILTER (?death_cause != "Traffic collision"@en) 
} 
LIMIT 50 

SPARQL results

+1

謝謝!對不起,我其實並不是指_filter out_,我想要一個單一的死亡原因。但刪除「!」在你的答案的最後一個查詢解決了這個問題,並學習過濾_out_我考慮獎金!一個小的後續:在屬性名稱/變量周圍添加str()的原因是什麼?這並不明顯。 –

+1

@MariusLian RDF中的文字可以是純文本(無語言或數據類型),鍵入(帶有數據類型)或帶有語言標記的語言(帶有語言標籤)。 'str'從所有三種中提取字符串部分。我爲答案增加了更多解釋。 –

+0

所以實際上在其他過濾器中發生了什麼。 lang()函數提取語言部分。感謝您的明確解釋! –