SPARQL如何从xsd:date以整数形式获取年份

SPARQL如何从xsd:date以整数形式获取年份,sparql,rdf,Sparql,Rdf,我有一个SPARQL查询,它选择出生于1990年的人。如何从xsd:date格式中仅获取年份?我可以看到如何使用year()从xsd:dateTime获取年份,但它在xsd:date上不起作用 PREFIX dbr: <http://dbpedia.org/resource/> PREFIX dbo: <http://dbpedia.org/ontology/> SELECT ?birthYear WHERE {dbr:Ilse_DeLange dbo:birthDate

我有一个SPARQL查询,它选择出生于1990年的人。如何从xsd:date格式中仅获取年份?我可以看到如何使用year()从xsd:dateTime获取年份,但它在xsd:date上不起作用

PREFIX dbr: <http://dbpedia.org/resource/>
PREFIX dbo: <http://dbpedia.org/ontology/>
SELECT ?birthYear
WHERE
{dbr:Ilse_DeLange dbo:birthDate ?birth
 #how to get year only as a integer?}
前缀dbr:
前缀dbo:
选择?生日
哪里
{dbr:Ilse_DeLange dbo:出生日期?出生
#如何仅以整数形式获取年份?}

根据规范,
year()
仅适用于
xsd:dateTime
文本

根据triple store的不同,您可以先尝试转换为
xsd:dateTime

前缀dbr:
前缀dbo:
选择不同的(年份(xsd:dateTime(?birthDate))作为?生日),其中{
dbr:Ilse_DeLange dbo:生日?生日
}

要做到这一点,而不对xsd:date的扩展进行任何假设,需要对字符串进行一点抨击

您可以在?birthDate的词法形式上使用REPLACE以字符串形式获取年份,然后将其转换为xsd:integer


REPLACE(str(?birthDate)、“(\\d*)-*”、“$1”)

一个常见问题是数据的日期杂乱无章(即不正确),例如数据类型不是xsd:date或词法形式不正确。两者都会导致YEAR()失败,即使支持将其作为扩展。