在SPARQL查询中过滤

时间:2014-02-08 22:48:18

标签: sparql dbpedia

我有以下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

然而,这没有任何回报。谁知道查询有什么问题?感谢。

1 个答案:

答案 0 :(得分:4)

  

你会看到你得到了很多结果。现在我想过滤   出于一个死亡原因,让我们说“交通碰撞”。所以这应该是   只需添加一个过滤器:

FILTER (?death_cause = "Traffic collision" ).

过滤器定义您保留的内容,而不是删除的内容,因此如果您想过滤 out 流量冲突,您实际上需要:

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 results