From 82e6a685c834291bd3da14209dfaf8f1d62b62f5 Mon Sep 17 00:00:00 2001 From: Paul Groth Date: Tue, 12 Aug 2014 16:14:58 +0200 Subject: [PATCH 01/23] beginnings of a vm for prov stuff --- Vagrantfile | 122 +++++++++++++++++++++++++++++++++++++++++++++++++++ bootstrap.sh | 21 +++++++++ 2 files changed, 143 insertions(+) create mode 100644 Vagrantfile create mode 100755 bootstrap.sh diff --git a/Vagrantfile b/Vagrantfile new file mode 100644 index 0000000..91b7b92 --- /dev/null +++ b/Vagrantfile @@ -0,0 +1,122 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : + +# Vagrantfile API/syntax version. Don't touch unless you know what you're doing! +VAGRANTFILE_API_VERSION = "2" + +Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| + # All Vagrant configuration is done here. The most common configuration + # options are documented and commented below. For a complete reference, + # please see the online documentation at vagrantup.com. + + # Every Vagrant virtual environment requires a box to build off of. + config.vm.box = "hashicorp/precise64" + + # Disable automatic box update checking. If you disable this, then + # boxes will only be checked for updates when the user runs + # `vagrant box outdated`. This is not recommended. + # config.vm.box_check_update = false + + # Create a forwarded port mapping which allows access to a specific port + # within the machine from a port on the host machine. In the example below, + # accessing "localhost:8080" will access port 80 on the guest machine. + # config.vm.network "forwarded_port", guest: 80, host: 8080 + + # Create a private network, which allows host-only access to the machine + # using a specific IP. + # config.vm.network "private_network", ip: "192.168.33.10" + + # Create a public network, which generally matched to bridged network. + # Bridged networks make the machine appear as another physical device on + # your network. + # config.vm.network "public_network" + + # If true, then any SSH connections made will enable agent forwarding. + # Default value: false + # config.ssh.forward_agent = true + + # Share an additional folder to the guest VM. The first argument is + # the path on the host to the actual folder. The second argument is + # the path on the guest to mount the folder. And the optional third + # argument is a set of non-required options. + # config.vm.synced_folder "../data", "/vagrant_data" + + # Provider-specific configuration so you can fine-tune various + # backing providers for Vagrant. These expose provider-specific options. + # Example for VirtualBox: + # + # config.vm.provider "virtualbox" do |vb| + # # Don't boot with headless mode + # vb.gui = true + # + # # Use VBoxManage to customize the VM. For example to change memory: + # vb.customize ["modifyvm", :id, "--memory", "1024"] + # end + # + # View the documentation for the provider you're using for more + # information on available options. + + # Enable provisioning with CFEngine. CFEngine Community packages are + # automatically installed. For example, configure the host as a + # policy server and optionally a policy file to run: + # + # config.vm.provision "cfengine" do |cf| + # cf.am_policy_hub = true + # # cf.run_file = "motd.cf" + # end + # + # You can also configure and bootstrap a client to an existing + # policy server: + # + # config.vm.provision "cfengine" do |cf| + # cf.policy_server_address = "10.0.2.15" + # end + + # Enable provisioning with Puppet stand alone. Puppet manifests + # are contained in a directory path relative to this Vagrantfile. + # You will need to create the manifests directory and a manifest in + # the file default.pp in the manifests_path directory. + # + # config.vm.provision "puppet" do |puppet| + # puppet.manifests_path = "manifests" + # puppet.manifest_file = "site.pp" + # end + + # Enable provisioning with chef solo, specifying a cookbooks path, roles + # path, and data_bags path (all relative to this Vagrantfile), and adding + # some recipes and/or roles. + # + # config.vm.provision "chef_solo" do |chef| + # chef.cookbooks_path = "../my-recipes/cookbooks" + # chef.roles_path = "../my-recipes/roles" + # chef.data_bags_path = "../my-recipes/data_bags" + # chef.add_recipe "mysql" + # chef.add_role "web" + # + # # You may also specify custom JSON attributes: + # chef.json = { mysql_password: "foo" } + # end + + # Enable provisioning with chef server, specifying the chef server URL, + # and the path to the validation key (relative to this Vagrantfile). + # + # The Opscode Platform uses HTTPS. Substitute your organization for + # ORGNAME in the URL and validation key. + # + # If you have your own Chef Server, use the appropriate URL, which may be + # HTTP instead of HTTPS depending on your configuration. Also change the + # validation key to validation.pem. + # + # config.vm.provision "chef_client" do |chef| + # chef.chef_server_url = "https://api.opscode.com/organizations/ORGNAME" + # chef.validation_key_path = "ORGNAME-validator.pem" + # end + # + # If you're using the Opscode platform, your validator client is + # ORGNAME-validator, replacing ORGNAME with your organization name. + # + # If you have your own Chef Server, the default validation client name is + # chef-validator, unless you changed the configuration. + # + # chef.validation_client_name = "ORGNAME-validator" +end diff --git a/bootstrap.sh b/bootstrap.sh new file mode 100755 index 0000000..929d2cb --- /dev/null +++ b/bootstrap.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash + +apt-get update +apt-get install rasqal-utils +apt-get install raptor2-utils +apt-get install redland-utils +apt-get install libxml2-utils +apt-get install graphviz +apt-get install curl +apt-get install unzip +apt-get install openjdk-7-jre-headless + + + + +curl -O http://search.maven.org/remotecontent?filepath=org/openprovenance/prov/toolbox/0.6.1/toolbox-0.6.1-release.zip +unzip toolbox-0.6.1-release.zip +mv ./provToolbox/ /usr/local/bin/ +export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/ + +export PATH=$PATH:/usr/local/bin/provToolbox/bin From 535bda79ee1fcca7bdd13034c715b0a18c8b2e59 Mon Sep 17 00:00:00 2001 From: Paul Groth Date: Wed, 13 Aug 2014 17:32:57 +0200 Subject: [PATCH 02/23] update to support networking --- Vagrantfile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Vagrantfile b/Vagrantfile index 91b7b92..b10e260 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -11,6 +11,8 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| # Every Vagrant virtual environment requires a box to build off of. config.vm.box = "hashicorp/precise64" + + config.vm.provision :shell, path: "bootstrap.sh" # Disable automatic box update checking. If you disable this, then # boxes will only be checked for updates when the user runs @@ -20,7 +22,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| # Create a forwarded port mapping which allows access to a specific port # within the machine from a port on the host machine. In the example below, # accessing "localhost:8080" will access port 80 on the guest machine. - # config.vm.network "forwarded_port", guest: 80, host: 8080 + config.vm.network "forwarded_port", guest: 8905, host: 8080 # Create a private network, which allows host-only access to the machine # using a specific IP. From 83a448a97640a56d80e5e72feb5155ec3be46833 Mon Sep 17 00:00:00 2001 From: Paul Groth Date: Wed, 13 Aug 2014 17:33:09 +0200 Subject: [PATCH 03/23] some more updates --- bootstrap.sh | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/bootstrap.sh b/bootstrap.sh index 929d2cb..6b3523a 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -8,7 +8,14 @@ apt-get install libxml2-utils apt-get install graphviz apt-get install curl apt-get install unzip -apt-get install openjdk-7-jre-headless +apt-get install openjdk-7-jdk +apt-get install git +curl -sL https://deb.nodesource.com/setup | sudo bash - +apt-get install nodejs +apt-get install npm +apt-get install python-pip +apt-get install maven +apt-get install wdiff @@ -16,6 +23,26 @@ apt-get install openjdk-7-jre-headless curl -O http://search.maven.org/remotecontent?filepath=org/openprovenance/prov/toolbox/0.6.1/toolbox-0.6.1-release.zip unzip toolbox-0.6.1-release.zip mv ./provToolbox/ /usr/local/bin/ -export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/ +export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/ export PATH=$PATH:/usr/local/bin/provToolbox/bin + +npm config set registry http://registry.npmjs.org/ +npm install -g git2prov + +pip install rdflib +git clone https://github.com/Data2Semantics/prov-o-matic.git + +git clone https://github.com/gambl/wikipedia-provenance.git +cd ./wikipedia-provenance +mvn package + +export LC_ALL=en_US.UTF-8 + + + + + + + + From c412e41bb940b4d7cd9d83215e8ce29b5ae02e32 Mon Sep 17 00:00:00 2001 From: Paul Groth Date: Wed, 13 Aug 2014 17:33:48 +0200 Subject: [PATCH 04/23] some initial usage bits --- notes.txt | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 notes.txt diff --git a/notes.txt b/notes.txt new file mode 100644 index 0000000..396dd33 --- /dev/null +++ b/notes.txt @@ -0,0 +1,18 @@ + sudo update-alternatives --config java + +python prov-o-matic/src/provomatic/prov.py --prov-outputs blah.txt ls > blah.txt + + +curl -sH "Accept: text/turtle" -L http://dbpedia.org/resource/Amsterdam > adam.ttl + +roqet -i sparql -e 'select ?o where {?s ?o}' -r csv --data adam.ttl + +java -jar ./wikipedia-provenance/target/wikipedia-provenance-0.0.5-jar-with-dependencies.jar -startid 548577509 -o . -pAmsterdam + +provconvert -infile Amsterdam-startid548577509-r1-u1-d1.ttl -outfile Amsterdam-startid548577509-r1-u1-d1.svg + +roqet -i sparql -e 'select * where {?s a }' --data Amsterdam-startid548577509-r1-u1-d1.ttl + +roqet -i sparql -e 'select * where {?s a }' --data Amsterdam-startid548577509-r1-u1-d1.ttl + +roqet -i sparql -e 'select * where {?s a }' --data Amsterdam-startid548577509-r1-u1-d1.ttl \ No newline at end of file From 42241d1a02cb6a75c8ccc6032251d360eea9e743 Mon Sep 17 00:00:00 2001 From: Paul Groth Date: Mon, 18 Aug 2014 14:23:20 +0200 Subject: [PATCH 05/23] updated to support setting environment variables --- bootstrap.sh | 52 +++++++++++++++++++++++----------------------------- 1 file changed, 23 insertions(+), 29 deletions(-) diff --git a/bootstrap.sh b/bootstrap.sh index 6b3523a..e4138f3 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -1,31 +1,35 @@ #!/usr/bin/env bash -apt-get update -apt-get install rasqal-utils -apt-get install raptor2-utils -apt-get install redland-utils -apt-get install libxml2-utils -apt-get install graphviz -apt-get install curl -apt-get install unzip -apt-get install openjdk-7-jdk -apt-get install git + +sudo apt-get update +sudo apt-get -y install rasqal-utils +sudo apt-get -y install raptor2-utils +sudo apt-get -y install redland-utils +sudo apt-get -y install libxml2-utils +sudo apt-get -y install graphviz +sudo apt-get -y install curl +sudo apt-get -y install unzip +sudo apt-get -y install openjdk-7-jdk +sudo apt-get -y install git +sudo apt-get -y install python-pip +sudo apt-get -y install maven +sudo apt-get -y install wdiff curl -sL https://deb.nodesource.com/setup | sudo bash - -apt-get install nodejs -apt-get install npm -apt-get install python-pip -apt-get install maven -apt-get install wdiff +sudo apt-get -y install nodejs +sudo apt-get -y install npm + +export LC_ALL=en_US.UTF-8 +export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/ +echo "export LC_ALL=en_US.UTF-8" >> .bashrc +echo "export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/" >> .bashrc +echo "export PATH=$PATH:/usr/local/bin/provToolbox/bin" >> .bashrc curl -O http://search.maven.org/remotecontent?filepath=org/openprovenance/prov/toolbox/0.6.1/toolbox-0.6.1-release.zip unzip toolbox-0.6.1-release.zip -mv ./provToolbox/ /usr/local/bin/ - -export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/ -export PATH=$PATH:/usr/local/bin/provToolbox/bin +sudo mv ./provToolbox/ /usr/local/bin/ npm config set registry http://registry.npmjs.org/ npm install -g git2prov @@ -36,13 +40,3 @@ git clone https://github.com/Data2Semantics/prov-o-matic.git git clone https://github.com/gambl/wikipedia-provenance.git cd ./wikipedia-provenance mvn package - -export LC_ALL=en_US.UTF-8 - - - - - - - - From 2f35d0893f800be2011be1d349337d8faa2613f3 Mon Sep 17 00:00:00 2001 From: Paul Groth Date: Mon, 18 Aug 2014 14:23:56 +0200 Subject: [PATCH 06/23] added installation instructions --- README.md | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 59 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 6a607a5..8248abf 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,60 @@ -READ ME -========= +#Welcome -View the [PROV Tutorial Notebook](http://nbviewer.ipython.org/github/trungdong/notebooks/blob/master/PROV%20Tutorial.ipynb) (at nbviewer) +[Data provenance](http://en.wikipedia.org/wiki/Provenance#Data_provenance) - information about entities, activities, and people involved in producing a piece of data or thing - is becoming a crucial component in information systems. Whether it's the version history of software ((like github) or maintaing attribution as documents are created (think [CC-BY](https://wiki.creativecommons.org/Best_practices_for_attribution)), provenance is becoming widely available. + +To help work with provenance coming from multiple different systems, the W3C specified a common model and serializations for provenance, [PROV](http://www.w3.org/TR/2013/NOTE-prov-overview-20130430/). + +The aim of this tutorial is to provide a hands-on introduction to PROV by working with provenance from existing sources. Concretely, you will (hopefully): + +1. learn the core concepts of PROV; +2. obtain provenance from existing data sources; +3. query PROV provenance; +4. using multiple PROV serializations. + +This tutorial is primarily focused on working with provenance from the web in a hands on fashion. The tutorial builds on a number of existing resources: + +* [Provenance: An Introduction to PROV](http://provbook.org) - a book about PROV by myself and Luc Moreau. +* Tutorials focused on the PROV model introducing it: + * [IPAW 2014](http://www.provbook.org/tutorial/provenanceweek2014/) - from a UML perspective; + * [ESWC 2013](http://www.w3.org/2001/sw/wiki/ESWC2013ProvTutorial)- from a semantic web perspective; + * [EDBT 2014](http://practicalprovenance.wordpress.com/2013/03/27/tutorial-prov/) - from a relational perspective. +* [PROV Python tutorial](https://github.com/trungdong/notebooks) + +#Prerequisites + +The tutorial assumes: +* Working with the unix command line +* Familiarity with RDF and SPARQL +* Familiarity with git + +##Installation +The tutorial assumes that you have a unix environment (Mac OSX or Linus) and a number of installed packages. To make it easy to get started I've packaged all the necessary components into virtual machine deployable using [vagrant](http://www.vagrantup.com). + +Let's get started! + +* Install the [Virtual Box](https://www.virtualbox.org/wiki/Downloads) virtualization software for your platform. +* Install [vagrant](http://www.vagrantup.com/downloads.html) + + +Clone the repository and move to the PROVTutorial directory + + $ git clone https://github.com/pgroth/PROVTutorial.git + $ cd PROVTutorial + +Instantiate the virtual machine. This might take a while. + + $ vagrant up + +Once established you can connect to the virtual machine + + $ vagrant ssh + +Note that the virtual machine shares the PROVTutorial directory under the /vagrant directory. This allows you to move between your machine and another. + +To logout of the VM, just type exit + + $ exit + +For more commands for using vagrant [see their documentation](http://docs.vagrantup.com/v2/). + + From 6f72ebaa3eef7a144502c08c6958dd7cf207dd21 Mon Sep 17 00:00:00 2001 From: Paul Groth Date: Mon, 18 Aug 2014 22:00:02 +0200 Subject: [PATCH 07/23] writing things up --- README.md | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8248abf..2a6be30 100644 --- a/README.md +++ b/README.md @@ -57,4 +57,40 @@ To logout of the VM, just type exit For more commands for using vagrant [see their documentation](http://docs.vagrantup.com/v2/). - +The VM has installed the following packages and dependencies: + +- [curl](http://en.wikipedia.org/wiki/CURL) +- [The Redland RDF tools](http://librdf.org) +- [PROV Toolbox](http://lucmoreau.github.io/ProvToolbox/) +- [Git2Prov](https://www.npmjs.org/package/git2prov) +- [Wikipedia Provenance](https://github.com/gambl/wikipedia-provenance) + +The VM also sets the appropriate environment variables.l + +# PROV Core Concepts + +The figure below (taken from the [PROV Primer](http://www.w3.org/TR/prov-primer/)) shows the 3 core classes of PROV and how they are related. The PROV Primer provides more details and a working example. Here, will go with the basics so we can start querying datasets. + +![PROV Core Concepts](http://www.w3.org/TR/prov-primer/images/key-concepts.png) + +These three classes correspond to three views of provenance. + +1. The _data flow view_ helsp us represent the flow of information within a system. Entities are the things we want to describe the provenance of (`prov:Entity`). Entities are derived from other entities (`prov:wasDerivedFrom`). For example, within a version control system, we would describe that each revision as an entity and the newer version was derived from the older revision. e.g. `:newer prov:wasRevisionOf :older` + +2. The _process flow view_ helps us represent the processes that took place in a system and associated timing. `prov:Activity` denotes these processes. Activities are related to the information (i.e. entities) they take as input and generate as output. Represented respectively by `prov:used` and `prov:wasGeneratedBy`. For example, we might have a program such as curl take some input (a url) and generate some output (a downloaded web page). + +3. The _responsibility view_ helps us represent the assignment of responsibility in a system. Entities or activities that are assigned responsibility are denoted as `prov:Agent.` For example, a person, Bob, might be responsible for a particular web page. The web page's attribution is written as `:webpage prov:wasAttributedTo :bob`. Similarly, the activity of web page creation might also be Bob's responsibility written as `:bob prov:wasAssociatedWith :webPageCreation` + +## Querying a simple example +With these core concepts, let's query the [example from the PROV Primer](http://www.w3.org/TR/prov-primer/#examples-of-key-concepts-in-prov) about a the provenance of an online newspaper article + + + + + + +# Connecting across data sources + +# Reusing queries + +# From c9b8d8d77aa44560b826a2352a0732343e8c715b Mon Sep 17 00:00:00 2001 From: Paul Groth Date: Mon, 18 Aug 2014 22:08:23 +0200 Subject: [PATCH 08/23] prov:wasDerivedFrom http://www.w3.org/TR/prov-primer/primer-turtle-examples.ttl . There are a number of syntax errors in the example that should be fixed in the original version --- primer-example.ttl | 117 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 primer-example.ttl diff --git a/primer-example.ttl b/primer-example.ttl new file mode 100644 index 0000000..869fcdb --- /dev/null +++ b/primer-example.ttl @@ -0,0 +1,117 @@ +@prefix rdf: . +@prefix prov: . +@prefix exn: . +@prefix exg: . +@prefix exc: . +@prefix exb: . +@prefix dcterms: . +@prefix foaf: . +@prefix xsd: . + +# The examples below are taken from, and follow the same order +# as in the W3C PROV Primer, http://www.w3.org/TR/prov-primer/ + +# Entities + +exn:article a prov:Entity ; + dcterms:title "Crime rises in cities" . +exg:dataset1 a prov:Entity . +exc:regionList a prov:Entity . +exc:composition1 a prov:Entity . +exc:chart1 a prov:Entity . + +# Activities + +exc:compile1 a prov:Activity . +exc:compose1 a prov:Activity . +exc:illustrate1 a prov:Activity . + +# Usage and Generation + +exc:compose1 prov:used exg:dataset1 ; + prov:used exc:regionList . +exc:composition1 prov:wasGeneratedBy exc:compose1 . +exc:illustrate1 prov:used exc:composition1 . +exc:chart1 prov:wasGeneratedBy exc:illustrate1 . + +# Agents and Responsibility + +exc:compose1 prov:wasAssociatedWith exc:derek . +exc:illustrate1 prov:wasAssociatedWith exc:derek . +exc:derek a prov:Agent ; + a prov:Person ; + foaf:givenName "Derek"^^xsd:string ; + foaf:mbox . +exc:derek prov:actedOnBehalfOf exc:chartgen . +exc:chartgen a prov:Agent ; + a prov:Organization ; + foaf:name "Chart Generators Inc" . +exc:chart1 prov:wasAttributedTo exc:derek . + +# Roles + +exc:dataToCompose a prov:Role . +exc:regionsToAggregateBy a prov:Role . +exc:composedData a prov:Role . +exc:analyst a prov:Role . +exc:compose1 prov:qualifiedUsage [ + a prov:Usage ; + prov:entity exg:dataset1 ; + prov:hadRole exc:dataToCompose +] . +exc:compose1 prov:qualifiedUsage [ + a prov:Usage ; + prov:entity exc:regionList ; + prov:hadRole exc:regionsToAggregateBy +] . +exc:compose1 prov:qualifiedAssociation [ + a prov:Association ; + prov:agent exc:derek ; + prov:hadRole exc:analyst +] . +exc:composition1 prov:qualifiedGeneration [ + a prov:Generation ; + prov:activity exc:compose1 ; + prov:hadRole exc:composedData +] . + +# Revision and Derivation + +exg:dataSet2 a prov:Entity ; + prov:wasRevisionOf exg:dataset1 . +exc:chart2 a prov:Entity ; + prov:wasDerivedFrom exg:dataSet2 . +exc:chart2 a prov:Entity ; + prov:wasRevisionOf exc:chart1 . + +# Plans + +exg:correct1 a prov:Activity . +exg:edith a prov:Agent, prov:Person . +exg:instructions a prov:Plan . + +exg:correct1 prov:qualifiedAssociation [ + a prov:Association ; + prov:agent exg:edith ; + prov:hadPlan exg:instructions +] . +exg:dataSet2 prov:wasGeneratedBy exg:correct1 . + +# Time + +exc:chart1 prov:generatedAtTime "2012-03-02T10:30:00"^^xsd:dateTime . +exc:chart2 prov:generatedAtTime "2012-04-01T15:21:00"^^xsd:dateTime . + +exg:correct1 prov:startedAtTime "2012-03-31T09:21:00"^^xsd:dateTime ; + prov:endedAtTime "2012-04-01T15:21:00"^^xsd:dateTime . + +# Alternate Entities and Specialization + +exb:quoteInBlogEntry-20130326 a prov:Entity ; + prov:wasQuotedFrom exn:article . + +exn:articleV1 a prov:Entity ; + prov:specializationOf exn:article . + +exn:articleV2 prov:specializationOf exn:article . +exn:articleV2 prov:alternateOf exn:articleV1 . From c6b0eae103ea3505ff69bddeef4aa5f32dbd5fed Mon Sep 17 00:00:00 2001 From: Paul Groth Date: Tue, 19 Aug 2014 23:34:55 +0200 Subject: [PATCH 09/23] added instructions for querying the simple example as well as using wikipedia-provenance --- README.md | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 62 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 2a6be30..a7c045c 100644 --- a/README.md +++ b/README.md @@ -81,16 +81,73 @@ These three classes correspond to three views of provenance. 3. The _responsibility view_ helps us represent the assignment of responsibility in a system. Entities or activities that are assigned responsibility are denoted as `prov:Agent.` For example, a person, Bob, might be responsible for a particular web page. The web page's attribution is written as `:webpage prov:wasAttributedTo :bob`. Similarly, the activity of web page creation might also be Bob's responsibility written as `:bob prov:wasAssociatedWith :webPageCreation` -## Querying a simple example -With these core concepts, let's query the [example from the PROV Primer](http://www.w3.org/TR/prov-primer/#examples-of-key-concepts-in-prov) about a the provenance of an online newspaper article +## A simple example +With these core concepts, let's run some simple queries over the [example from the PROV Primer](http://www.w3.org/TR/prov-primer/#examples-of-key-concepts-in-prov) about a the provenance of an online newspaper article. We've made available the turtle file in this repository. +### Multiple serializations +Before querying, let's first get a visual overview of the example. To do this will use provconvert + $ cd /vagrant + $ provconvert -infile primer-example.ttl -outfile primer-example.svg +You can now view the svg of the example in your browser. +Similarly, you can make a pdf + $ provconvert -infile primer-example.ttl -outfile primer-example.pdf -# Connecting across data sources +More importantly, you can convert to other serializations/file formats like JSON. -# Reusing queries + $ provconvert -infile primer-example.ttl -outfile primer-example.json + +This is an important design decision behind PROV. It always one to interchange provenance between different common web formats. + +### Querying +Now that we have a view of the example, let's see what we can acccess. Will look at the data flow of the example. First, we'll find all the Entity's using SPARQL. + + $ roqet -i sparql -e 'select ?s where {?s a }' -r csv --data primer-example.ttl + +Let's now find which entities were derived from other entities. + + $ roqet -i sparql -e 'select ?e2 ?e1 where {?e2 ?e1 .}' -r csv --data primer-example.ttl + +The results are surprising. Only two results are returned. PROV includes a [number of sub-properties of `prov:wasDerivedForm`](http://www.w3.org/TR/prov-o/#wasDerivedFrom) so we need to query for those as well (or use an inference engine). For example, we could find all the revisions in the dataset. + + $ roqet -i sparql -e 'select ?e2 ?e1 where {?e2 ?e1 .}' -r csv --data primer-example.ttl + +There are a number of interesting things to try out on this example: + +* Can you compose queries for the responsibility and process flow views? +* Can you use SPARQL to walk back through the chain of derivation edges? (note this is not possible using roqet) +* What queries can you write with or without having knowledge of the data? + +# Provenance across data sources +Let's expand this to using some data from the web to show how having a common language can help us write some interesting queries. + +[DBPedia](http://dbpedia.org/) extracts structured data from Wikipedia. As a good web citizen they document which wikipedia pages particular dbpedia pages are extracted from using PROV. -# +Let's first grab the a Turtle version of the [dbpedia page for Amsterdam](http://dbpedia.org/page/Amsterdam) + + $ cd ~/ + $ curl -sH "Accept: text/turtle" -L http://dbpedia.org/resource/Amsterdam > adam.ttl + +We can find the corresponding web page using the `prov:wasDerivedFrom` relation as before. + + $ roqet -i sparql -e 'select ?o where {?s ?o}' -r csv --data adam.ttl + +The results of that query give us a wikipedia page url: http://en.wikipedia.org/wiki/Amsterdam?oldid=548577509 + +We can use the wikipedia-provenance tool to convert the revision history of the page into PROV. The following command retrieves the last 10 revisions starting at the given revision start id. + + $ java -jar ./wikipedia-provenance/target/wikipedia-provenance-0.0.5-jar-with-dependencies.jar -startid 548577509 -o . -pAmsterdam -r 10 + +With the output, using queries like the ones we've seen before we can extract who's involved in creating the Amsterdam wiki page (the responsibility view). + + $ roqet -i sparql -e 'select * where {?s a . ?s ?p ?o}' -r csv --data Amsterdam-startid548577509-r10-u1-d1.ttl + +This demonstrates that by using a common model for provenance, we can write historical queries that extend beyond the reach beyond one data source. This is particularly important when dealing with data on the web as it often involves munging data from multiple sources. + +* What other kinds of queries can we write against these two data sets? +* This dataset is rather large to visualize, could you extract a subset that can be visualized as a graph? + +# Reusing queries From 351cc1192bd491eae866bda5ff83b89bf056b8b4 Mon Sep 17 00:00:00 2001 From: Paul Groth Date: Tue, 19 Aug 2014 23:44:19 +0200 Subject: [PATCH 10/23] added a license --- LICENSE.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 LICENSE.md diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..f32806d --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,2 @@ +This work is licensed under the Creative Commons Attribution 4.0 International License. +To view a copy of this license, visit http://creativecommons.org/licenses/by/4.0/. From 2081beb2b318f0841bcf53381d4687057043b380 Mon Sep 17 00:00:00 2001 From: Paul Groth Date: Tue, 19 Aug 2014 23:45:46 +0200 Subject: [PATCH 11/23] updated to output .bashrc that selects java 7 --- bootstrap.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bootstrap.sh b/bootstrap.sh index e4138f3..0a13058 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -25,7 +25,7 @@ export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/ echo "export LC_ALL=en_US.UTF-8" >> .bashrc echo "export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/" >> .bashrc echo "export PATH=$PATH:/usr/local/bin/provToolbox/bin" >> .bashrc - +echo "update-alternatives --set java /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java" >> .bashrc curl -O http://search.maven.org/remotecontent?filepath=org/openprovenance/prov/toolbox/0.6.1/toolbox-0.6.1-release.zip unzip toolbox-0.6.1-release.zip From 288e6b2ac96bb748757f2b15d542c9618f6feaa7 Mon Sep 17 00:00:00 2001 From: Paul Groth Date: Sun, 24 Aug 2014 18:55:02 +0200 Subject: [PATCH 12/23] updated to add git2prov --- README.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/README.md b/README.md index a7c045c..52dc768 100644 --- a/README.md +++ b/README.md @@ -151,3 +151,32 @@ This demonstrates that by using a common model for provenance, we can write hist * This dataset is rather large to visualize, could you extract a subset that can be visualized as a graph? # Reusing queries +As we saw in the previous section, by expressing provenance information using a common model, we can use the same constructs to query over provenance from different data sources. In this section, we will apply our provenance to github - version histories for software. + +Here we'll use git2prov to convert this PROVTutorial repository to PROV. + + $ git2prov https://github.com/pgroth/PROVTutorial.git PROV-O > provtutorial-git.ttl + +Let's use the same query that we used with the wikipedia datasets to get all the agents involved: + + $ roqet -i sparql -e 'select * where {?s a . ?s ?p ?o}' -r csv --data provtutorial-git.ttl + +Let's do something more complicated. Let's find all the commits and their associated labels: + + $ roqet -i sparql -e 'select * where {?s a . ?s ?o}' -r csv --data provtutorial-git.ttl + +* What kind of queries would it be useful to run over source code version histories? + +You can also experiment with git2prov interactively. Run: + + $ git2prov-server + +On your local machine navigate to localhost:8080 + +In the GIT Repo field, enter the PROVTutorial github url. Click PROV-JSON + +Let's take a look at this in a json editor. (An online one is available at http://www.jsoneditoronline.org) + +* What are some constructs of interest or that you are curious about? + +An interesting thing here is that you can now use this an input to a web visualization tool or to work with programming languages that have JSON support. From 8a9e9037c4f0b770a11deca9b6fab593bf342b34 Mon Sep 17 00:00:00 2001 From: Paul Groth Date: Sun, 24 Aug 2014 19:13:25 +0200 Subject: [PATCH 13/23] added a section on where to find out more about prov --- README.md | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 52dc768..2d3007b 100644 --- a/README.md +++ b/README.md @@ -177,6 +177,23 @@ In the GIT Repo field, enter the PROVTutorial github url. Click PROV-JSON Let's take a look at this in a json editor. (An online one is available at http://www.jsoneditoronline.org) -* What are some constructs of interest or that you are curious about? An interesting thing here is that you can now use this an input to a web visualization tool or to work with programming languages that have JSON support. + +* What are some constructs of interest or that you are curious about? Can you figure out their usage and what they are for? + +# Finding out more + +## PROV Namespace page +All the constructs of PROV are defined in an open namespace. If you navigate to http://www.w3.org/ns/prov - you'll see how the terms that are defined by PROV, their English language definition, and links to their definition in the various specs. + +One nice thing is that the same page is also available in computer parsable formats through _content negotiation_. You can grab the XSD and OWL definitions of PROV from this page. Try it out by doing: + + $ curl -sH "Accept: application/xml" -L http://www.w3.org/ns/prov + +## Where to go next + +* The tutorials and books above can give you more background on the language and uses for the various constructs. +* If you're interested in programming with PROV, I suggest the [PROV Python Short Tutorial](http://nbviewer.ipython.org/github/trungdong/notebooks/blob/master/PROV%20Tutorial.ipynb) by Trung Dong Huynh +* For java fans: the [PROV toolbox](http://lucmoreau.github.io/ProvToolbox/) (installed with the VM) provides a whole API for dealing with PROV +* The [Provenance Store](https://provenance.ecs.soton.ac.uk/store/) provides a nice API for storing and retriving provenance. From f59aba4c304cbf70b03eaa51de04fe1e4a48a5c3 Mon Sep 17 00:00:00 2001 From: Paul Groth Date: Sun, 24 Aug 2014 19:25:01 +0200 Subject: [PATCH 14/23] project ideas --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 2d3007b..bc61039 100644 --- a/README.md +++ b/README.md @@ -197,3 +197,11 @@ One nice thing is that the same page is also available in computer parsable form * If you're interested in programming with PROV, I suggest the [PROV Python Short Tutorial](http://nbviewer.ipython.org/github/trungdong/notebooks/blob/master/PROV%20Tutorial.ipynb) by Trung Dong Huynh * For java fans: the [PROV toolbox](http://lucmoreau.github.io/ProvToolbox/) (installed with the VM) provides a whole API for dealing with PROV * The [Provenance Store](https://provenance.ecs.soton.ac.uk/store/) provides a nice API for storing and retriving provenance. + +# Some project ideas + +Here are some current ideas for projects to do with provenance: + +* Extend [NoWorkflow](https://github.com/gems-uff/noworkflow) to export PROV +* Do something cool with [the provenance for the National Climate Change Assessment 2014](https://data.globalchange.gov/report/nca3). +* Do something cool with the Gazette's - the UK's public record - provenance. Checkout [this blog post](http://lucmoreau.wordpress.com/2014/07/22/provenance-in-the-wild-provenance-at-the-gazette/) and the [DevDocs](https://github.com/TheGazette/DevDocs/blob/master/sparql/sample-queries.md) From 4714f699bba8f7172e5083f00dc71a3bfd5def10 Mon Sep 17 00:00:00 2001 From: Paul Groth Date: Sun, 24 Aug 2014 19:31:24 +0200 Subject: [PATCH 15/23] added another reference to a tutorial --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index bc61039..b6626ce 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ This tutorial is primarily focused on working with provenance from the web in a * [IPAW 2014](http://www.provbook.org/tutorial/provenanceweek2014/) - from a UML perspective; * [ESWC 2013](http://www.w3.org/2001/sw/wiki/ESWC2013ProvTutorial)- from a semantic web perspective; * [EDBT 2014](http://practicalprovenance.wordpress.com/2013/03/27/tutorial-prov/) - from a relational perspective. + * [Provenance Techniques for CRUD](http://devel.io/2014/08/22/provenance-techniques-for-crud/) - from a web app perspective * [PROV Python tutorial](https://github.com/trungdong/notebooks) #Prerequisites From c560534fe601a3007d5d4bc33a0496371cb203fd Mon Sep 17 00:00:00 2001 From: Paul Groth Date: Sun, 24 Aug 2014 19:43:28 +0200 Subject: [PATCH 16/23] added the author info --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index b6626ce..101264c 100644 --- a/README.md +++ b/README.md @@ -206,3 +206,6 @@ Here are some current ideas for projects to do with provenance: * Extend [NoWorkflow](https://github.com/gems-uff/noworkflow) to export PROV * Do something cool with [the provenance for the National Climate Change Assessment 2014](https://data.globalchange.gov/report/nca3). * Do something cool with the Gazette's - the UK's public record - provenance. Checkout [this blog post](http://lucmoreau.wordpress.com/2014/07/22/provenance-in-the-wild-provenance-at-the-gazette/) and the [DevDocs](https://github.com/TheGazette/DevDocs/blob/master/sparql/sample-queries.md) + +___ +prov:wasAttributedTo [Paul Groth](https://twitter.com/pgroth) From 1a3640e5acc486f04d3a0df70853e058d56193a1 Mon Sep 17 00:00:00 2001 From: Paul Groth Date: Tue, 26 Aug 2014 09:13:58 +0200 Subject: [PATCH 17/23] added jena --- bootstrap.sh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/bootstrap.sh b/bootstrap.sh index 0a13058..93a51b5 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -25,8 +25,15 @@ export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/ echo "export LC_ALL=en_US.UTF-8" >> .bashrc echo "export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/" >> .bashrc echo "export PATH=$PATH:/usr/local/bin/provToolbox/bin" >> .bashrc +echo "export JENAROOT=/usr/local/bin/apache-jena-2.12.0" >> .bashrc +echo "export PATH=$PATH:$JENAROOT/bin" >> .bashrc echo "update-alternatives --set java /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java" >> .bashrc +curl -O http://apache.websitebeheerjd.nl//jena/binaries/apache-jena-2.12.0.zip +unzip apache-jena-2.12.0.zip +sudo mv ./apache-jena-2.12.0 /usr/local/bin + + curl -O http://search.maven.org/remotecontent?filepath=org/openprovenance/prov/toolbox/0.6.1/toolbox-0.6.1-release.zip unzip toolbox-0.6.1-release.zip sudo mv ./provToolbox/ /usr/local/bin/ From c718b304f68fc65b21d177ebbae7b98ecfbbafc8 Mon Sep 17 00:00:00 2001 From: Paul Groth Date: Tue, 26 Aug 2014 10:12:40 +0200 Subject: [PATCH 18/23] updating paths --- bootstrap.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bootstrap.sh b/bootstrap.sh index 93a51b5..033370d 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -26,7 +26,7 @@ echo "export LC_ALL=en_US.UTF-8" >> .bashrc echo "export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/" >> .bashrc echo "export PATH=$PATH:/usr/local/bin/provToolbox/bin" >> .bashrc echo "export JENAROOT=/usr/local/bin/apache-jena-2.12.0" >> .bashrc -echo "export PATH=$PATH:$JENAROOT/bin" >> .bashrc +echo "export PATH=$PATH:/usr/local/bin/apache-jena-2.12.0/bin" >> .bashrc echo "update-alternatives --set java /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java" >> .bashrc curl -O http://apache.websitebeheerjd.nl//jena/binaries/apache-jena-2.12.0.zip From 72c0d1237be78b0d6f565aa98f928ca5bd352d72 Mon Sep 17 00:00:00 2001 From: Paul Groth Date: Tue, 26 Aug 2014 10:19:42 +0200 Subject: [PATCH 19/23] updating paths --- bootstrap.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/bootstrap.sh b/bootstrap.sh index 033370d..6a03622 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -24,9 +24,8 @@ export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/ echo "export LC_ALL=en_US.UTF-8" >> .bashrc echo "export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/" >> .bashrc -echo "export PATH=$PATH:/usr/local/bin/provToolbox/bin" >> .bashrc echo "export JENAROOT=/usr/local/bin/apache-jena-2.12.0" >> .bashrc -echo "export PATH=$PATH:/usr/local/bin/apache-jena-2.12.0/bin" >> .bashrc +echo "export PATH=$PATH:/usr/local/bin/provToolbox/bin:/usr/local/bin/apache-jena-2.12.0/bin" >> .bashrc echo "update-alternatives --set java /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java" >> .bashrc curl -O http://apache.websitebeheerjd.nl//jena/binaries/apache-jena-2.12.0.zip From 646f6ab665059991a7fe1e460a0525bf54528a6f Mon Sep 17 00:00:00 2001 From: Paul Groth Date: Tue, 26 Aug 2014 11:05:48 +0200 Subject: [PATCH 20/23] fixed a typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 101264c..b4ef37f 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ The VM also sets the appropriate environment variables.l # PROV Core Concepts -The figure below (taken from the [PROV Primer](http://www.w3.org/TR/prov-primer/)) shows the 3 core classes of PROV and how they are related. The PROV Primer provides more details and a working example. Here, will go with the basics so we can start querying datasets. +The figure below (taken from the [PROV Primer](http://www.w3.org/TR/prov-primer/)) shows the 3 core classes of PROV and how they are related. The PROV Primer provides more details and a working example. Here, we'll go with the basics so we can start querying datasets. ![PROV Core Concepts](http://www.w3.org/TR/prov-primer/images/key-concepts.png) From 55e3edb583eb010fae1cb35b9bac0be7160c46a9 Mon Sep 17 00:00:00 2001 From: Paul Groth Date: Tue, 26 Aug 2014 11:09:36 +0200 Subject: [PATCH 21/23] fixed more typos --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b4ef37f..c38afca 100644 --- a/README.md +++ b/README.md @@ -76,7 +76,7 @@ The figure below (taken from the [PROV Primer](http://www.w3.org/TR/prov-primer/ These three classes correspond to three views of provenance. -1. The _data flow view_ helsp us represent the flow of information within a system. Entities are the things we want to describe the provenance of (`prov:Entity`). Entities are derived from other entities (`prov:wasDerivedFrom`). For example, within a version control system, we would describe that each revision as an entity and the newer version was derived from the older revision. e.g. `:newer prov:wasRevisionOf :older` +1. The _data flow view_ helps us represent the flow of information within a system. Entities are the things we want to describe the provenance of (`prov:Entity`). Entities are derived from other entities (`prov:wasDerivedFrom`). For example, within a version control system, we would describe that each revision as an entity and the newer version was derived from the older revision. e.g. `:newer prov:wasRevisionOf :older` 2. The _process flow view_ helps us represent the processes that took place in a system and associated timing. `prov:Activity` denotes these processes. Activities are related to the information (i.e. entities) they take as input and generate as output. Represented respectively by `prov:used` and `prov:wasGeneratedBy`. For example, we might have a program such as curl take some input (a url) and generate some output (a downloaded web page). @@ -104,7 +104,7 @@ More importantly, you can convert to other serializations/file formats like JSON This is an important design decision behind PROV. It always one to interchange provenance between different common web formats. ### Querying -Now that we have a view of the example, let's see what we can acccess. Will look at the data flow of the example. First, we'll find all the Entity's using SPARQL. +Now that we have a view of the example, let's see what we can access. Will look at the data flow of the example. First, we'll find all the entities using SPARQL. $ roqet -i sparql -e 'select ?s where {?s a }' -r csv --data primer-example.ttl From 7979ec243feb05adc44db93f30ab9a25393305e8 Mon Sep 17 00:00:00 2001 From: Paul Groth Date: Tue, 26 Aug 2014 14:03:49 +0200 Subject: [PATCH 22/23] fixed a typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c38afca..e807801 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ #Welcome -[Data provenance](http://en.wikipedia.org/wiki/Provenance#Data_provenance) - information about entities, activities, and people involved in producing a piece of data or thing - is becoming a crucial component in information systems. Whether it's the version history of software ((like github) or maintaing attribution as documents are created (think [CC-BY](https://wiki.creativecommons.org/Best_practices_for_attribution)), provenance is becoming widely available. +[Data provenance](http://en.wikipedia.org/wiki/Provenance#Data_provenance) - information about entities, activities, and people involved in producing a piece of data or thing - is becoming a crucial component in information systems. Whether it's the version history of software ((like github) or maintaining attribution as documents are created (think [CC-BY](https://wiki.creativecommons.org/Best_practices_for_attribution)), provenance is becoming widely available. To help work with provenance coming from multiple different systems, the W3C specified a common model and serializations for provenance, [PROV](http://www.w3.org/TR/2013/NOTE-prov-overview-20130430/). From 45a653f5634663f20494ac8cf98ad7e398421f0b Mon Sep 17 00:00:00 2001 From: Paul Groth Date: Fri, 10 Oct 2014 15:52:53 +0200 Subject: [PATCH 23/23] added acknowledgements to funding sources Added acknowledgement to commit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index e807801..05769c6 100644 --- a/README.md +++ b/README.md @@ -209,3 +209,5 @@ Here are some current ideas for projects to do with provenance: ___ prov:wasAttributedTo [Paul Groth](https://twitter.com/pgroth) + +This project was supported by the Dutch national programme [COMMIT](http://www.commit-nl.nl) in the [Data2Semantics project](http://www.data2semantics.org) .