SPARQL查询DBpedia返回错误类型结果的处理及源数据编辑
问题解答
1. 优化SPARQL过滤错误结果
你尝试的两种方法都能有效过滤掉那个错误的广播节目条目,这里补充细节和更健壮的方案:
方案一:保留dbo:birthDate约束(推荐)
真实的人物实体几乎都有出生日期属性,而广播节目这类非人物条目不会有,这个约束能精准过滤大部分错误。注意要补全所有缺失的前缀,优化后的完整查询:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX dbo: <http://dbpedia.org/ontology/> PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT * WHERE { ?person rdfs:label 'Douglas Adams'@en; rdf:type dbo:Person; foaf:isPrimaryTopicOf ?wikipage; dbo:wikiPageWikiLink ?linkedPerson. ?linkedPerson rdf:type dbo:Person; foaf:isPrimaryTopicOf ?linkedwikipage; dbo:birthDate ?_. }
注:?_是占位符变量,表示我们只关心属性存在,不需要具体值
方案二:结合foaf:Person与排除错误类型
如果担心少数无出生日期的合法人物被过滤,可以同时要求linkedPerson属于foaf:Person(DBpedia中正确的人物实体都会关联这个类型),再加上排除广播类实体的过滤:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX dbo: <http://dbpedia.org/ontology/> PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT * WHERE { ?person rdfs:label 'Douglas Adams'@en; rdf:type dbo:Person; foaf:isPrimaryTopicOf ?wikipage; dbo:wikiPageWikiLink ?linkedPerson. ?linkedPerson rdf:type dbo:Person, foaf:Person; foaf:isPrimaryTopicOf ?linkedwikipage. # 排除广播节目类实体 FILTER NOT EXISTS { ?linkedPerson rdf:type dbo:BroadcastProgram } }
另外要注意:你最初的查询里缺失了dbo和foaf的前缀定义,这会导致查询报错,所有SPARQL查询必须补全用到的命名空间前缀。
2. 修正DBpedia中的错误类型标记
DBpedia的元数据是自动从维基百科抽取的,无法直接编辑DBpedia的数据库,必须修改维基百科的源条目,等待DBpedia同步更新:
- 打开该条目对应的维基百科页面,检查页面的信息框(Infobox)和分类:这个广播节目被识别为
dbo:Person,大概率是因为信息框用错了模板(比如误用了人物信息框),或者分类里错误添加了人物相关分类。 - 修改维基百科条目:替换为正确的信息框模板(比如广播节目类模板),移除错误的人物分类。
- 等待DBpedia更新:DBpedia会定期重新抽取维基百科数据,修正后的条目会在下一次更新时同步到DBpedia,
rdf:type就会变成正确的类型(比如dbo:BroadcastProgram)。 - 若想快速反馈错误,可通过DBpedia的官方反馈渠道提交问题,但最终还是要依赖维基百科的源数据修正。
内容的提问来源于stack exchange,提问作者monojohnny
相关产品推荐
相关产品推荐

