我写了以下查询:
SELECT DISTINCT
?predicate
?object
?label
WHERE {
VALUES ?subject { <http://dbpedia.org/resource/Hercules_(1997_film)> }
?subject ?predicate ?object .
?predicate rdfs:label ?label .
FILTER(langMatches(lang(?object), "EN"))
}
LIMIT 100
当我以这种方式写FILTER
行时,我基本上过滤掉了所有非文字(方面的问题:文字是唯一可以拥有语言标记的类型吗?)
那么,我如何保留所有结果并过滤掉非英语文字?
答案 0 :(得分:5)
您可以使用isLiteral
function仅将语言限制应用于文字对象。
x暗示y 可以用SPARQL运算符表示为!x || y ,所以你可以像这样编写你的查询:
SELECT DISTINCT
?predicate
?object
?label
WHERE {
VALUES ?subject { <http://dbpedia.org/resource/Hercules_(1997_film)> }
?subject ?predicate ?object .
?predicate rdfs:label ?label .
FILTER(!isLiteral(?object) || langMatches(lang(?object), "EN"))
}
LIMIT 100
关于您的第二个问题,description for language tags from the RDF concepts and abstracts仅提及语言标记作为普通文字的一部分出现。同样,grammar in the SPARQL 1.1 specification仅在LANGTAG
nonterminal中使用RDFLiteral
production作为独占替代,而不是数据类型IRI。