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

Kri*_*ian 6 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
Run Code Online (Sandbox Code Playgroud)

当我用FILTER这种方式写行时,我基本上过滤掉了所有非文字(侧面问题:文字是唯一可以有语言标签的类型吗?)

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

O. *_*per 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
Run Code Online (Sandbox Code Playgroud)

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