仅当对象是文字时才按语言过滤

时间:2014-02-10 19:07:54

标签: database rdf sparql triplestore

我写了以下查询:

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行时,我基本上过滤掉了所有非文字(方面的问题:文字是唯一可以拥有语言标记的类型吗?

那么,我如何保留所有结果并过滤掉非英语文字

1 个答案:

答案 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。