[英]Filter in SPARQL query
我有以下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
但是這沒有任何回報。 誰知道查詢有什么問題? 謝謝。
你會看到你得到了很多結果。 現在我想過濾掉一個死因,讓我們說'交通碰撞'。 所以這應該只需添加一個過濾器:
FILTER (?death_cause = "Traffic collision" ).
過濾器定義什么事情,你留着 ,你不刪除哪些東西,所以如果你想過濾掉交通碰撞,你會真正想要的:
FILTER ( ?death_cause != "Traffic collision" )
但是,如果你嘗試這樣做,你仍然會在結果中看到交通碰撞,因為"Traffic collision"
和"Traffic collision"@en
之間存在差異。 前者(這是您的代碼將刪除的)是一個普通的文字(即沒有數據類型或語言標記)。 后者是一個帶有語言標簽"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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.