{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# PROV Python Library - A Short Tutorial" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The [PROV Python library](https://pypi.python.org/pypi/prov) is an implementation of the [Provenance Data Model](http://www.w3.org/TR/prov-dm/) by the World Wide Web Consortium. This tutorial shows how to use the library to:\n", "\n", "* create provenance statements in Python;\n", "* export the provenance to [PROV-N](http://www.w3.org/TR/prov-n/), [PROV-JSON](https://openprovenance.org/prov-json/), and graphical representations like PNG, SVG, PDF; and\n", "* store and retrieve provenance on [ProvStore](https://openprovenance.org/store/)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Installation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To install the prov library using [pip](http://pip.pypa.io/) with support for graphical exports:\n", "```bash\n", "pip install prov[dot]\n", "```\n", "Note: We recommend using [virtualenv](http://virtualenv.readthedocs.org/) (and the excellent companion [virtualenvwrapper](http://virtualenvwrapper.readthedocs.org/)) to avoid package version conflicts. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you want to open [this notebook](https://raw.githubusercontent.com/trungdong/notebooks/master/PROV%20Tutorial.ipynb) and run it locally, install [Jupyter notebook](https://jupyter.readthedocs.io/en/latest/content-quickstart.html) (in the same virtualenv) and start the notebook server in the folder where this notebook is saved:\n", "```bash\n", "pip install jupyter\n", "jupyter notebook\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Create a simple provenance document" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this tutorial, we use the Data Journalism example from [Provenance: An Introduction to PROV](http://www.provbook.org/) by [Luc Moreau](https://nms.kcl.ac.uk/luc.moreau/) and [Paul Groth](http://pgroth.com/). If you do not have access to the book, you can find the example from the [slides](http://www.provbook.org/tutorial/provenanceweek2014/prov-tutorial.pptx) by Luc and Paul (starting from slide #15). Please familarise yourself with the example and relevant PROV concepts (i.e. [entity](http://www.w3.org/TR/prov-primer/#entities), [activity](http://www.w3.org/TR/prov-primer/#activities), [agent](http://www.w3.org/TR/prov-primer/#agents-and-responsibility), ...) before proceeding with this tutorial." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To create a provenance document (a package of provenance statements or assertions), import `ProvDocument` class from `prov.model`:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from prov.model import ProvDocument" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# Create a new provenance document\n", "d1 = ProvDocument() # d1 is now an empty provenance document" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Before asserting provenance statements, we need to have a way to refer to the \"things\" we want to describe provenance (e.g. articles, data sets, people). For that purpose, PROV uses [qualified names](http://www.w3.org/TR/prov-dm/#term-identifier) to identify things, which essentially a shortened representation of a [URI](http://en.wikipedia.org/wiki/Uniform_resource_identifier) in the form of `prefix:localpart`. Valid qualified names require their prefixes defined, which we is going to do next." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Declaring namespaces for various prefixes used in the example\n", "d1.add_namespace('now', 'http://www.provbook.org/nownews/')\n", "d1.add_namespace('nowpeople', 'http://www.provbook.org/nownews/people/')\n", "d1.add_namespace('bk', 'http://www.provbook.org/ns/#')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we can create things like entities, agents and relate them with one another in a PROV document." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Entity: now:employment-article-v1.html\n", "e1 = d1.entity('now:employment-article-v1.html')\n", "# Agent: nowpeople:Bob\n", "d1.agent('nowpeople:Bob')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The first statement above create an entity referred to as `now:employment-article-v1.html`, which is the first version of the article about employment in our example. Note that although we provided a string as the entity's identifier, since `now` is a registered prefix, the library *automatically* convert the string into a valid qualified name. The newly created entity is assigned to `e1`.\n", "\n", "Similarly, the second statement create an agent called `nowpeople:Bob`. Apart from the `d1.` part at the begining of each Python statement, these statements closely resemble the correstponding PROV-N statements to assert the same information. This is a principle we followed when designing the prov library, as can be seen throughout this tutorial." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Attributing the article to the agent\n", "d1.wasAttributedTo(e1, 'nowpeople:Bob')" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "document\n", " prefix now \n", " prefix nowpeople \n", " prefix bk \n", " \n", " entity(now:employment-article-v1.html)\n", " agent(nowpeople:Bob)\n", " wasAttributedTo(now:employment-article-v1.html, nowpeople:Bob)\n", "endDocument\n" ] } ], "source": [ "# What we have so far (in PROV-N)\n", "print(d1.get_provn())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can add more to our simple document. The following adds a new entity `govftp:oesm11st.zip`, which is a `void:Dataset` and has the label `employment-stats-2011`. The entity's type and label are domain-specific information; similar information can be added to any record as the last argument of a statement (or as a keyword argument `other_attributes`).\n", "\n", "The last statement below then asserts that the article `now:employment-article-v1.html` was derived from the data set." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# add more namespace declarations\n", "d1.add_namespace('govftp', 'ftp://ftp.bls.gov/pub/special.requests/oes/')\n", "d1.add_namespace('void', 'http://vocab.deri.ie/void#')\n", "\n", "# 'now:employment-article-v1.html' was derived from at dataset at govftp\n", "d1.entity('govftp:oesm11st.zip', {'prov:label': 'employment-stats-2011', 'prov:type': 'void:Dataset'})\n", "d1.wasDerivedFrom('now:employment-article-v1.html', 'govftp:oesm11st.zip')" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "document\n", " prefix now \n", " prefix nowpeople \n", " prefix bk \n", " prefix govftp \n", " prefix void \n", " \n", " entity(now:employment-article-v1.html)\n", " agent(nowpeople:Bob)\n", " wasAttributedTo(now:employment-article-v1.html, nowpeople:Bob)\n", " entity(govftp:oesm11st.zip, [prov:label=\"employment-stats-2011\", prov:type=\"void:Dataset\"])\n", " wasDerivedFrom(now:employment-article-v1.html, govftp:oesm11st.zip, -, -, -)\n", "endDocument\n" ] } ], "source": [ "print(d1.get_provn())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Following the example, we further extend the document with an activity, a usage, and a generation statement." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Adding an activity\n", "d1.add_namespace('is', 'http://www.provbook.org/nownews/is/#')\n", "d1.activity('is:writeArticle')" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Usage and Generation\n", "d1.used('is:writeArticle', 'govftp:oesm11st.zip')\n", "d1.wasGeneratedBy('now:employment-article-v1.html', 'is:writeArticle')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Graphics export (PNG and PDF)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In addition to the PROV-N output (as above), the document can be exported into a graphical representation with the help of the [GraphViz](http://www.graphviz.org/). It is provided as a software package in popular Linux distributions, or can be [downloaded](http://www.graphviz.org/download/) for Windows and Mac.\n", "\n", "Once you have GraphViz installed and the `dot` command available in your operating system's paths, you can save the document we have so far into a PNG file as follows." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "# visualize the graph\n", "from prov.dot import prov_to_dot\n", "dot = prov_to_dot(d1)\n", "dot.write_png('article-prov.png')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The above saves the PNG file as `article-prov.png` in your current folder. If you're runing this tutorial in Jupyter Notebook, you can see it here as well." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import Image\n", "Image('article-prov.png')" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "# Or save to a PDF\n", "dot.write_pdf('article-prov.pdf')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Similarly, the above saves the document into a PDF file in your current working folder. Graphviz supports a wide ranges of [raster and vector outputs](http://www.graphviz.org/doc/info/output.html), to which you can export your provenance documents created by the library. To find out what formats are available from your version, run `dot -T?` at the command line." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## PROV-JSON export" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[PROV-JSON](https://provenance.ecs.soton.ac.uk/prov-json/) is a JSON representation for PROV that was designed for the ease of accessing various PROV elements in a PROV document and to work well with web applications. The format is natively supported by the library and is its default serialisation format." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{\n", " \"prefix\": {\n", " \"now\": \"http://www.provbook.org/nownews/\",\n", " \"nowpeople\": \"http://www.provbook.org/nownews/people/\",\n", " \"bk\": \"http://www.provbook.org/ns/#\",\n", " \"govftp\": \"ftp://ftp.bls.gov/pub/special.requests/oes/\",\n", " \"void\": \"http://vocab.deri.ie/void#\",\n", " \"is\": \"http://www.provbook.org/nownews/is/#\"\n", " },\n", " \"entity\": {\n", " \"now:employment-article-v1.html\": {},\n", " \"govftp:oesm11st.zip\": {\n", " \"prov:label\": \"employment-stats-2011\",\n", " \"prov:type\": \"void:Dataset\"\n", " }\n", " },\n", " \"agent\": {\n", " \"nowpeople:Bob\": {}\n", " },\n", " \"wasAttributedTo\": {\n", " \"_:id1\": {\n", " \"prov:entity\": \"now:employment-article-v1.html\",\n", " \"prov:agent\": \"nowpeople:Bob\"\n", " }\n", " },\n", " \"wasDerivedFrom\": {\n", " \"_:id2\": {\n", " \"prov:generatedEntity\": \"now:employment-article-v1.html\",\n", " \"prov:usedEntity\": \"govftp:oesm11st.zip\"\n", " }\n", " },\n", " \"activity\": {\n", " \"is:writeArticle\": {}\n", " },\n", " \"used\": {\n", " \"_:id3\": {\n", " \"prov:activity\": \"is:writeArticle\",\n", " \"prov:entity\": \"govftp:oesm11st.zip\"\n", " }\n", " },\n", " \"wasGeneratedBy\": {\n", " \"_:id4\": {\n", " \"prov:entity\": \"now:employment-article-v1.html\",\n", " \"prov:activity\": \"is:writeArticle\"\n", " }\n", " }\n", "}\n" ] } ], "source": [ "print(d1.serialize(indent=2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can also serialize the document directly to a file by providing a filename (below) or a Python File object." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "d1.serialize('article-prov.json')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## XML and RDF Support" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The library also supports XML and RDF serialisations for PROV (see [PROV-XML](https://www.w3.org/TR/prov-xml/) and [PROV-O](https://www.w3.org/TR/prov-o/) for more information).\n", "\n", "We just need to specify the format that we require during export and import, as shown below." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "d1.serialize('article-prov.xml', format='xml')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For RDF export, we also need to specify a specific RDF serialisation. We use the [Turtle format](https://www.w3.org/TR/turtle/) in this case. For the list of supported RDF serialisations, please refer to the [RDFLib documentation](https://rdflib.readthedocs.io/)." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "d1.serialize('article-prov.ttl', format='rdf', rdf_format='ttl')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Store and retrieve provenance documents from ProvStore" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Having the created a provenance document, you can upload it to [ProvStore](https://openprovenance.org/store/), a free repository for provenance documents, to share it publicly/privately, or simply just to store and retrieve it back at a later time.\n", "In addition to storage and sharing, you can also retrieve your documents on ProvStore in further formats like XML and RDF, transform, and/or visualise them in various ways (see [this poster](http://eprints.soton.ac.uk/365509/) for examples).\n", "\n", "Before storing your document there, you need to [register for an account](https://openprovenance.org/store/). You can then upload the PROV-N or PROV-JSON export above via ProvStore's website. However, if you [generated an API Key](https://openprovenance.org/store/account/developer/) for your account, you can also upload the document there directly from this tutorial as shown below.\n", "\n", "A wrapper for [ProvStore's REST API](https://openprovenance.org/store/help/api/) is provided by the package [provstore-api](https://github.com/millar/provstore-api#installation). Please follow the [installation instructions](https://github.com/millar/provstore-api#installation) there before proceeding." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "# Configure ProvStore API Wrapper with your API Key\n", "from provstore.api import Api\n", "# see your API key at https://openprovenance.org/store/account/developer/\n", "api = Api(base_url='https://openprovenance.org/store/api/v0', username='', api_key='')" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/html": [ "Open your new provenance document on ProvStore" ], "text/plain": [ "" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Submit the document to ProvStore\n", "provstore_document = api.document.create(d1, name='article-prov', public=True)\n", "\n", "# Generate a nice link to the document on ProvStore so you don't have to find it manually \n", "from IPython.display import HTML\n", "document_uri = provstore_document.url\n", "HTML('Open your new provenance document on ProvStore' % document_uri)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The first statement above submit the document `d1` to ProvStore, giving it a name (required) and making it visible to everyone (optional and private by default). Clicking on the link generated will open the page on ProvStore for the document you just submitted." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The returned object is a wrapper for the document on ProvStore identified by `provstore_document.id`, with which you can, of course, retrieve the document again from ProvStore." ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Retrieve it back\n", "retrieved_document = api.document.get(provstore_document.id)\n", "d2 = retrieved_document.prov\n", "d1 == d2 # Is it the same document we submitted?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can also remove the document from ProvStore via its API. It is a good idea to leave your account there nice and tidy anyway." ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Cleaning up, delete the document\n", "retrieved_document.delete()" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "ename": "NotFoundException", "evalue": "", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNotFoundException\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# Just to be sure, trying to retrieve it again\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mapi\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdocument\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mprovstore_document\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# the document is no longer there\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m~/.local/share/virtualenvs/notebooks-ARZns7m6/lib/python3.7/site-packages/provstore/document.py\u001b[0m in \u001b[0;36mget\u001b[0;34m(self, document_id)\u001b[0m\n\u001b[1;32m 130\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mImmutableDocumentException\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 131\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 132\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdocument_id\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 133\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 134\u001b[0m \u001b[0;31m# Instance methods\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/.local/share/virtualenvs/notebooks-ARZns7m6/lib/python3.7/site-packages/provstore/document.py\u001b[0m in \u001b[0;36mread\u001b[0;34m(self, document_id)\u001b[0m\n\u001b[1;32m 145\u001b[0m \u001b[0;34m:\u001b[0m\u001b[0;32mreturn\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 146\u001b[0m \"\"\"\n\u001b[0;32m--> 147\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_prov\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdocument_id\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 148\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_meta\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 149\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/.local/share/virtualenvs/notebooks-ARZns7m6/lib/python3.7/site-packages/provstore/document.py\u001b[0m in \u001b[0;36mread_prov\u001b[0;34m(self, document_id)\u001b[0m\n\u001b[1;32m 178\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mAbstractDocumentException\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 179\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 180\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_prov\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_api\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_document_prov\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 181\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_prov\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 182\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/.local/share/virtualenvs/notebooks-ARZns7m6/lib/python3.7/site-packages/provstore/api.py\u001b[0m in \u001b[0;36mget_document_prov\u001b[0;34m(self, document_id, prov_format)\u001b[0m\n\u001b[1;32m 96\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 97\u001b[0m r = self._request('get', self.base_url + \"/documents/%i.%s\" % (document_id, extension),\n\u001b[0;32m---> 98\u001b[0;31m headers=self.headers)\n\u001b[0m\u001b[1;32m 99\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 100\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mprov_format\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mProvDocument\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/.local/share/virtualenvs/notebooks-ARZns7m6/lib/python3.7/site-packages/provstore/api.py\u001b[0m in \u001b[0;36m_request\u001b[0;34m(self, method, *args, **kwargs)\u001b[0m\n\u001b[1;32m 78\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 79\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstatus_code\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m404\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 80\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mNotFoundException\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 81\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 82\u001b[0m \u001b[0;31m# Fallback\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mNotFoundException\u001b[0m: " ] } ], "source": [ "# Just to be sure, trying to retrieve it again\n", "api.document.get(provstore_document.id) # the document is no longer there" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Further reading" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There it is, through a very short tutorial, you have managed to create a provenance document, export it, and store it on the cloud. Simple!\n", "\n", "If you want to find out more about how to use the library and ProvStore, here are some references:\n", "* [Prov Python library's documentation](http://prov.readthedocs.io/)\n", "* [ProvStore's API documentation](https://openprovenance.org/store/help/api/)\n", "* Book: [Provenance: An Introduction to PROV](http://www.provbook.org/)\n", "* [Overview of the PROV standards](http://www.w3.org/TR/prov-overview/)\n", "\n", "Finally, if you have issues with the Prov Python library, please report them at our [issue tracker on Github](https://github.com/trungdong/prov/issues)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\"Creative
PROV Python Library - A Short Tutorial by Trung Dong Huynh is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.0" } }, "nbformat": 4, "nbformat_minor": 1 }