11

以下 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
4

2 回答 2

9

请注意,要添加前缀,您必须在声明和查询中使用相同的前缀(dbo-> dbo,而不是dbo-> 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
于 2016-05-09T22:15:24.443 回答
7

语言标签是数据库中的注释。您的过滤器工作正常。数据库中的一些值en即使在不同的脚本中也会被注释。您需要编写自己的逻辑来选择最合适的属性。我可能只是使用该rdfs:label属性并切断括号中的任何内容(如"Black Hawk (Sauk leader)"@en)。这似乎提供了不错的结果。

另请注意,您需要将FILTERs for ?birthnameand?nameExact 放入相应的OPTIONAL块中,否则它们最终将删除任何没有可选属性的匹配项。

于 2012-09-11T18:22:01.790 回答