How to Implement W3C PROV‑O Provenance Tracking in Semantica
Use ProvenanceManager from semantica.provenance to create tamper‑evident, W3C PROV‑O compliant provenance records that export as RDF triples.
Semantica provides a lightweight, standards‑first provenance layer for W3C PROV‑O provenance tracking without external dependencies. The implementation centers on three core components in semantica/provenance/: a normalized ProvenanceEntry dataclass, a high‑level ProvenanceManager API, and pluggable storage backends that preserve cryptographic chain integrity.
Core Components for PROV‑O Compliance
ProvenanceEntry: The Normalized Record
The ProvenanceEntry dataclass in semantica/provenance/schemas.py maps directly to W3C PROV‑O concepts:
| Attribute | PROV‑O Mapping |
|---|---|
entity_id |
prov:Entity |
activity_id |
prov:Activity |
agent_id / agent_type |
prov:Agent |
parent_entity_id, derived_from_id, used_entities |
prov:wasDerivedFrom, prov:used |
| Timestamps | prov:generatedAtTime |
This schema‑first design ensures exported RDF requires no transformation to be consumed by PROV‑O‑aware triple stores.
ProvenanceManager: Central API
ProvenanceManager in semantica/provenance/manager.py orchestrates the entire provenance lifecycle:
- Creation: Builds
ProvenanceEntryinstances from component calls - Integrity: Computes SHA‑256 chain checksums via
_save_entry() - Storage: Persists through the
ProvenanceStorageinterface - Lineage: Reconstructs ancestry graphs with
get_lineage() - Export: Feeds RDF generators in
semantica/export/rdf_exporter.py
Storage Backends: InMemoryStorage and SQLiteStorage
Both backends in semantica/provenance/storage.py implement the abstract ProvenanceStorage interface. SQLiteStorage creates the PROV‑O schema in SQLite tables, enabling audit‑grade durability without sacrificing API consistency.
Step‑by‑Step Implementation
1. Initialize a ProvenanceManager
Choose between in‑memory (fast, ephemeral) or SQLite (persistent, auditable) storage:
from semantica.provenance import ProvenanceManager
# In-memory for testing or high-throughput pipelines
prov_mgr = ProvenanceManager()
# SQLite for durable, tamper-evident tracking
prov_mgr = ProvenanceManager(storage_path="provenance.db")
2. Track Entities and Relationships
Use track_entity() for named‑entity extractions or track_relationship() for relationship assertions:
# Track a knowledge graph entity extraction
prov_mgr.track_entity(
entity_id="entity_123",
source="DOI:10.1371/journal.pone.0023601",
source_location="Figure 2",
source_quote="Total fish biomass increased by 463 %",
confidence=0.92
)
# Track a relationship assertion
prov_mgr.track_relationship(
relationship_id="rel_45",
source="https://github.com/example/repo/blob/main/data.json",
confidence=0.85
)
Each call triggers _save_entry() in manager.py, which:
- Calculates a SHA‑256 checksum of the entry
- Links to the previous entry via
sequence_idandprevious_checksum - Persists through the selected storage backend
3. Reconstruct Lineage
Retrieve complete ancestry graphs using breadth‑first search:
lineage = prov_mgr.get_lineage("entity_123")
print(lineage) # Full provenance chain for the entity
4. Export PROV‑O RDF
Generate standards‑compliant RDF for downstream interoperability:
from semantica.provenance import ProvenanceManager
from semantica.export.rdf_exporter import RDFExporter
prov_mgr = ProvenanceManager(storage_path="provenance.db")
exporter = RDFExporter(base_uri="https://semantica.dev/ns#")
# Export all entries as PROV-O triples
rdf_graph = exporter.export_prov(prov_mgr.storage.retrieve_all())
rdf_graph.serialize(destination="provenance.ttl", format="turtle")
The RDFExporter in semantica/export/rdf_exporter.py binds the PROV namespace (http://www.w3.org/ns/prov#) and emits triples that validate against the PROV‑O ontology.
5. Verify Chain Integrity
Detect tampering by verifying the cryptographic chain:
is_valid = prov_mgr.verify_chain()
# Returns False if any entry was modified or deleted post-hoc
Using the CLI for Provenance Operations
Semantica exposes provenance commands through its CLI in semantica/cli.py:
# View all provenance subcommands
semantica provenance --help
# Dry-run an entity tracking operation
semantica provenance track-entity entity_99 --source DOI:10.1000/xyz --dry-run
Key Design Decisions
- Zero external dependencies: Uses only Python standard library (
dataclasses,sqlite3,json) - Hash‑chain integrity: Each entry incorporates the previous checksum, making deletion or modification cryptographically detectable
- Pluggable storage: The
ProvenanceStorageinterface enables future backends (PostgreSQL, cloud storage) without manager changes - Backward compatibility: Legacy
kg.ProvenanceTrackercode continues working; opt into the new API viaprovenance=Trueon extractors
Source Code Reference
| File | Purpose |
|---|---|
semantica/provenance/schemas.py |
ProvenanceEntry dataclass with PROV‑O mapping |
semantica/provenance/manager.py |
ProvenanceManager API and integrity logic |
semantica/provenance/storage.py |
ProvenanceStorage interface, InMemoryStorage, SQLiteStorage |
semantica/export/rdf_exporter.py |
RDF export with PROV namespace binding |
semantica/cli.py |
CLI integration for provenance commands |
semantica/provenance/provenance_usage.md |
Extended documentation and quick‑start guide |
Summary
- W3C PROV‑O provenance tracking in Semantica requires only the standard library—no external packages
ProvenanceManagerprovides the primary API for creating, storing, and querying provenance records- SHA‑256 chain checksums in
_save_entry()ensure tamper‑evident audit trails ProvenanceEntrymaps directly to PROV‑O concepts for immediate RDF interoperability- Storage backends are interchangeable via the
ProvenanceStorageabstract interface - RDF export through
RDFExporterproduces valid PROV‑O triples for triple store ingestion
Frequently Asked Questions
What is W3C PROV‑O and why does Semantica use it?
W3C PROV‑O is the OWL2 ontology for provenance information recommended by the World Wide Web Consortium. Semantica uses it because it provides a standardized, machine‑readable vocabulary for describing the origins of data—enabling interoperability with tools like ProvToolbox, Taverna, and generic RDF triple stores without custom mapping.
How does Semantica prevent tampering with provenance records?
Each ProvenanceEntry includes a SHA‑256 checksum computed over the entry content plus the previous entry's checksum. This creates a cryptographic chain where any modification or deletion breaks the sequence. Call ProvenanceManager.verify_chain() to detect such tampering.
Can I use PostgreSQL or another database instead of SQLite?
Yes. The ProvenanceStorage abstract interface in semantica/provenance/storage.py allows custom backends. Implement the interface methods (save, retrieve, retrieve_all, etc.) and pass your class to ProvenanceManager—no changes to manager logic are required.
Is the provenance system backward compatible with older Semantica code?
Yes. Code using the legacy kg.ProvenanceTracker continues to operate unchanged. The new PROV‑O system is opt‑in via the provenance=True flag on extractors and builders, allowing gradual migration without breaking existing pipelines.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →