以下SPARQL查询无法获得我想要的结果,因为它们使用的语言不是英语,而不管filter lang 'en'
(请参阅查询中的过滤器)。
查询结果:
"Никола́й Ива́нович Буха́рин"@en "Никола́й Буха́рин"@en "Nikolai Bukharin"@en
"Gamal Abdel Nasser Hussein"@en "جمال عبد الناصر"@en "Gamal Abdel Nasser"@en
我查看了DBpedia页面,我看到有英文版的名称,但我不明白为什么过滤器不起作用!!!
有人可以帮我吗?
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbpedia: <http://dbpedia.org/property/>
SELECT DISTINCT ?person ?birthname ?nameExact ?label
where {
?person rdf:type dbpedia-owl:Person .
?person rdfs:label ?label .
OPTIONAL { ?person dbpedia-owl:birthName ?birthname . }
OPTIONAL { ?person dbpprop:name ?nameExact . }
FILTER (lang(?birthname) = 'en')
FILTER (lang(?label) = 'en')
FILTER (lang(?nameExact) = 'en')
}
LIMIT 300
答案 0 :(得分:6)
语言标记是数据库中的注释。您的过滤器工作正常。数据库中的某些值使用en
进行注释,即使它们位于不同的脚本中。您需要编写自己的逻辑来选择最合适的属性。我可能只是使用rdfs:label
属性并截断括号中的任何内容(如"Black Hawk (Sauk leader)"@en
中所示)。这似乎提供了不错的结果。
另请注意,您需要将FILTER
和?birthname
的?nameExact
放入相应的OPTIONAL
块中,否则它们将结束删除任何没有可选属性的匹配。
答案 1 :(得分:5)
注意前缀必须在声明和查询中使用相同的内容(dbo
- &gt; dbo
,而不是dbo
- &gt; dbpedia-owl
)
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbp: <http://dbpedia.org/property/>
SELECT DISTINCT ?person ?birthname ?nameExact ?label
where {
?person rdf:type dbo:Person .
?person rdfs:label ?label .
OPTIONAL { ?person dbo:birthName ?birthname . }
OPTIONAL { ?person dbp:name ?nameExact . }
FILTER (lang(?birthname) = 'en')
FILTER (lang(?label) = 'en')
FILTER (lang(?nameExact) = 'en')
}
LIMIT 300