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

如何使用python在Sparql中执行算术运算?,python,sparql,rdflib,Python,Sparql,Rdflib,我正在编写一个公共域计算器,其代码位于: 由于sparql 1.0遇到问题,代码当前无法正确确定作品的公共域状态:似乎无法对日期执行算术运算,这意味着计算器无法确定作品是否在作者去世70年后出版。 不幸的是,标准python的rdf库还没有实现对sparql 1.1的支持 因此,我想知道是否有人对如何克服这个限制有任何建议,或者是否知道有任何python库更好地支持sparql 期待你的回馈 虽然在SPARQL 1.0中不能对日期进行算术运算,但如果实现符合规范,则至少应该能够比较日期: PRE

我正在编写一个公共域计算器,其代码位于:

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


期待你的回馈

虽然在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)
}
前缀xsd:
挑选*
哪里
{
#你的三重模式在这里
过滤器(?日期>“2011-11-20T00:00:00Z”^^xsd:dateTime)
}
现在你的问题还没有解决,你需要把作者的死亡日期加上70。您可能需要做的是在客户端代码中计算该部分,并将其注入SPARQL查询。这意味着你可能需要做两个查询——一个是获取信息,另一个是计算是否是公共工作。Tbh您可能只需要在客户端代码中计算第二部分就可以保存额外的查询


虽然只有在有一个良好的SPARQL 1.1兼容python库之前,这才是理想的,但这正是您需要解决的问题。

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

可能有一些SPARQL 1.1实现为此提供了一个扩展,但我现在还不知道有哪些实现内置了这种功能,当然不是在Python中

您最好的选择是与您选择的SPARQL引擎的开发人员联系,并督促他们实现这样的扩展,或者当然也可以自己开发

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


更新我刚刚意识到我忽略了一件非常重要的事情:SPARQL 1.1当然支持像
year()
month()
等函数,它们将日期时间值的年和月分量作为整数返回,可以想象,您可以使用这些函数对日期进行迂回运算

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