我有以下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
然而,这没有任何回报。谁知道查询有什么问题?感谢。
答案 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