在 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 社区。应该修复了。
你好,我正在尝试从 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 社区。应该修复了。