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

时间:2014-10-29 21:32:24

标签: sparql dbpedia

这可能与以下几乎相同: Filter by language only if the object is a literal

问题是那里的答案在我的情况下不起作用。

我有这个问题:

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"))}

Result in 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"))}

Result in Virtuoso

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

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

2 个答案:

答案 0 :(得分:10)

您的第二个查询 过滤掉具有英语以外语言标记的文字。在RDF 1.0中,有三种类型的文字:

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

所以Alexa评级,其值为2文字,并且没有语言标记,因此语言标记肯定不是{{ 1}}(更重要的是,匹配 "EN"; langMatches执行更复杂的检查)。你想要的是过滤掉非英语语言标记的文字。那并不难;你只需要将"EN"添加到过滤器(因为lang为没有语言标记的文字返回“”):

lang(?value) = ""

SPARQL results

阅读该过滤器的方法是:

  

保留

的值      
      
  1. 不是文字;
  2.   
  3. 是文字,但没有语言标签;
  4.   
  5. 是具有与“en”匹配的语言标记的文字。
  6.   

答案 1 :(得分:0)

所以听起来你只想在语言上反转过滤条件吗?

在这种情况下,您只需在langMatches之前添加!来反转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"))} 来电,即向其添加not运算符:

{{1}}

Result in DBPedia

通过这个简单的更改,现在消除了英语条目,我只看到非英语条目。