6

我写了以下查询:

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

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

4

1 回答 1

5

您可以使用该isLiteral函数将语言限制仅应用于文字对象。

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

至于您的第二个问题,来自 RDF 概念和摘要的语言标签的描述仅提到语言标签作为普通文字的一部分出现。同样,SPARQL 1.1 规范中的语法仅在产生式中使用LANGTAG非终结符作为排他性替代方案,而不是数据类型 IRI。RDFLiteral

于 2014-02-10T19:17:23.497 回答