计算两个SPARQL xsd:dateTime?
之间差异的函数是什么?我找到了对datediff的引用,但这不起作用。 SPARQL中是否存在这样的内置函数,就像大多数其他查询语言一样?
答案 0 :(得分:9)
某些SPARQL引擎可能直接支持日期算法。例如,如this answers.semanticweb.com question and answer中所述,Jena支持日期算术,您可以从另一个日期中减去一个日期并获得xsd:Duration。其他实现可以支持日期功能。例如,this Virtuoso example包括使用bif:datediff。但是,这些是扩展,并不保证在任何特定的SPARQL实现中都存在。
对于更便携,但效率更低的解决方案,您可以使用year从日期时间中提取年份部分。例如,这可以让你做到
select ?age where {
bind( "1799-12-14"^^<http://www.w3.org/2001/XMLSchema#date> as ?death )
bind( "1732-02-22"^^<http://www.w3.org/2001/XMLSchema#date> as ?birth )
bind( year(?death)-year(?birth) as ?age )
}
并获得结果
-------
| age |
=======
| 67 |
-------
根据两个日期的月份和日期,这可能会被一个人关闭,但您可以使用month和day函数同样解决此问题。 This thread描述了一些此类实现。
答案 1 :(得分:9)
当我在搜索如何计算SPARQL中的年龄时,我发现了这篇文章。感谢Joshua Taylor提供了正确的提示。然而,我通过添加调整来改进代码段,因此如果该人在他们去世的那一年没有过生日,那么它不会被禁用一年。我认为对于那些在搜索主题时找到这篇文章的人可能会有所帮助,就像我做的那样。:
select ?age where {
bind( "1799-12-14"^^<http://www.w3.org/2001/XMLSchema#date> as ?death )
bind( "1732-02-22"^^<http://www.w3.org/2001/XMLSchema#date> as ?birth )
bind( year(?death) - year(?birth) - if(month(?death)<month(?birth) || (month(?death)=month(?birth) && day(?death)<day(?birth)),1,0) as ?age )
}