这可能与以下几乎相同: 仅当对象是文字时才按语言过滤
问题是那里的答案在我的案例中不起作用.
我有这个问题:
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)
在那里你会看到许多语言的属性列表,包括"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)
现在你会看到只有"抽象"的英文版本,但"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)
读取该过滤器的方法是:
保持价值观
- 不是文字; 要么
- 是文字,但没有语言标签; 要么
- 是具有与"en"匹配的语言标记的文字.