【问题标题】:How to gracefully handle dbpedia queries of birthDate in different ontologies如何优雅地处理不同本体中birthDate的dbpedia查询
【发布时间】:2018-03-25 15:15:15
【问题描述】:

我正在尝试从 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 之间的差异弄糊涂了,这意味着尽管 non-live 版本在两者中都有 dbo:birthDate 这在 live.dbpedia.org 上并不相同。如果您将Alan TuringGrace Hopper 进行比较,您会发现它们的出生日期在两个不同的本体中。所以现在的问题是如何优雅地处理这些问题。

【问题讨论】:

  • 您在 live.dbpedia.org 上查询。你应该使用dbp:birthDate|dbo:birthDate 之类的东西。见live.dbpedia.org/page/Grace_Hopper
  • @StanislavKralin 抱歉,我不太明白 - live.dbpedia.org 和 dbpedia.org 有什么区别?它们不是来自相同的数据吗,维基百科?我现在对这两种类型都使用了 UNION,但我仍然看到一些失败。
  • @StanislavKralin 啊,后来的失败在我处理表格时限制了速率。你是要提出一个我可以接受的答案,还是我自己回答?
  • 我认为这是 stackoverflow.com/q/48345125 的副本,可能还有许多其他问题......
  • @stsquad 是的,来源是相同的,即维基百科——但是,一个是实时版本,另一个是基于转储的版本。但一切都在 Stanislav 的链接中详细解释。

标签: sparql dbpedia


【解决方案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,两者都一样。对于格蕾丝·霍珀:

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

【讨论】:

  • 那是不必要的冗长......斯坦尼斯拉夫已经提供了答案select distinct ?birthDate { dbr:Grace_Hopper dbo:birthDate|dbp:birthDate ?birthDate }
  • @AKSW 无法使其工作,即使使用 distinct 关键字。我得到“Virtuoso 37000 Error SP030: SPARQL compiler, line 6: Undefined namespace prefix in prefix:localpart notation at 'dpb:birthDate' before '?birthDate'”。但是,如果它比我的更短/更简洁,我会很乐意接受另一个有效的答案。我只添加了我的工作代码,这样就有了问题的答案,人们不必去寻找 cmets。
  • @stsquad,dbp:,而不是dpb:!无论如何,| 应该会导致 DBpedia 的性能下降,尤其是。有多个“起点”(例如SELECT * WHERE { VALUES (?s) {(dbr:Alan_Turing) (dbr:Grace_Hopper)} ?s dbp:birthDate|dbo:birthDate ?birthDate }
  • @stsquad 如果您只是复制我的查询,您就不会看到此错误...
  • 顺便说一下,我一次只查找一个名称的原因是因为 SPARQL 片段被调用为each entry in table in org-mode
猜你喜欢
  • 2015-03-09
  • 1970-01-01
  • 2011-11-26
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
  • 1970-01-01
  • 2017-09-10
  • 1970-01-01
相关资源
最近更新 更多