如何使用python在Sparql中执行算术运算?

时间:2011-11-20 10:51:35

标签: python sparql rdflib

我正在撰写一个公共域计算器,其代码位于:https://github.com/okfn/pdcalc/blob/master/pd/map.rdf

由于sparql 1.0遇到的问题,代码目前无法正确确定作品的公共域状态:它似乎无法对日期执行算术运算,这意味着计算器无法确定例如该作品是否在作者去世70年后出版。 不幸的是,标准python的rdf库都没有实现对sparql 1.1的支持 因此,我想知道是否有人有任何关于如何克服这个限制的建议,或者可能知道任何python库更好地支持sparql?

期待您的反馈!

2 个答案:

答案 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库之前,这并不理想,但这是你所坚持的。