2011-11-20 45 views
4

我书面方式一个公共领域的计算器,它的代码,请访问:https://github.com/okfn/pdcalc/blob/master/pd/map.rdf如何用python在Sparql中执行算术运算?

的代码是目前无法正确确定,因为已经遇到SPARQL 1.0问题的工作的公共领域的地位:它似乎没有可能对日期进行算术运算,这意味着计算器无法确定例如无论作品是否在作者去世70年后发表。 不幸的是,没有一个标准的python rdf库尚未实现对sparql 1.1的支持。因此,我想知道是否有人对如何克服这个限制有任何建议,或者知道有更好的sparql支持的任何python库?

期待您的反馈!

回答

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查询中。所以这意味着你可能需要做两个查询 - 一个是获取信息,另一个是计算它是否是公共工作。 Tbh你可以计算第二部分只是在客户端代码中保存额外的查询。

虽然这是不理想的,直到有一个良好的符合SPARQL 1.1的python库,它就是你所坚持的。

+0

更好地使过滤器中的文字有效的'xsd:dateTime'例如' “2011-11-20T00:00:00Z”'。请注意yyyy-mm-dd命令和分隔符,而不是dd/mm/yyyy;秒不是可选的。还要注意按字母顺序排序的这种日期时间也按时间顺序排序。 – laalto

+0

@laalto现在纠正 – RobV

3

即使默认情况下,SPARQL 1.1也不支持日期的算术运算。请参阅SPARQL operator mapping上的章节:算术运算仅在数字数据类型上定义。

可能有一些SPARQL 1.1实现为此目的提供了一个扩展,但我没有立即意识到现在有任何内置的,当然不是Python。

最好的办法是与您选择的SPARQL引擎的开发人员取得联系,并纠缠他们来实现这样的扩展,或者当然也可以推出自己的扩展。

作为一种解决方法,大多数SPARQL引擎(甚至1.0)都支持日期比较操作,因此您可以执行排序和比较等操作,但是您必须对查询结果执行一些自定义后处理。

更新我才意识到我忽略了,而重要的事情:当然SPARQL 1.1不支持的功能,如year()month()等,它会返回一个日期时间值作为一个整数的年份和月份,组件,以及你可以可以用来做日期的迂回算法。