【发布时间】:2021-06-27 19:01:54
【问题描述】:
我想在 DBPedia 中查询所有活过整个 20 世纪的人。 我使用https://dbpedia.org/sparql/ 来处理我的查询。我已将输出限制为 20。
我尝试过的查询如下:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbp: <http://dbpedia.org/property/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
SELECT ?personName ?birthDate ?deathDate
WHERE {
FILTER (?birthDate < "1900-01-01"^^xsd:date AND ?deathDate > "1999-12-31"^^xsd:date).
?p rdf:type dbo:Person.
?p dbp:name ?personName.
?p dbp:birthDate ?birthDate.
?p dbp:deathDate ?deathDate.
}
LIMIT 20.
在输出中,所有人都在 1999 年 12 月 31 日之后死亡,但他们不是在 1900 年 1 月 1 日之前出生的。 为什么我的查询错误?我该如何解决?
提前感谢您的宝贵时间。
【问题讨论】:
-
问题出在数据类型上。通过查看例如检查其中一个人。 dbpedia.org/page/Errol_Scorcher -
dbp:birthDate在这里只是一个整数值,不可能将 int 与日期进行比较。您应该使用http://dbpedia.org/ontology/命名空间来代替强类型属性和值。在您的情况下,请使用dbo:birthDate和dbo:deathDate -
是的,一旦你这样做了,你会发现许多条目的 Wikipedia/DBpedia 的数据质量很差......所以很多时候出生日期或死亡日期都是错误的 - 你可以这样做像
bind( year(?deathDate) - year(?birthDate) - if(month(?deathDate)<month(?birth) || (month(?deathDate)=month(?birthDate) && day(?deathDate)<day(?birthDate)),1,0) as ?age ) FILTER(?age < 110)这样的健全性检查,但这会导致更少的结果,我们不知道哪个日期是错误的