簡體   English   中英

在SPARQL查詢中過濾

[英]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

SPARQL結果

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM