Skip to content
Back to top
View this page

# Work with PROV-O (RDF)

PROV-O support needs the optional `rdflib` dependency:

    python -m pip install "prov[rdf]"

The serialization format is selected with `format="rdf"`. A second, RDF-specific keyword, `rdf_format`, chooses the concrete RDF syntax (`"trig"` by default) — do not confuse the two.

## Serialize to a file

    import prov.model as pm

    document = pm.ProvDocument()
    document.set_default_namespace("http://example.org/")
    e = document.entity("e1")
    a = document.activity("a1")
    document.wasGeneratedBy(e, a)

    document.serialize("document.trig", format="rdf")  # rdf_format="trig" is the default

## Choose a different RDF syntax

`rdf_format` accepts anything `rdflib` can serialize to, e.g. `"turtle"`, `"xml"` (RDF/XML), `"nt"`, `"nquads"`:

    turtle_str = document.serialize(format="rdf", rdf_format="turtle")
    print(turtle_str)

Important

Only quad-based syntaxes (`"trig"` — the default — and `"nquads"`) preserve bundles as separate named graphs. Triple-based syntaxes such as `"turtle"` or `"xml"` flatten every bundle’s statements into a single graph, discarding which bundle each statement came from. Stick with the default TriG if your document has bundles.

## Serialize to a string

    trig_str = document.serialize(format="rdf")

## Deserialize from a file or stream

    loaded = pm.ProvDocument.deserialize("document.trig", format="rdf")
    assert loaded == document

Pass the matching `rdf_format` if the input is not TriG:

    loaded = pm.ProvDocument.deserialize(content=turtle_str, format="rdf", rdf_format="turtle")

## Deserialize from a string

    loaded = pm.ProvDocument.deserialize(content=trig_str, format="rdf")

## Auto-detect the format with `prov.read()`

PROV-O/RDF is the second format `prov.read()` tries (after PROV-JSON), so genuine RDF content auto-detects reliably:

    import prov

    loaded = prov.read("document.trig")
    assert loaded == document

## Common errors

Malformed RDF raises `rdflib`’s own parser error:

    try:
        pm.ProvDocument.deserialize(content="not rdf", format="rdf")
    except Exception as e:
        print(f"{type(e).__name__}")

    BadSyntax