如何在SPARQL(dbpedia)中将xsd:Date转换为xsd:DateTime?

如何在SPARQL(dbpedia)中将xsd:Date转换为xsd:DateTime?,sparql,dbpedia,Sparql,Dbpedia,我想从DBpedia获取关于人的数据,包括他们的出生日期和死亡日期,但是对于日期,当我需要xsd:DateTime格式的日期时,返回的类型是xsd:Date 我们可以在查询中将结果(xsd:Date)转换为xsd:DateTime?如果是,如何进行 xsd:Date-->“1940-01-01” xsd:DateTime-->“1940-01-01T00:00:00” 我尝试了下面的查询,但它不起作用 PREFIX rdfs: <http://www.w3.org/2000/01/rd

我想从DBpedia获取关于人的数据,包括他们的出生日期和死亡日期,但是对于日期,当我需要
xsd:DateTime
格式的日期时,返回的类型是
xsd:Date

我们可以在查询中将结果(
xsd:Date
)转换为
xsd:DateTime
?如果是,如何进行

  • xsd:Date
    -->
    “1940-01-01”
  • xsd:DateTime
    -->“1940-01-01T00:00:00”
我尝试了下面的查询,但它不起作用

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 

SELECT ?person ?name ?birthDate ?deathDate
WHERE { 
    ?person rdf:type <http://dbpedia.org/ontology/Person> 
    ?person rdfs:label ?name.
    ?person dbo:birthDate ?birthDate.
    ?person dbo:deathDate ?deathDate.   
    strdt(concat(substr(?birthDate, 7, 4), '-', substr(?birthDate, 1, 2), '-', substr(?birthDate, 4, 2), 'T00:00:00'), xsd:dateTime).
    strdt(concat(substr(?deathDate, 7, 4), '-', substr(?deathDate, 1, 2), '-', substr(?deathDate, 4, 2), 'T00:00:00'), xsd:dateTime). 
    } 
前缀rdfs:
前缀rdf:
前缀dbo:
前缀xsd:
选择?人员?姓名?出生日期?死亡日期
何处{
?人员rdf:类型
?人员rdfs:标签?名称。
?个人dbo:生日?生日。
?人员dbo:死亡日期?死亡日期。
strdt(concat(substr(?birthDate,7,4),“-”,substr(?birthDate,1,2),“-”,substr(?birthDate,4,2),“T00:00:00”),xsd:dateTime)。
strdt(concat(substr(?death date,7,4),“-”,substr(?death date,1,2),“-”,substr(?death date,4,2),“T00:00:00”),xsd:dateTime)。
} 
谢谢大家!

(作为回答,因为评论的可读性不强)

正如AKSW所说,数据有点不完整(例如“1800-1-1”),如果您尝试使用
xsd:dateTime(?.birthDate)
,virtuoso会抱怨。由于一个技艺高超的怪癖,您不能使用更令人愉快的
合并(xsd:dateTime(?birthDate),?birthDate)
,它应该返回第一个非空、非错误的值

所以我们必须用正则表达式来保护自己:

if(
    regex(str(?birthDate), '\\d{4}-\\d\\d-\\d\\d'),
    xsd:dateTime(?birthDate),
    ?birthDate)
也就是说:如果
?birthDate
的字符串值的格式正确(4位-2位-2位),则强制转换,否则使用原始值

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 

SELECT ?person ?name 
    (if(regex(str(?birthDate), '\\d{4}-\\d\\d-\\d\\d'), xsd:dateTime(?birthDate), ?birthDate) as ?birthDateDT)
    (if(regex(str(?deathDate), '\\d{4}-\\d\\d-\\d\\d'), xsd:dateTime(?deathDate), ?deathDate) as ?deathDateDT)
WHERE { 
    ?person rdf:type <http://dbpedia.org/ontology/Person> .
    ?person rdfs:label ?name.
    ?person dbo:birthDate ?birthDate.
    ?person dbo:deathDate ?deathDate.   
}
前缀rdfs:
前缀rdf:
前缀dbo:
前缀xsd:
选择人员姓名
(如果(regex(str(?birthDate),'\\d{4}-\\d\\d-\\d\\d'),xsd:dateTime(?birthDate),?birthDate)作为?birthDateDT)
(如果(regex(str(?death date),'\\d{4}-\\d\\d-\\d\\d'),xsd:dateTime(?death date),?death date)作为?death datedt)
何处{
?人员rdf:类型。
?人员rdfs:标签?名称。
?个人dbo:生日?生日。
?人员dbo:死亡日期?死亡日期。
}

这不是一个有效的SPARQL查询…通过
strdt(concat(substr(?birthDate,7,4),'-',substr(?birthDate,1,2),'-',substr(?birthDate,4,2),'T00:00:00'),xsd:dateTime),您想要实现什么
?通过使用
xsd:dateTime
构造函数:
BIND(xsd:dateTime(?birthDate)as?bd)
可以从
xsd:date
转换到
xsd:dateTime
,不幸的是,DBpedia数据是垃圾,如果日期格式不符合
ỲYYY-
MM-DD`。您可以通过运行
SELECT?bd{BIND(xsd:dateTime(“2017-09-20”^^xsd:date)as?bd)}
Thank's@AKSW!你知道是否可以使用正则表达式来拒绝不正确的结果或类似的东西吗?你应该能够使用
coalesce(val1,val2,…)
来说“如果这行得通,就使用它,否则就使用它”,但virtuoso一直在抱怨(这是sparql的一个特殊实现)。您可以使用
(if(regex(str(?birthDate),'\\d{4}-\\d\\d-\\d\\d')、xsd:dateTime(?birthDate),?birthDate)作为?bddt)
来保护您自己。