OWL TIME functions implemented as SPARQL extension functions in rdflib
Project description
RDFlib OWL TIME Functions
This Python package implements functions to ascertain the temporal relations of objects in RDF graphs.
This package invents SPARQL functions that are based on logic provided in OWL TIME and are named similarly to TIME's Temporal Entity's predicates, for example, the function isBefore()
correlates to time:before
, i.e. isBefore(a, b)
will test to see if time:before
should be applied between object a
& b
.
The functions are made available as functions in RDFlib's SPARQL implementation where they can be called by IRI, e.g. isBefore(a, b)
is called tfun:isBefore(?a, ?b)
. All functions are posed as questions, "is before", and return an RDF literal true
or false
.
Installation
Normal installation e.g. from PyPI: pip install timefuncs
.
This package's only dependency is RDFlib.
Use
These functions are implemented in RDFlib Python in the file timefuncts/funcs.py
and are imported into timefuncs/__init__.py
and registered there in RDFlib as SPARQL extension functions with their IRIs.
This means they can be used like this (full working script):
from rdflib import Graph
from timefuncs import TFUN
data = """
PREFIX : <http://example.com/>
PREFIX time: <http://www.w3.org/2006/time#>
:a01 time:before :b01 .
:a02 time:after :b02 .
"""
g = Graph().parse(data=data)
q = """
SELECT *
WHERE {
?x ?p ?y .
FILTER tfun:isBefore(?x, ?y)
}
"""
for r in g.query(q, initNs={"tfun": TFUN}):
print(f"{r['x']} is before {r['y']}")
# prints: http://example.com/a01 is before http://example.com/b0
Functions
These functions are implemented as SPARQL extension functions with the namespace https://w3id.org/timefuncs/
, e.g. isBefore()
's full IRI is https://w3id.org/timefuncs/isBefore
.
Functions implemented so far, and their corresponding TIME relations:
tfun:contains()
time:intervalBefore
tfun:hasDuring()
- alias for
contains()
- alias for
tfun:hasInside()
time:intervalBefore
tfun:isAfter()
time:after
tfun:isBefore()
time:before
tfun:isContainedBy()
time:intervalBefore
tfun:isDuring()
- alias for
isContainedBy()
- alias for
tfun:isInside()
time:inside
These functions are yet to be implemented:
tfun:isDisjoint()
time:intervalDisjoint
tfun:isIn()
time:intervalIn
Implementation logic
Functions are implemented to test for every conceivable way that they may be found to be true in data. For example, isBefore(a, b)
will return true if:
- the predicate
time:before
is given betweena
&b
, or any chain of objectsa
...n
...b
- the predicate
time:after
is given betweenb
&a
, or any chain of objectsb
...n
...a
- any chain of
time:before
&time:after
linksa
&b
, all pointing in the right directions - the end of
a
is declared as being beforeb
or the start ofb
- i.e. for
<a> time:hasEnd <a_end> .
and<b> time:hasBeginning <b_beginning> .
,isBefore(a, b)
istrue
if<a_end> time:before <b_beginning>
- i.e. for
- the start of
b
is declared as being aftera
or the end ofa
a
can be calculated as being beforeb
, based on their instantaneous times or start and end times- i.e. for
<a> time:inXSDDateTimeStamp <a_xsd> .
and<b> time:inXSDDateTimeStamp <b_xsd> .
or<a> time:hasEnd/time:inXSDDateTimeStamp <a_xsd> .
and<b> time:hasEnd/time:inXSDDateTimeStamp <b_xsd> .
,isBefore(a, b)
istrue
if<a_xsd> <b_xsd>
- i.e. for
Testing
All tests are in tests/
and implemented using pytest.
There are individual tests for each function, e.g. tests/test_is_before.py
for isBefore()
as well as a test file to rn all tests againts OWL TIME's test suite): tests/test_test_suite.py
.
Contributing
Via GitHub, Issues & Pull Requests:
License
This code is licensed with the BSD 3-clause license as per LICENSE which is the same license as used for rdflib.
Citation
@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}
}
Contact
Creator & maintainer:
Nicholas J. Car
Data System Architect
SURROUND Australia Pty Ltd
nicholas.car@surroundaustrlaia.com
and
Adjunct Senior Lecturer
College of Engineering & Computer Science
Australian National University
nicholas.car@anu.edu.au
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for timefuncs-0.0.3-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7c84027db9c43109cbff37567b083bea339b4a8ac603f095c2bc084ffa4ea85c |
|
MD5 | 348ca4d2c21b8bccb1cb9e69c10afcf2 |
|
BLAKE2b-256 | 754ebfe54f4dc08b30e85792e3124bb6f9cfbc02d908a58a03ce12daffa981dc |