在rdflib中以SPARQL扩展函数实现的OWL TIME函数
项目描述
RDFlib OWL TIME函数
此Python包实现了确定RDF图中对象时间关系的函数。
本包发明了基于OWL TIME中提供的逻辑的SPARQL函数,并且与TIME的时间实体谓词命名类似,例如,函数isBefore()
与time:before
相关联,即isBefore(a, b)
将测试是否应在对象a
和b
之间应用time:before
。
这些函数作为RDFlib的SPARQL实现中的函数提供,可以通过IRI调用,例如isBefore(a, b)
调用为tfun:isBefore(?a, ?b)
。所有函数均作为问题提出,“是否在之前”,并返回RDF字面量true
或false
。
此存储库还包含此包实现的函数的正式声明,作为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) |
返回 a 和 b 之间的时态关系可能需要运行其他 isDisjoint(a, b) 函数的序列来确定 |
tfun:toUNIXTime(a) |
返回一个表示 xsdatetime 或 xsdatetimeStamp 的 UNIX 时间可能扩展到其他 TRS 输入 |
tfun:toXSDDateTimeStamp(a) |
返回一个 UNIX 时间的 XSD xsdatetimeStamp (UTC)表示可能扩展到其他 TRS 输入 |
实现逻辑
已实现的函数测试了在给定数据中找到时态关系为真的所有可能方式。例如,如果 isBefore(a, b)
返回 true,则
time:before
谓词在a
和b
之间给出,或者任何对象链a
...n
...b
time:after
谓词在b
和a
之间给出,或者任何对象链b
...n
...a
- 任何
time:before
和time:after
链接的链a
和b
,所有都指向正确的方向 - 声明
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
的结束 - 可以根据它们的瞬时时间或开始和结束时间计算
a
在b
之前- 即对于
<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
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪一个,请了解更多关于安装包的信息。
源代码分发
构建分发
timefuncs-0.1.4.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 37ac9f569f157e27de09b3bebba98e3945f08e367621b4c7cdb04c3a65b0d2d1 |
|
MD5 | 6be43656f5ccaf14d7e024f06172e72f |
|
BLAKE2b-256 | 323ba0e60eb1ac7cf174b532baf22eb8e388d4f53665e5aeba48e611a3f9150f |
timefuncs-0.1.4-py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 2184a43efec45f6e475d490843141be9ab96874f49fe76125f072906b6888c30 |
|
MD5 | ed5b5da53451d270f35653d28cffe2be |
|
BLAKE2b-256 | 3aa024a9dbc9268a27bac681921cf013ad5286087a177daf5a521ebef635d177 |