如何在Python中使用Sparql执行算术运算?
我正在写一个公共领域的计算器,代码可以在这里找到: https://github.com/okfn/pdcalc/blob/master/pd/map.rdf
目前,这段代码无法正确判断一个作品是否属于公共领域,因为在使用sparql 1.0时遇到了问题:它似乎无法对日期进行数学运算,这就导致计算器无法判断,比如说一个作品是否在作者去世70年后出版。很遗憾,标准的python rdf库还没有实现对sparql 1.1的支持。因此,我想知道有没有人能给出一些建议,帮助我解决这个限制,或者知道有没有更好支持sparql的python库?
期待你的反馈!
2 个回答
在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库之前,你只能这样做。
即使是SPARQL 1.1版本,默认情况下也不支持对日期进行算术运算。你可以查看SPARQL操作符映射的相关内容:算术运算只适用于数字类型。
可能有一些SPARQL 1.1的实现提供了扩展来支持这个功能,但我现在并不知道有哪个是内置的,尤其是在Python中。
你最好的办法是联系你选择的SPARQL引擎的开发者,催促他们实现这样的扩展,当然你也可以自己动手做一个。
作为一种变通方法,大多数SPARQL引擎(甚至是1.0版本)支持对日期进行比较操作,所以你可以进行排序和比较,但你需要对查询结果进行一些自定义的后处理。
更新 我刚意识到我忽略了一些重要的事情:SPARQL 1.1当然支持像year()
、month()
这样的函数,它们可以返回日期时间值的年份和月份,作为整数,你可以用这些函数间接地对日期进行一些算术运算。