【问题标题】:SPARQL query all persons who lived through the 20th century in DBPediaSPARQL 在 DBPedia 中查询所有活过 20 世纪的人
【发布时间】: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:birthDatedbo:deathDate
  • 是的,一旦你这样做了,你会发现许多条目的 Wikipedia/DBpedia 的数据质量很差......所以很多时候出生日期或死亡日期都是错误的 - 你可以这样做像bind( year(?deathDate) - year(?birthDate) - if(month(?deathDate)&lt;month(?birth) || (month(?deathDate)=month(?birthDate) &amp;&amp; day(?deathDate)&lt;day(?birthDate)),1,0) as ?age ) FILTER(?age &lt; 110) 这样的健全性检查,但这会导致更少的结果,我们不知道哪个日期是错误的

标签: sparql dbpedia


【解决方案1】:

这个问题是由于查询结果中包含整数值,可以使用相同或新的 FILTER() 部分中的 DATATYPE() 函数解决。

例如:

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 
    {
        ?person rdf:type dbo:Person;
        dbp:name ?personName;
        dbp:birthDate ?birthDate;
        dbp:deathDate ?deathDate.
    
        #This FILTER ensures that only xsd:date values are returned
        FILTER(DATATYPE(?birthDate) = xsd:date && DATATYPE(?deathDate) = xsd:date).
    
        FILTER (?birthDate < "1900-01-01"^^xsd:date && ?deathDate > "1999-12-31"^^xsd:date).
    
    }
LIMIT 20

Live Query Definition

Live Query Result

DATATYPE() Documentation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 2012-01-09
    • 2023-03-17
    相关资源
    最近更新 更多