【问题标题】:How to perform arithmetic operations in Sparql with python?如何使用 python 在 Sparql 中执行算术运算?
【发布时间】:2011-11-20 10:51:34
【问题描述】:

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

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

期待您的反馈!

【问题讨论】:

    标签: python sparql rdflib


    【解决方案1】:

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

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

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

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

    更新我刚刚意识到我忽略了一些相当重要的事情:SPARQL 1.1 当然支持year()month() 等函数,它们返回日期时间值的年份和月份组件作为一个整数,你可以想象用它来对日期做一个迂回的算术。

    【讨论】:

      【解决方案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 查询中。因此,这意味着您可能需要进行两次查询——一次获取信息,一次计算是否为公共工作。 Tbh 您可能可以仅在客户端代码中计算第二部分以保存额外的查询。

      虽然在有一个符合 SPARQL 1.1 的良好 python 库之前这并不理想,但这是您所坚持的。

      【讨论】:

      • 最好使过滤器中的文字有效xsd:dateTime 例如"2011-11-20T00:00:00Z"。注意 yyyy-mm-dd 顺序和分隔符,不是 dd/mm/yyyy;秒不是可选的。另请注意,此类按字典顺序排序的日期时间也是按时间顺序排序的。
      猜你喜欢
      • 2013-05-16
      • 2013-04-16
      • 1970-01-01
      • 2017-04-15
      • 2014-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-07
      相关资源
      最近更新 更多