如何在不同的本体中优雅地处理birthDate的dbpedia查询

时间:2018-03-25 15:15:15

标签: sparql dbpedia

我正在尝试从dbpedia.org中提取一些人的出生日期。但是,某些查询失败,因为数据属于不同的属性。例如:

PREFIX dbr: <http://dbpedia.org/resource/>
PREFIX dbo: <http://dbpedia.org/ontology/>

select ?birthDate where {
  dbr:Alan_Turing dbo:birthDate ?birthDate
}

应该返回1912-06-23,但是:

PREFIX dbr: <http://dbpedia.org/resource/>
PREFIX dbo: <http://dbpedia.org/ontology/>

select ?birthDate where {
  dbr:Grace_Hopper dbo:birthDate ?birthDate
}

返回空result

编辑添加:

最初的问题被live.dbpedia.org和dbpedia.org之间的差异搞糊涂了,这意味着尽管非实时版本有dbo:birthDate,但这两者在live.dbpedia.org上并不相同。如果您将Alan TuringGrace Hopper进行比较,您会发现他们的生育日期分为两个不同的本体。所以现在的问题是如何优雅地处理这些问题。

1 个答案:

答案 0 :(得分:1)

答案是使用UNION运算符从任何本体论中找到答案:

PREFIX dbr: <http://dbpedia.org/resource/>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbp: <http://dbpedia.org/property/>

select ?birthDate where {
  { dbr:Alan_Turing dbo:birthDate ?birthDate }
  UNION
  { dbr:Alan_Turing dbp:birthDate ?birthDate }
}

给我们two results,两者都是一样的。而对于Grace Hopper:

PREFIX dbr: <http://dbpedia.org/resource/>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbp: <http://dbpedia.org/property/>

select ?birthDate where {
  { dbr:Grace_Hopper dbo:birthDate ?birthDate }
  UNION
  { dbr:Grace_Hopper dbp:birthDate ?birthDate }
}

我们只获得one result

由于live.dbpedia.org已经有一堆namespace prefixes defined,并且正如@AKSW所建议的,我们可以进一步简化通话。 distinct关键字意味着将来自不同分类法的相同结果合并在一起:

select distinct ?birthDate {
  dbr:Grace_Hopper dbo:birthDate|dbp:birthDate ?birthDate
}

给予this result