4

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

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

期待您的反馈!

4

2 回答 2

3

默认情况下,即使 SPARQL 1.1 也不支持日期上的算术运算。请参阅SPARQL 运算符映射部分:算术运算仅在数字数据类型上定义。

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

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

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

更新我刚刚意识到我忽略了一些相当重要的事情:SPARQL 1.1 当然确实支持诸如 之类的函数year()month()它们将日期时间值的年份和月份分量作为整数返回,并且您可以想象使用它来做一个迂回的算术日期。

于 2011-11-20T20:35:29.747 回答
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 库之前这并不理想,但这是您所坚持的。

于 2011-11-20T20:34:21.343 回答