跳转到主要内容

在rdflib中以SPARQL扩展函数实现的OWL TIME函数

项目描述

RDFlib OWL TIME函数

此Python包实现了确定RDF图中对象时间关系的函数。

本包发明了基于OWL TIME中提供的逻辑的SPARQL函数,并且与TIME的时间实体谓词命名类似,例如,函数isBefore()time:before相关联,即isBefore(a, b)将测试是否应在对象ab之间应用time:before

这些函数作为RDFlib的SPARQL实现中的函数提供,可以通过IRI调用,例如isBefore(a, b)调用为tfun:isBefore(?a, ?b)。所有函数均作为问题提出,“是否在之前”,并返回RDF字面量truefalse

此存储库还包含此包实现的函数的正式声明,作为SKOS词汇表。请参阅下面的词汇表部分。

安装

正常Python包安装,例如从PyPI:pip install timefuncs

此包的唯一非标准依赖项是RDFlib

使用

这些函数在RDFlib Python的文件timefuncts/funcs.py中实现,并导入到timefuncs/__init__.py中,并在RDFlib中注册为SPARQL扩展函数及其IRI。

这意味着它们可以像这样使用(完整工作脚本)

from rdflib import Graph
from timefuncs import TFUN


data = """
    PREFIX : <http://example.com/>
    PREFIX time: <http://www.w3.org/2006/time#>    
    
    :a01 a time:TemporalEntity .    
    :b01 a time:TemporalEntity .
    :c01 a time:TemporalEntity .
    :d01 a time:TemporalEntity .
    
    :a01 time:before :c01 .

    :b01 time:after :c01 .
    """

g = Graph().parse(data=data)

q = """
    PREFIX tfun: <https://w3id.org/timefuncs/>

    SELECT *
    WHERE {
        ?x a time:TemporalEntity .
        ?y a time:TemporalEntity .
        
        FILTER tfun:isBefore(?x, ?y)
    }
    """
for r in g.query(q):
    print(f"{r['x']} is before {r['y']}")

上面的脚本输出

http://example.com/a01 is before http://example.com/b01
http://example.com/a01 is before http://example.com/c01
http://example.com/b01 is before http://example.com/c01

上述脚本是在一个已将时间函数注册到其rdflib副本(可能通过运行pip install timefuncs)的环境中运行的,因此不需要导入rdfib和time函数命名空间之外的内容(例如from timefuncs import TFUN)。看起来命名空间没有被使用,但实际上它是内部使用的!无需在SPARQL查询中重新声明tfun:PREFIX...

这里使用的时间函数tfun:isBefore被用作过滤器函数,当第一个给定对象(此处为?x)在第二个给定对象(?y)之前时返回true

此示例使用了一个相当开放式的图模式匹配(`?x ?p ?y`)。

与推理/推断一起工作

这些函数不假设数据上已经执行了任何推理,并且可以正确解释`time:before` / `time:after`和类似的逆关系、传递关系(属性链)等。但是有限制:你将始终能够发明这些函数无法正确处理的高度复杂的关系,即`time:TemporalEntity`实例之间的关系。

要处理高度复杂的数据,请在运行这些函数之前首先使用OWL TIME的公理对数据进行推理。为此,你需要一个可以计算OWL "RL"推断的工具,例如rdflib的OWL-RL。许多三元组存储库内置了OWL-RL推理能力或作为附加组件。

函数

该包中的函数实现为带有命名空间https://w3id.org/timefuncs/的SPARQL扩展函数,例如isBefore()的完整IRI为https://w3id.org/timefuncs/isBefore

Python实现与SPARQL函数同名,但采用snake_case而不是camelCase,例如SPARQL的isBefore()在Python中实现为is_before()

已实现的函数及其对应的TIME关系

SPARQL 参数 TIME谓词 注意
tfun:contains(a, b) time:Interval
time:Interval
time:intervalContains
time:intervalDuring
相当于tfun:isContainedBy(b, a)
tfun:finishes(a, b) time:Interval
time:Interval
time:intervalFinishes
time:intervalFinishedBy
time:disjoint
相当于tfun:isFinishedBy(b, a)
tfun:hasDuring(a, b) time:Interval
time:Interval
alias for contains(a, b)
tfun:hasInside(a, b) time:Interval
time:Instant
time:inside
time:before
time:after
相当于tfun:isInside(b, a)
tfun:isAfter(a, b) time:TemporalEntity
time:TemporalEntity
time:after
time:before
相当于tfun:isBefore(b, a)
tfun:isBefore(a, b) time:TemporalEntity
time:TemporalEntity
time:before
time:after
相当于tfun:isAfter(b, a)
tfun:isContainedBy(a, b) time:Interval
time:Interval
time:intervalDuring
time:intervalContains
相当于tfun:contains(b, a)
tfun:isDuring(a, b) time:Interval
time:Interval
alias for isContainedBy(a, b)
tfun:isFinishedBy(a, b) time:Interval
time:Interval
time:intervalFinishedBy
time:intervalFinishes
time:disjoint
相当于tfun:finishes(b, a)
tfun:isInside(a, b) time:Instant
time:Interval
time:inside
time:after
time:before
相当于tfun:hasInside(b, a)
tfun:isStartedBy(a, b) time:Interval
time:Interval
time:isStartedBy
time:starts
tfun:starts(b, a)
tfun:starts(a, b) time:Interval
time:Interval
time:starts
time:isStartedBy
tfun:isStartedBy(b, a)

这些函数尚未实现

SPARQL 注意
tfun:hasBeginning(a, b)
tfun:hasEnd(a, b)
tfun:isFinishedBy(a, b)
tfun:isBeginningOf(a, b)
tfun:isDisjoint(a, b)
tfun:isEndOf(a, b)
tfun:isEquals(a, b)
tfun:isIn(a, b)
tfun:isMetBy(a, b)
tfun:isNotDisjoint(a, b)
tfun:isOverlappedBy(a, b)
tfun:isStartedBy(a, b)
tfun:meets(a, b)
tfun:overlaps(a, b)

非TIME函数

以下所提出的函数受 OWL TIME 启发,但与其谓词或类没有直接关系

SPARQL 注意
tfun:hasTemporalRelation(a, b) 返回 ab 之间的时态关系
可能需要运行其他 isDisjoint(a, b) 函数的序列来确定
tfun:toUNIXTime(a) 返回一个表示 xsdatetimexsdatetimeStamp 的 UNIX 时间
可能扩展到其他 TRS 输入
tfun:toXSDDateTimeStamp(a) 返回一个 UNIX 时间的 XSD xsdatetimeStamp(UTC)表示
可能扩展到其他 TRS 输入

实现逻辑

已实现的函数测试了在给定数据中找到时态关系为真的所有可能方式。例如,如果 isBefore(a, b) 返回 true,则

  • time:before 谓词在 ab 之间给出,或者任何对象链 a ... n ... b
  • time:after 谓词在 ba 之间给出,或者任何对象链 b ... n ... a
  • 任何 time:beforetime:after 链接的链 ab,所有都指向正确的方向
  • 声明 a 的结束在 b 之前或 b 的开始
    • 即对于 <a> time:hasEnd <a_end> .<b> time:hasBeginning <b_beginning> .,如果 <a_end> time:before <b_beginning>,则 isBefore(a, b)true
  • 声明 b 的开始在 a 之后或 a 的结束
  • 可以根据它们的瞬时时间或开始和结束时间计算 ab 之前
    • 即对于 <a> time:inXSDDateTimeStamp <a_xsd> .<b> time:inXSDDateTimeStamp <b_xsd> .<a> time:hasEnd/time:inXSDDateTimeStamp <a_xsd> .<b> time:hasEnd/time:inXSDDateTimeStamp <b_xsd> .,如果 <a_xsd> <b_xsd>,则 isBefore(a, b)true

词汇表

已实现和待实现的时态函数列在 SKOS 词汇表中,其源文件位于此存储库中的 voc/ 文件夹内。该词汇表以 RDF(turtle)和 HTML(Markdown)格式从这些源文件在线呈现,可通过命名空间 IRI 访问

每个函数的 IRI 解析为其词汇表中的概念条目,例如,https://w3id.org/timefuncs/isContainedBy --> https://github.com/RDFLib/timefuncs/blob/master/voc/timefuncs.md#is-contained-by.

(Markdown 是使用 pyLODE 从 RDF 自动生成的)

测试

所有测试都在 tests/ 中,并使用 pytest 实现。

每个函数都有自己的测试,例如,为 isBefore() 的测试是 tests/test_is_before.py,以及一个用于对所有测试运行 OWL TIME 的 测试套件 的测试文件:tests/test_test_suite.py

贡献

通过 GitHub,问题 & Pull Requests

许可

此代码根据 LICENSE 使用 BSD 3 条款许可证,与 rdflib 使用相同的许可证。

引用

@software{https://github.com/rdflib/timefuncs,
  author = {{Nicholas J. Car}},
  title = {RDFlib OWL TIME Functions},
  version = {0.0.2},
  date = {2021},
  url = {https://github.com/rdflib/timefuncs}
}

联系

创建者 & 维护者
Nicholas J. Car
数据系统架构师
SURROUND Australia Pty Ltd
nicholas.car@surroundaustrlaia.com

兼职高级讲师
工程学院 & 计算机科学学院
澳大利亚国立大学
nicholas.car@anu.edu.au

https://orcid.org/0000-0002-8742-7730

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪一个,请了解更多关于安装包的信息。

源代码分发

timefuncs-0.1.4.tar.gz (13.6 kB 查看哈希值)

上传时间 源代码

构建分发

timefuncs-0.1.4-py3-none-any.whl (10.2 kB 查看哈希值)

上传时间 Python 3

支持者

AWSAWS云计算和安全赞助商DatadogDatadog监控FastlyFastlyCDNGoogleGoogle下载分析MicrosoftMicrosoftPSF赞助商PingdomPingdom监控SentrySentry错误日志StatusPageStatusPage状态页面