在 SPARQL 中将 xsd:date 转换为 xsd:gYear

Convert xsd:date to xsd:gYear in SPARQL

你好,我正在尝试从 DBpedia 中检索 1900 年后出生在里昂的人 ("1900"^^xsd:gYear) 这是我的一段代码:

prefix dbo: <http://dbpedia.org/ontology/>
prefix foaf: <http://xmlns.com/foaf/0.1/>
prefix dbr: <http://dbpedia.org/resource/>
prefix xsd: <http://www.w3.org/2001/XMLSchema#>
select $n $birthDate
{
  $p a dbo:Person.
  $p dbo:birthPlace dbr:Lyon.
  $p foaf:name $n.
  $p dbo:birthDate $birthDate.
  filter($birthDate > "1980"^^xsd:gYear).
}

我得到以下结果: query results

据我了解,问题出在数据中:许多日期没有有效的 xsd:date 文字,因此比较失败。 filter($birthDate > "1980-01-01"^^xsd:date) 也失败了。根据 XML Schema,xsd:date 必须以 "YYYY-MM-DD" 的形式提供文字。不幸的是,DBpedia 中的许多日期并非如此。对于有效日期,比较非常有效。

解决方法:

prefix dbo: <http://dbpedia.org/ontology/>
prefix foaf: <http://xmlns.com/foaf/0.1/>
prefix dbr: <http://dbpedia.org/resource/>
prefix xsd: <http://www.w3.org/2001/XMLSchema#>
select $n $birthDate ?year
{
  $p a dbo:Person.
  $p dbo:birthPlace dbr:Lyon.
  $p foaf:name $n.
  $p dbo:birthDate $birthDate.
  filter($birthDate > "1980-01-01"^^xsd:date).
  bind(replace(str($birthDate),"(\d+)-\d*-\d*", "") as ?year)
  filter(xsd:integer(?year) > 1980)
}

请注意,对于其他类型的格式错误的日期,它可能会失败。我没有检查所有极端情况。

有人应该将此报告给 DBpedia 社区。应该修复了。