我正在撰写一个公共域计算器,其代码位于:https://github.com/okfn/pdcalc/blob/master/pd/map.rdf
由于sparql 1.0遇到的问题,代码目前无法正确确定作品的公共域状态:它似乎无法对日期执行算术运算,这意味着计算器无法确定例如该作品是否在作者去世70年后出版。 不幸的是,标准python的rdf库都没有实现对sparql 1.1的支持 因此,我想知道是否有人有任何关于如何克服这个限制的建议,或者可能知道任何python库更好地支持sparql?
期待您的反馈!
答案 0 :(得分:3)
即使SPARQL 1.1默认情况下也不支持日期的算术运算。请参阅SPARQL operator mapping部分:算术运算仅在数值数据类型上定义。
可能有一些SPARQL 1.1实现为此目的提供了扩展,但我现在还没有立即意识到任何内置的内置,当然不是在Python中。
您最好的选择是与您选择的SPARQL引擎的开发人员取得联系并纠缠他们以实现此类扩展,或者当然也可以自己动手。
作为一种解决方法,大多数SPARQL引擎(甚至1.0)都支持日期比较操作,因此您可以执行排序和比较等操作,但您必须对查询结果执行一些自定义后处理。
更新我刚刚意识到我忽略了一些相当重要的事情:SPARQL 1.1当然支持year()
,month()
等函数,它们返回年份和月份组件datetime-value是一个整数,你可以想象它可以用来做日期的迂回算术。
答案 1 :(得分:1)
虽然如果实现遵循规范,您无法对SPARQL 1.0中的日期执行算术运算,您至少应该能够比较日期:
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
SELECT *
WHERE
{
# Your Triple Patterns here
FILTER( ?date > "2011-11-20T00:00:00Z"^^xsd:dateTime)
}
现在仍然没有解决你的问题,你需要采取作者的死亡日期,并添加70。您可能需要做的是在客户端代码中计算该部分并将其注入SPARQL查询中。所以这意味着你可能需要做两个查询 - 一个用于获取信息,另一个用于计算是否为公共工作。你可以在客户端代码中计算第二部分来保存额外的查询。
虽然在有一个优秀的符合SPARQL 1.1标准的python库之前,这并不理想,但这是你所坚持的。