SPARQL查询中的过滤器

SPARQL查询中的过滤器,sparql,dbpedia,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:

我有以下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
因此,查询应该是:

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
前缀rdfs:
前缀类型:
前缀道具:
挑选*
在哪里{
?人员a foaf:人员;
foaf:名称?名称;
道具:死亡原因?死亡原因。
过滤器(?死亡原因=“交通碰撞”)。
过滤器(langMatches(lang(?name),“EN”))。
}
限制50
然而,这不会返回任何结果。有人知道这个查询有什么问题吗?谢谢

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

FILTER (?death_cause = "Traffic collision").
FILTER (?death_cause = "Traffic collision" ).
过滤器定义您保留的内容,而不是删除的内容,因此,如果您想过滤掉交通冲突,您实际上需要:

FILTER ( ?death_cause != "Traffic collision" )
但是,如果您尝试这样做,您仍然会在结果中看到交通冲突,因为
“交通冲突”
“交通冲突”@en
之间存在差异。前者(代码将要删除的内容)是纯文本(即,没有数据类型或语言标记)。后者是带有语言标记“en”的文本。它们不一样,所以过滤掉一个不会过滤掉另一个,保留一个也不会保留另一个。要删除
“Traffic collision”@en
,您可以使用以下选项将其过滤掉:

FILTER ( ?death_cause != "Traffic collision"@en )
或者,您可以使用该函数获取文本的词法部分,以便过滤掉
“Traffic collision”
,而不考虑语言标记(或数据类型,如果它显示为类型化文本):

因此:

前缀rdfs:
前缀类型:
前缀道具:
挑选*
在哪里{
?人员a foaf:人员;
foaf:名称?名称;
道具:死亡原因?死亡原因。
过滤器(langMatches(lang(?name),“EN”))。
过滤器(?死亡原因!=“交通碰撞”@en)
}
限制50

谢谢!对不起,我不是说过滤掉,我想要一个单一的死亡原因。但是删除你答案中最后一个查询中的“!”,解决了这个问题,学习过滤掉,我认为是一个奖励!下面是一个小问题:在属性名/变量周围添加str()的原因是什么?这并不明显。@RDF中的MariusLian文本可以是普通的(无语言或数据类型)、类型化的(带有数据类型)或带有语言标记的(带有语言标记)
str
从所有三种类型中提取字符串部分。我对答案做了更多的解释,所以实际上在另一个过滤器中就是这样。函数的作用是:提取语言部分。谢谢你的解释!
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