仅当类型为文字时才过滤语言

Mar*_*ian 8 sparql dbpedia

这可能与以下几乎相同: 仅当对象是文字时才按语言过滤

问题是那里的答案在我的案例中不起作用.

我有这个问题:

SELECT ?property ?value
WHERE { <http://dbpedia.org/resource/Facebook> ?property ?value
FILTER(STRSTARTS(STR(?property), "http://dbpedia.org/property") || STRSTARTS(STR(?property), "http://dbpedia.org/ontology"))}
Run Code Online (Sandbox Code Playgroud)

结果在Virtuoso

在那里你会看到许多语言的属性列表,包括"alexa rating 2"和"abstract".

如果我在上面提到的问题中尝试建议的解决方案:

SELECT ?property ?value
WHERE { <http://dbpedia.org/resource/Facebook> ?property ?value
FILTER(STRSTARTS(STR(?property), "http://dbpedia.org/property") || STRSTARTS(STR(?property), "http://dbpedia.org/ontology"))
FILTER(!isLiteral(?value) || langMatches(lang(?value), "EN"))}
Run Code Online (Sandbox Code Playgroud)

结果在Virtuoso

现在你会看到只有"抽象"的英文版本,但"alexa rating 2"和许多其他非字符串值都消失了.

任何知道如何获得所有属性的人如第一个查询,然后文字只过滤掉英语语言?

Jos*_*lor 10

您的第二个查询筛选出具有英语以外语言标记的文字.在RDF 1.0中,有三种类型的文字:

  • 普通文字(没有数据类型,也没有语言标记)
  • 语言标记文字(字符串和语言标记)
  • 数据类型文字(词法形式和数据类型)

所以,Alexa的评级,这具有的价值2,文字,也没有语言标签,所以语言的标签肯定不是"EN"(更重要的是,不匹配 "EN" ; langMatches做一些更复杂的检查) .你想要的是过滤掉非英语语言标记的文字.那并不难; 你只需要添加lang(?value) = ""到过滤器(因为lang为没有语言标记的文字返回""):

SELECT ?property ?value
WHERE { <http://dbpedia.org/resource/Facebook> ?property ?value
FILTER(STRSTARTS(STR(?property), "http://dbpedia.org/property") || STRSTARTS(STR(?property), "http://dbpedia.org/ontology"))
FILTER(!isLiteral(?value) || lang(?value) = "" || langMatches(lang(?value), "EN"))}
Run Code Online (Sandbox Code Playgroud)

SPARQL结果

读取该过滤器的方法是:

保持价值观

  1. 不是文字; 要么
  2. 是文字,但没有语言标签; 要么
  3. 是具有与"en"匹配的语言标记的文字.