这可能与以下几乎相同: 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"))}
在那里你会看到许多语言的属性列表,包括“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"))}
现在你会看到只有英文版的“抽象”,但“alexa rating 2”和许多其他非字符串值都消失了。
任何知道如何在第一个查询中获取所有属性,然后知道文字的人只会过滤掉英语吗?
答案 0 :(得分:10)
您的第二个查询 过滤掉具有英语以外语言标记的文字。在RDF 1.0中,有三种类型的文字:
所以Alexa评级,其值为2
,是文字,并且没有语言标记,因此语言标记肯定不是{{ 1}}(更重要的是,匹配 "EN"
; langMatches执行更复杂的检查)。你想要的是过滤掉非英语语言标记的文字。那并不难;你只需要将"EN"
添加到过滤器(因为lang为没有语言标记的文字返回“”):
lang(?value) = ""
阅读该过滤器的方法是:
保留
的值
- 不是文字; 或
- 是文字,但没有语言标签; 或
- 是具有与“en”匹配的语言标记的文字。
醇>
答案 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}}
通过这个简单的更改,现在消除了英语条目,我只看到非英语条目。