rdflib-ocdm
rdflib-ocdm extends RDFLib with provenance tracking based on the OpenCitations Provenance Model.
Its two main classes, OCDMGraph and OCDMDataset, inherit from RDFLib's Graph and Dataset respectively. The OCDM layer adds methods for recording who changed what and when.
Calling generate_provenance() creates timestamped provenance snapshots for entities whose tracked state changed. Snapshot sequence numbers are managed through counter handler backends (in-memory, filesystem, SQLite, Redis). Unlike oc_ocdm, which targets bibliographic data specifically, rdflib-ocdm is domain-agnostic.
Installation
pip install rdflib-ocdm
Usage
Basic usage
from rdflib import Literal, URIRef
from rdflib_ocdm.counter_handler.in_memory_counter_handler import InMemoryCounterHandler
from rdflib_ocdm.ocdm_graph import OCDMGraph
counter_handler = InMemoryCounterHandler()
g = OCDMGraph(counter_handler)
resp_agent = URIRef("https://orcid.org/0000-0002-8420-0696")
primary_source = URIRef("https://api.crossref.org/")
g.add(
(
URIRef("https://example.org/resource"),
URIRef("http://purl.org/dc/terms/title"),
Literal("Example Resource"),
),
resp_agent=resp_agent,
primary_source=primary_source,
)
g.generate_provenance()
print(g.serialize(format="turtle"))
prov = g.get_provenance_graphs()
print(prov.serialize(format="nquads"))
Working with existing data
When working with pre-existing RDF data, you need to establish a baseline from which changes can be tracked. preexisting_finished() marks the current graph state as that baseline and creates an initial provenance snapshot for each entity. When you later call generate_provenance(), the system computes the delta between the baseline and the current state, recording exactly what changed, when, and by whom. Without calling preexisting_finished(), all triples are treated as newly created.
from rdflib import Literal, URIRef
from rdflib_ocdm.counter_handler.in_memory_counter_handler import InMemoryCounterHandler
from rdflib_ocdm.ocdm_graph import OCDMGraph
g = OCDMGraph(InMemoryCounterHandler())
g.parse("existing_data.ttl", format="turtle")
resp_agent = URIRef("https://orcid.org/0000-0002-8420-0696")
primary_source = URIRef("https://example.org/data-source")
g.preexisting_finished(resp_agent=resp_agent, primary_source=primary_source)
g.add(
(
URIRef("https://example.org/resource"),
URIRef("http://purl.org/dc/terms/description"),
Literal("Updated description"),
),
resp_agent=resp_agent,
primary_source=primary_source,
)
g.generate_provenance()
prov_graphs = g.get_provenance_graphs()
For working with SPARQL endpoints, Reader.import_entities_from_triplestore() imports entities from a triplestore into an OCDMGraph or OCDMDataset, while Storer.upload_all() pushes graph changes back as batched update queries.
Running tests
Prerequisites
- UV for dependency management
- Docker for running test databases (storer tests start/stop Virtuoso containers automatically via pytest fixtures)
Setup
git clone https://github.com/opencitations/rdflib-ocdm.git
cd rdflib-ocdm
uv sync --locked --all-extras --dev
Running tests
uv run pytest test/ -v
Run with coverage:
uv run coverage run
uv run coverage report
uv run coverage html
Contributing
Please see CONTRIBUTING.md for guidelines on how to contribute to this project, including commit message conventions and how to trigger different types of releases.
References
- Persiani, S., Daquino, M., Peroni, S. (2022). A Programming Interface for Creating Data According to the SPAR Ontologies and the OpenCitations Data Model. In: Groth, P., et al. The Semantic Web. ESWC 2022. Lecture Notes in Computer Science, vol 13261. Springer, Cham. https://doi.org/10.1007/978-3-031-06981-9_18
License
ISC License
Related projects
-
oc_ocdm: a Python library for creating and managing bibliographic RDF data according to the OpenCitations Data Model.
-
time-agnostic-library: a Python library for time-travel queries over RDF datasets that follow the OpenCitations provenance model.
-
heritrace: an editor for RDF data, with built-in provenance and change tracking.
Metadata
Release files for rdflib-ocdm 2.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| rdflib_ocdm-2.0.1.tar.gz | 91.3 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| rdflib_ocdm-2.0.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 120.2 kB
Release files / rdflib_ocdm-2.0.1.tar.gz
| Download URL | rdflib_ocdm-2.0.1.tar.gz |
|---|---|
| Size | 91.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d1aab74285efc245dc2dfe9b1ea95774d9017205f0368757fed30e35eac36459
|
|
BLAKE2b-256 checksum How to use checksums |
e59ef909e17e07b136eb618b40c2debbcf0177bcad705e3a5d502a4056fe53d0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / rdflib_ocdm-2.0.1-py3-none-any.whl
| Download URL | rdflib_ocdm-2.0.1-py3-none-any.whl |
|---|---|
| Size | 28.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e88d96d00d09d686c8c0b977a4b38ce8bf12fcf2d00014b4b2e21510e6fa4803
|
|
BLAKE2b-256 checksum How to use checksums |
908394991f69b814f72a07e8ba01ba9e5024de8989c59c76f701872a4412b725
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for rdflib-ocdm 2.0.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.