# Introduction

This document gives a draft (detailed) translation from (some of) PROV-DM to PROV-O, and sketches how to go in the reverse direction (i.e. how to extract PROV-DM from a RDF graph that includes PROV-O data as well as possibly other RDF).

Note that I (jcheney) am not being careful about using a standardized RDF syntax, as I don't know any of them. I am just giving the flavor of what I have in mind.

Coverage: This is NOT complete, only for illustration so far. It covers many of the basic element and relation records. It does not cover: derivation, acts on hbehalf of, accounts, ....

Guideline: Include all RDF assertions associated with a DM assertion, even if some of them wind up being redundant/inferrable.

# From PROV-DM to PROV-O

We define a translation from PROV-DM formulas to RDF conforming to PROV-O as follows.

There are some places where it's non-obvious (to jcheney) what to do, marked with "???".

## Mapping coverage

The undersigned have reviewed DM WD3 and agree that all ASN signatures in WD3 appear as left hand sides of the rules shown on this page. Further, the rules here are in the same order as DM WD3 and no rules appear here without appearing in DM WD3.

• Daniel Garijo (10-Feb-2012)
• and here (date)

The formulas are listed in an order that corresponds to the order given in PROV-DM WD3.

## Translating element formulas

### Entity

PROV-DM (eg) $\implies$ PROV-O (eg)

$\begin{array}{lcl} entity(id,[attr_1=val_1,...,attr_n=val_n]) &\to & \left\{ \begin{array}{lcl} id & \texttt{a} & \texttt{prov:Entity}\ . \\ id & attr_1 & val_1 \ .\\ & \vdots\\ id & attr_n & val_n \ . \end{array}\right. \end{array}$

Uses before defined: prov:type

### Activity

PROV-DM (eg) $\implies$ PROV-O (eg)

$\begin{array}{lcl} activity(id,[st],[et],[attr_1=val_1,...,attr_n=val_n]) &\to & \left\{ \begin{array}{lcl}  id & \texttt{a} & \texttt{prov:Activity}\ . \\ id & \texttt{prov:startedAt} & st\ . \\ id & \texttt{prov:endedAt} & et\ .\\ id & attr_1 & val_1 \ .\\ & \vdots\\ id & attr_n & val_n \ .  \end{array}\right. \end{array}$

Uses before defined: prov:type

Issues (LHS):

• How is startedAt and endedAt distinct from other attribute-value associated with Activity? (Satya)

### Agent

PROV-DM (eg) $\implies$ PROV-O (eg)

$\begin{array}{lcl} agent(id, [attr_1=val_1,...,attr_n=val_n]) &\to & \left\{ \begin{array}{lcl}  id & \texttt{a} & \texttt{prov:Agent}\ . \\ id & \texttt{a} & \texttt{ns:Type}\ .\\ id & attr_1 & val_1\ .\\ & \vdots\\ id & attr_n & val_n\ .  \end{array}\right. \end{array}$

prov:Person        rdfs:subClassOf prov:Agent .
prov:Organization  rdfs:subClassOf prov:Agent .
prov:SoftwareAgent rdfs:subClassOf prov:Agent .

[] a owl:AllDisjointClasses;
owl:members ( prov:Person prov:Organization prov:SoftwareAgent ).


Mentions but does not define:

• prov:Person,
• prov:Organization,
• prov:SoftwareAgent .

Uses before defined:

• prov:type
• wasStartedBy
• wasAssociatedWith
• prov:role

Issues:

• How to type an agent to Person, Organization, SoftwareAgent? with a prov:type attribute? (the example shows it, but not stated explicitly)

### Note

PROV-DM (eg) $\implies$ PROV-O (eg)

$\begin{array}{lcl} note(id,[attr_1=val_1,...,attr_n=val_n]) &\to & \left\{ \begin{array}{lcl}  id & \texttt{a} & \texttt{[~owl:unionOf~(~prov:Entity~prov:Activity~)~]}\ .\\ id & attr_1 & val_1\ .\\ & \vdots\\ id & attr_n & val_n\ .\\ attr_1 & \texttt{a} & \texttt{owl:AnnotationProperty}\ .\\ & \vdots\\ attr_n & \texttt{a} & \texttt{owl:AnnotationProperty}\ .  \end{array}\right. \end{array}$

Concerns:

• Use of notes is reasonable for things like "GUI Color",
• but NOT for the much heavier-duty use that DM offers (meta-provenance).

Uses before defined: hasAnnotation

## Translating relation formulas

### Generation

PROV-DM (eg) $\implies$ PROV-O (eg)

$\begin{array}{lcl} wasGeneratedBy([id],e,[a],[t],[attrs]) &\to& \left\{ \begin{array}{lcl}  e & \texttt{prov:wasGeneratedBy} & a\ .\\ e & \texttt{a} & \texttt{prov:Entity}\ . \\ a & \texttt{a} & \texttt{prov:Activity}\ . \\ a & \texttt{prov:generated} & e\ .\\ a & \texttt{prov:hadQualifiedGeneration} & id\ .\\ id & \texttt{a} & \texttt{prov:Generation}\ . \\ id & \texttt{prov:hadQualifiedEntity} & e\ .\\ id & attr_1 & val_1\ .\\ & \vdots\\ id & attr_n & val_n\ .\\ e & \texttt{prov:wasGeneratedAt} & t\ .  \end{array}\right. \end{array}$

Issues:

• An entity can only be generated once (Tim's claim, does DM say anything about it?):
prov:Entity owl:subClassOf [ owl:onProperty prov:wasGeneratedAt; owl:maxCardinality 1 ] .

• For PROV-O, the activity id cannot be optional. (Satya)
• Having activity id as optional violates the DM requirement that all relations "have two primary elements" (Section 5.3, DM TPWD). (Satya)
• Why is time [t] listed as a distinct attribute from other attribute-value pairs? Isn't time of generation yet another attribute? (Satya)

### Usage

PROV-DM (eg) $\implies$ PROV-O (eg)

$\begin{array}{lcl} used([id],a,e,[t],[attrs]) &\to& \left\{ \begin{array}{lcl}  a & \texttt{prov:used} & e\ .\\ a & \texttt{a} & \texttt{prov:Activity}\ . \\ e & \texttt{a} & \texttt{prov:Entity}\ . \\ e & \texttt{prov:wasUsedAt} & t\ .\\ a & \texttt{prov:hadQualifiedUsage} & id\ .\\ id & a & \texttt{prov:Usage}\ . \\ id & \texttt{prov:hadQualifiedEntity} & e\ .\\ id & \texttt{prov:happenedAt??} & t\ .\\ id & attr_1 & val_1\ .\\ & \vdots\\ id & attr_n & val_n\ .  \end{array}\right. \end{array}$

Issues:

• If activity id is optional for generation record, why is it not so for usage record? These two points need to be reconciled either way. (Satya)
• Similar to generation, time can be "folded" into the "attribute" list. (Satya)

### Agent Association

PROV-DM (eg) $\implies$ PROV-O (eg)

$\begin{array}{lcl} wasAssociatedWith([id],act,ag,[p],[attrs]) &\to& \left\{ \begin{array}{lcl}  act & \texttt{prov:wasAssociatedWith} & ag\ .\\ act & \texttt{a} & \texttt{prov:Activity}\ . \\ ag & \texttt{a} & \texttt{prov:Agent}\ . \\ act & \texttt{prov:hadQualifiedAssociation} & id\ .\\ id & \texttt{a} & \texttt{prov:Association}\ . \\ id & \texttt{prov:hadQualifiedEntity} & ag\ .\\ id & \texttt{prov:adoptedPlan} & p\ .\\ id & attr_1 & val_1\ .\\ & \vdots\\ id & attr_n & val_n\ .\\ p & \texttt{a} & \texttt{prov:Plan}\ .  \end{array}\right. \end{array}$

Uses before defined: prov:type, prov:role

### Starting

PROV-DM (eg) $\implies$ [PROV-O] (eg)

$\begin{array}{lcl} wasStartedBy([id],a,ag,[attrs]) &\to& \left\{ \begin{array}{lcl}  \texttt{a} & \texttt{prov:wasStartedBy} & ag.\\ a & \texttt{a} & \texttt{prov:Activity} . \\ ag & \texttt{a} & \texttt{prov:Agent} . \\ a & \texttt{prov:hadQualifiedStart} & \texttt{prov:Start} . \\ a & \texttt{prov:hadQualifiedEntity} & ag . \\ id & attr_1 & val_1 .\\ & \vdots\\ id & attr_n & val_n .  \end{array}\right. \end{array}$

We seemed to agree at F2F2 that 1) who started and 2) when it was started would be separated

Note: we agreed to left this relationship out of the first alignement

Issues:

• The majority of uses for the qualified start should actually be Activities (Tim)

### Ending

PROV-DM $\implies$ [PROV-O]

$\begin{array}{lcl} wasEndedBy([id],a,ag,[attrs]) &\to& \left\{ \begin{array}{lcl}  a & \texttt{a} & \texttt{prov:Activity} . \\ ag & \texttt{a} & \texttt{prov:Agent} .\\ a & \texttt{prov:wasEndedBy} & act.\\ id & attr_1 & val_1 .\\ & \vdots\\ id & attr_n & val_n .  \end{array}\right. \end{array}$

We seemed to agree at F2F2 that 1) who started and 2) when it was started would be separated

Note: we agreed to left this relationship out of the first alignement

### Responsibility

PROV-DM $\implies$ PROV-O

$\begin{array}{lcl} actedOnBehalfOf([id],ag2,ag1,[a],[attrs]) &\to& \left\{ \begin{array}{lcl}  ag2 & \texttt{prov:actedOnBehalfOf} & ag1 . \\ ag2 & \texttt{a} & \texttt{prov:Agent} . \\ ag1 & \texttt{a} & \texttt{prov:Agent} . \\ ag2 & \texttt{prov:hadQualifiedDelegation} & id .\\ id & \texttt{a} & \texttt{prov:Delegation} . \\ id & \texttt{prov:qualifiedEntity} & ag1 . \\ id & \texttt{prov:qualifiedActivity???} & a . \\ id & attr_1 & val_1 .\\ & \vdots\\ id & attr_n & val_n .\\ a & \texttt{a} & \texttt{prov:Activity} .  \end{array}\right. \end{array}$

Used prov:type and prov:role before defined.

Issues:

• might be nice to rename "hadQualifiedEntity/Activity" to "involvedEntity/Activity"

### Derivation

PROV-DM (eg) $\implies$ PROV-O (eg)

#### precise-1

$\begin{array}{lcl} wasDerivedFrom([id], e2, e1, a, g2, u1, [attrs]) &\to& \left\{ \begin{array}{lcl}  TBD.  \end{array}\right. \end{array}$

#### imprecise-1

$\begin{array}{lcl} wasDerivedFrom([id], e2,e1, [t], attrs) &\to& \left\{ \begin{array}{lcl}  e2 & \texttt{prov:wasDerivedFrom} & e1\ .\\ a & \texttt{prov:hadQualifiedDerivation} & id\ .\\ id & \texttt{prov:steps} & \texttt{prov:single}\ .\\ id & attr_1 & val_1\ .\\ & \vdots\\ id & attr_n & val_n\ .  \end{array}\right. \end{array}$

#### imprecise-n

$\begin{array}{lcl} wasDerivedFrom([id], e2, e1, [t], [attrs]) &\to& \left\{ \begin{array}{lcl} TBD \end{array}\right. \end{array}$

#### not in DM: consolidated derivation signature

$\begin{array}{lcl} wasDerivedFrom([id], e2, e1, [a, [g2], [u1]], [attrs]) &\to& \left\{ \begin{array}{lcl}  e2 & \texttt{prov:wasDerivedFrom} & e1\ .\\ e2 & \texttt{a} & \texttt{prov:Entity}\ . \\ e1 & \texttt{a} & \texttt{prov:Entity}\ . \\ a & \texttt{a} & \texttt{prov:Activity}\ . \\ e2 & \texttt{prov:wasGeneratedBy} & a\ . \\ a & \texttt{prov:used} & e1\ . \\ e2 & \texttt{prov:hadQualifiedDerivation} & id\ .\\ id & \texttt{a} & \texttt{prov:Derivation}\ . \\ id & \texttt{prov:hadQualifiedEntity} & ag\ .\\ id & \texttt{prov:hadQualifiedActivity} & a\ .\\ id & attr_1 & val_1\ .\\ & \vdots\\ id & attr_n & val_n\ .  \end{array}\right. \end{array}$

Note: Daniel used the [a,[g2], [u1]] notation to indicate that a, g2, and u1 are optional, but if g2 or u1 are present, then a is required as well. (Imprecise and precise derivations are mixed, but we could separate them)

### AlternateOf

PROV-DM (eg) $\implies$ PROV-O (eg)

$\begin{array}{lcl} alternateOf(e1,e2,[attrs]) &\to& \left\{ \begin{array}{lcl}  e1 & \texttt{prov:alternateOf} & e2 . \\ ag2 & \texttt{prov:hadQualified???} & id .\\ e1 & \texttt{a} & \texttt{prov:Entity} . \\ e2 & \texttt{a} & \texttt{prov:Entity} . \\ ?? & \texttt{prov:qualifiedEntity} & e2 . \\ id & attr_1 & val_1 .\\ \vdots\\ id & attr_n & val_n .  \end{array}\right. \end{array}$

Note: we agreed to left this relationship out of the first alignement

### SpecializationOf

PROV-DM (eg) $\implies$ PROV-O (eg)

$\begin{array}{lcl} specializationOf(e1,e2,[attrs]) &\to& \left\{ \begin{array}{lcl}  e1 & \texttt{prov:specializationOf} & e2 . \\ ag2 & \texttt{prov:hadQualified???} & id .\\ e1 & \texttt{a} & \texttt{prov:Entity} . \\ e2 & \texttt{a} & \texttt{prov:Entity} . \\ ?? & \texttt{prov:qualifiedEntity} & e2 . \\ id & attr_1 & val_1 .\\ \vdots\\ id & attr_n & val_n .  \end{array}\right. \end{array}$

Note: we agreed to left this relationship out of the first alignement

### Annotation

PROV-DM (eg) $\implies$ [PROV-O] (eg)

$\begin{array}{lcl} hasAnnotation(id,[attrs]) &\to& \left\{ \begin{array}{lcl}  TBD.\\ id & attr_1 & val_1 .\\ \vdots\\ id & attr_n & val_n .  \end{array}\right. \end{array}$

Note: we'll be using rdfs:comment and label to handle the annotations

### Account

PROV-DM (eg) $\implies$ [PROV-O] (eg)

$\begin{array}{lcl} Account(id,[asserter],[attrs]) &\to& \left\{ \begin{array}{lcl}  TBD.\\ id & attr_1 & val_1 .\\ \vdots\\ id & attr_n & val_n .  \end{array}\right. \end{array}$

Note: we agreed to left this relationship out of the first alignement

### Record Container

PROV-DM (eg) $\implies$ [PROV-O] (eg)

$\begin{array}{lcl} container namespaceDeclarations (record) + 'end container' &\to& \left\{ \begin{array}{lcl} \end{array}\right. \end{array}$

Note: we agreed to left this relationship out of the first alignement

### Time

PROV-DM (eg) $\implies$ PROV-O (eg)

### Asserter

PROV-DM (eg) $\implies$ [PROV-O] (eg)

### Location

PROV-DM (eg) $\implies$ PROV-O (eg)

### Traceability

PROV-DM (eg) $\implies$ [PROV-O] (eg)

$\begin{array}{lcl} tracedTo(id1,id2, [attrs]) &\to& \left\{ \begin{array}{lcl}  TBD.\\ id & attr_1 & val_1 .\\ \vdots\\ id & attr_n & val_n .  \end{array}\right. \end{array}$

### Activity Ordering

PROV-DM (eg) $\implies$ PROV-O (eg)

$\begin{array}{lcl} wasInformedBy(id1,id2, [attrs]) &\to& \left\{ \begin{array}{lcl}  TBD.\\ id & attr_1 & val_1 .\\ \vdots\\ id & attr_n & val_n .  \end{array}\right. \end{array}$

### Revision

PROV-DM (eg) $\implies$ [PROV-O] (eg)

$\begin{array}{lcl} wasRevisionOf(id1,id2,[ag], [attrs]) &\to& \left\{ \begin{array}{lcl}  TBD.\\ id & attr_1 & val_1 .\\ \vdots\\ id & attr_n & val_n .  \end{array}\right. \end{array}$

PROV-DM (eg) $\implies$ PROV-O (eg)

$\begin{array}{lcl} wasAttrributedTo(e,ag,[attrs]) &\to& \left\{ \begin{array}{lcl}  TBD.\\ id & attr_1 & val_1 .\\ \vdots\\ id & attr_n & val_n .  \end{array}\right. \end{array}$

### Quotation

PROV-DM (eg) $\implies$ PROV-O (eg)

$\begin{array}{lcl} wasQuotedFrom(e1,e2,[ag1],[ag2],[attrs]) &\to& \left\{ \begin{array}{lcl}  TBD.\\ id & attr_1 & val_1 .\\ \vdots\\ id & attr_n & val_n .  \end{array}\right. \end{array}$

### Summary

PROV-DM (eg) $\implies$ PROV-O (eg)

$\begin{array}{lcl} wasSummaryOf(e2,e1, [attrs]) &\to& \left\{ \begin{array}{lcl}  TBD.\\ id & attr_1 & val_1 .\\ \vdots\\ id & attr_n & val_n .  \end{array}\right. \end{array}$

### Original Source

PROV-DM (eg) $\implies$ PROV-O (eg)

$\begin{array}{lcl} hadOriginalSource(e1,e2, [attrs]) &\to& \left\{ \begin{array}{lcl}  TBD.\\ id & attr_1 & val_1 .\\ \vdots\\ id & attr_n & val_n .  \end{array}\right. \end{array}$

### old monolithic list

$\begin{array}{lcl} wasGeneratedBy(id,e,a,attrs,t) &\to& \left\{ \begin{array}{lcl}  id & a & \texttt{prov:Generation} . \\ id & \texttt{prov:hadQualifiedEntity} & e .\\ a & \texttt{prov:hadQualifiedGeneration} & id .\\ e & \texttt{prov:wasGeneratedAt} & t .\\ e & \texttt{prov:wasGeneratedBy} & a .\\ id & \texttt{prov:happenedAt???} & t .\\ id & attr_1 & val_1 .\\ \vdots\\ id & attr_n & val_n .  \end{array}\right. \\\\ used(id,e,a,attrs,t) &\to& \left\{ \begin{array}{lcl}  id & a & \texttt{prov:Usage} . \\ id & \texttt{prov:hadQualifiedEntity} & e .\\ a & \texttt{prov:hadQualifiedUsage} & id .\\ id & \texttt{prov:happenedAt???} & t .\\ a & \texttt{prov:used} & e .\\ id & attr_1 & val_1 .\\ \vdots\\ id & attr_n & val_n .  \end{array}\right. \\\\ wasStartedBy(id,a,ag,attrs) &\to& \left\{ \begin{array}{lcl}  id & a & \texttt{prov:ActivityStart???} . \\ a & \texttt{prov:startedAt} & t .\\ a & \texttt{prov:wasStartedBy} & act.\\ id & attr_1 & val_1 .\\ \vdots\\ id & attr_n & val_n .  \end{array}\right. \\\\ wasEndedBy(id,a,ag,attrs) &\to& \left\{ \begin{array}{lcl}  id & a & \texttt{prov:ActivityEnd???} . \\ a & \texttt{prov:endedAt} & t .\\ a & \texttt{prov:wasEndedBy} & act.\\ id & attr_1 & val_1 .\\ \vdots\\ id & attr_n & val_n .  \end{array}\right. \\\\  alternateOf(e_1,e_2) &\to& e_1~ \texttt{prov:alternateOf}~ e_2  \\\\ specializationOf(e_1,e_2) &\to& e_1 ~\texttt{prov:specializationOf} ~e_2 \\\\ hasAnnotation(r,n,attrs) &\to&  \left\{ \begin{array}{lcl}  r & \texttt{prov:hasAnnotation???} & \texttt{n} . \\ ?? & attr_1 & val_1 .\\ \vdots\\ ?? & attr_n & val_n .  \end{array}\right. \end{array}$

## Questions/problems

1. The element formula for activities is the only one that mentions additional things besides attributes. This seems odd.
2. It isn't obvious whether we should emit a triple saying that the plan element of an activity is a $\texttt{prov:Plan}$. I guess this can be inferred if we omit it?
3. In the rule for note, there is no class we can assign to the id. (The obvious idea of using rdfs:comment doesn't work because there's no separate class for the comments, and the range of rdfs:comment is Literal.) Is this a problem? Proposed solution: add class prov:Note.
4. wasGeneratedBy has a time which can be linked to the generated entity by $\texttt{prov:wasGeneratedAt}$, but I think the time should be linked directly to the id. Proposed solution: introduce $\texttt{prov:happenedAt}$, define $\texttt{prov:wasGeneratedAt}$ as the composition of $\texttt{prov:happenedAt}$ and $\texttt{prov:hadQualifiedEntity}$.
5. used has a time and it's not obvious what this should be linked to in RDF and how. There is no relation for linking the used id to the time. Proposed solution: introduce $\texttt{prov:happenedAt}$.
6. wasStartedBy and wasEndedBy are treated as events (and they have id's and attributes), but there is no class for them. Proposed solution: introduce $\texttt{prov:ActivityStart}$ and $\texttt{prov:ActivityEnd}$ as subclasses of QualifiedInvolvement.
7. wasStartedBy and wasEndedBy rules have no obvious way to link the start and end time.
8. In hasAnnotation, should the attributes be connected to r or to n? Given that the note n can have arbitrary attributes, why does hasAnnotation have additional attributes?

# From PROV-O to PROV-DM

Given an instance of PROV-O, we want to compute an instance of PROV-DM that has the "same meaning".

The basic idea is:

1. For each node in the RDF graph, check whether the node is an instance of one of the PROV-O classes Entity, Agent, or Activity.
1. For each such node, look for the appropriate edges in the prov: namespace needed to fill in the fields of the corresponding PROV-DM record.