W3C home > Mailing lists > Public > public-prov-wg@w3.org > July 2012

[Prov-O] Review of examples

From: Stian Soiland-Reyes <soiland-reyes@cs.manchester.ac.uk>
Date: Tue, 3 Jul 2012 12:18:32 +0100
Message-ID: <CAPRnXtmrmFhZdRwkd4UaV5SnjP0Vshg+CeOQjukEFtz_hRijJQ@mail.gmail.com>
To: public-prov-wg@w3.org
This email is mainly my notes as I have been checking the examples
used by PROV-O to make sure they are valid RDF and valid according to
the ontology.

I would need volunteers to complete the job (such as fixing the
examples that are broken!). Any takers? Also suggestions on other ways
to check this would be appreciated.

I've made a little shell script that checks all PROV-O examples (which
again are embedded into HTML):


It uses CWM to check the syntax only, assuming N3 rather than Turtle.
The output is the filename if it is OK, or error message on stderr:

> stain@ralph-ubuntu:~/src/prov/examples/eg-24-prov-o-html-examples/rdf/create$ ./check-examples.bash
> rdf/property_qualifiedDerivation.ttl
> rdf/property_inserted.ttl
> (..)
>     Failed to parse file:///home/stain/src/prov/examples/eg-24-prov-o-html-examples/rdf/create/rdf/class_ContextualizedEntity.ttl
>    file:///home/stain/src/prov/examples/eg-24-prov-o-html-examples/rdf/create/rdf/class_ContextualizedEntity.ttl
> Traceback (most recent call last):
>   File "/usr/local/bin/cwm", line 750, in <module>
>     doCommand()
> rdf/property_hasAnchor.ttl
> rdf/property_key.ttl
> (..)
> stain@ralph-ubuntu:~/src/prov/examples/eg-24-prov-o-html-examples/rdf/create$

Some of these errors are due to them being in TriG format rather than
Turtle format, which is not supported by CWM.

The remaining syntax errors I have corrected and committed.

If we use this style for the named graphs:

:G1 = {
  :a :b :c
} .

Then it is valid N3 (but not Turtle), and can be included in the test.
I changed this temporarily (not checked in) using:

for f in $(find rdf -name '*ttl') ; do cat $f | sed 's/{$/= {/' | sed
's/^}/} ./' > /tmp/$$ && cp /tmp/$$ $f ; done

.. to ensure they are valid enough - and then check with
./check-examples.bash again.

BTW - I found it odd that prov:Note is asserted inside the note graph
in rdf/class_Note.ttl and rdf/class_Trace.ttl, rather than in the
graph outside that has prov:hasAnnotation - so I moved that out. (Also
I guess we don't want to reinvent an annotation ontology -
http://www.w3.org/community/openannotation/ )

Then on to checking if there are some spelling wrong, like prov:Acvititity.

To include the named graph files in this, I temporarily flattened them
rather than use the Turtle syntax:
  hg revert -C rdf
  for f in $(find rdf -name '*ttl') ; do cat $f | sed 's/{$/ a
prov:Entity ./' | sed 's/^}//' > /tmp/$$ && cp /tmp/$$ $f ; done
  hg revert -C rdf

I've made a little shell script that merges all the PROV-O examples to
a single TTL file - ./merge-examples.bash

This generates merged.ttl - see

(Note - you do not need to do the above sed-trick if you are OK to
ignore the 4-5 TriG files from the merge - merge-examples will
silently skip files that don't parse)

I then opened merged.ttl in Protege 4.2 beta, and saved it out again in Turtle:


As a side note - to distinguish between 'our' classes (like Painting)
and classes in other namespaces, like prov:Activity - turn on prefix
qnames by going to View -> Custom rendering -> Render by Qualified

As you see, Protege has filled in the blanks for 'new' classes and
properties, such as:

prov:inContext rdf:type owl:AnnotationProperty .
prov:contextualized rdf:type owl:AnnotationProperty .
prov:hadQuoter rdf:type owl:AnnotationProperty .
prov:Actvity rdf:type owl:Class .
prov:CompleteCollection rdf:type owl:Class .

Now, the boring job (which I have not done - any takers?) - is to go
through this list for the properties and classes (you can ignore
'Individuals') - and for any prov: keyword, look in merged.ttl to see
where it came from.

For instance, prov:hadQuoter - can be found in merged.ttl as:

@base <http://dvcs.w3.org/hg/prov/raw-file/tip/examples/eg-24-prov-o-html-examples/rdf/create/rdf/property_hadQuoter.ttl>
# ...
      prov:hadQuoter <http://data.semanticweb.org/person/luc-moreau>;
# ...

And so it is rdf/property_hadQuoter.ttl that needs to be fixed (or deleted).

The final step is in Protege 4.2 is to turn on the Reasoner and see if
our mega-merge is consistent. This turn out not to be the case - but
mainly because we have reused some terms in the examples - like :

* First flip in the top drop-down box to PROV-O to run the reasoner on this.
* Under Reasoner, select Fact++
* Under Reasoner, click Start Reasoning
** This should succeed
* Now in the drop-down, go back to merged.ttl
* Under Reasoner, click Start Reasoning
** It will complain that the ontology is inconsistent
** Wait 2 seconds (not sure why)
** Click "Explain"
*** Protege will compute explanations for a while, I got at least 36
before I clicked Stop.

Unfortunately I don't seem to be able to export the explanations in text form.

Example explanation:

> 'The Painter' invalidatedAtTime "2012-09-02T01:31:00Z"
> invalidatedAtTime Range: dateTime

(here the error is probably that ^^xsd:dateTime is missing in the literal)

> filling-fuel endedAtTime "2012-04-24T18:31:00Z"^^xsd:dateTime
> Functional: startedAtTime
> filling-fuel endedAtTime "2012-04-24T18:21:00Z"^^xsd:dateTime

(Here the error is that two examples state endedAtTime for the same
instance - but have different literal values)

> > draft2 qualifiedAssociation _:genid113
> Activity DisjointWith Entity
> qualifiedAssociation Domain Activity
> draft2 wasRevisionOf e1
> wasRevisionOf Domain Entity

Here the problem is that 'draft2' has been asserted with both
wasRevisionOf and qualifiedAssociation - but their domains are
disjoint; it can't both be an Activity and Entity. This bug is in

There are a few more - but there are some common patterns. I suggest:

* Rename example instances that are distinct
* Fix errors such as qualifiedAssociation above (check: Is the error
in the example or the OWL? Note that merged.ttl imports from
http://dvcs.w3.org - so if you change ProvenanceOntology.owl - do a
push before reloading in Protege)
* Re-merge and try again ..

Once the ontology is consistent - it is possible to do File -> Export
inferred axioms to ontology.

As an exercise - here are the inferred axioms from ProvenanceOntology.owl:


I've had a look at this, and most of this are obvious inferences that
reasons need:

    56 <http://www.w3.org/ns/prov#agent> rdf:type owl:ObjectProperty ;
    60                                   owl:inverseOf [ owl:inverseOf
    61                                                 ] .

(this could be one of the reasons why we don't have inverses for every

I looked through this list and did not find anything controversial.

Stian Soiland-Reyes, myGrid team
School of Computer Science
The University of Manchester
Received on Tuesday, 3 July 2012 11:19:28 UTC

This archive was generated by hypermail 2.3.1 : Tuesday, 6 January 2015 21:58:17 UTC