SPARQL查询中的过滤器

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

然而,这并没有返回任何结果。有人知道查询有什么问题吗?谢谢。
1个回答

4

You will see that you get a lot of results. Now I would like to filter out one death cause, let's say 'Traffic collision'. So this should be simply by adding a filter:

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结果


1
谢谢!抱歉,我实际上不是想要“过滤掉”,我想要一个单一的死因。但是,在您答案中的最后一个查询中删除“!”可以解决这个问题,并且学会过滤“out”也是一个额外的奖励!一个小的后续问题:在属性名称/变量周围添加str()的原因是什么?这并不明显。 - Marius Lian
1
@MariusLian RDF中的文字可以是普通的(没有语言或数据类型),带有数据类型的类型化文字,或带有语言标签的语言标记文字。 str从这三种文字中提取字符串部分。我已经在答案中添加了更多解释。 - Joshua Taylor
所以实际上在另一个过滤器中就是这样发生的。lang()函数提取语言部分。感谢清晰的解释! - Marius Lian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接