Repository: fair-workflows/fairworkflows (language: python)

Issue:
Improve StepRetroProv & WorkflowRetroProv
- [x] Get rid of dc:language
- [x] Add more triples to RDF
Edit: Moved 'Add documentation' to its own issue: #187 


Discussion / hints:

Fix patch:
diff --git a/CITATION.cff b/CITATION.cff
index b4665fc..d6622c9 100644
--- a/CITATION.cff
+++ b/CITATION.cff
@@ -27,4 +27,4 @@ keywords:
 license: "Apache-2.0"
 message: "If you use this software, please cite it using these metadata."
 title: "fairworkflows: A python library for handling semantically described scientific workflows"
-version: "0.2.4"
+version: "0.2.5"
diff --git a/examples/noodles_fw.ipynb b/examples/noodles_fw.ipynb
index 72f1ffe..bacf7fe 100644
--- a/examples/noodles_fw.ipynb
+++ b/examples/noodles_fw.ipynb
@@ -2,7 +2,7 @@
  "cells": [
   {
    "cell_type": "markdown",
-   "id": "careful-translator",
+   "id": "packed-ancient",
    "metadata": {},
    "source": [
     "# FairWorkflows execution demo"
@@ -10,7 +10,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "indian-welcome",
+   "id": "pretty-extraction",
    "metadata": {},
    "source": [
     "## Define the steps of your workflow\n",
@@ -19,8 +19,8 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
-   "id": "touched-representation",
+   "execution_count": 18,
+   "id": "successful-damage",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -29,8 +29,8 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 17,
-   "id": "increasing-update",
+   "execution_count": 19,
+   "id": "pretty-timeline",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -42,8 +42,8 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 18,
-   "id": "increasing-likelihood",
+   "execution_count": 20,
+   "id": "abandoned-communist",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -55,8 +55,8 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 19,
-   "id": "center-destruction",
+   "execution_count": 21,
+   "id": "flying-digit",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -68,8 +68,8 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 20,
-   "id": "antique-bandwidth",
+   "execution_count": 22,
+   "id": "hourly-truth",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -82,7 +82,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "guided-chance",
+   "id": "institutional-average",
    "metadata": {},
    "source": [
     "## Define your workflow using @fairworkflow\n",
@@ -91,8 +91,8 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 21,
-   "id": "photographic-breathing",
+   "execution_count": 23,
+   "id": "present-nowhere",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -109,7 +109,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "recreational-disease",
+   "id": "heated-disco",
    "metadata": {},
    "source": [
     "## Create an instance of your workflow and display it"
@@ -117,8 +117,8 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 22,
-   "id": "suspended-afternoon",
+   "execution_count": 24,
+   "id": "fiscal-being",
    "metadata": {},
    "outputs": [
     {
@@ -127,7 +127,7 @@
        "fairworkflows.fairworkflow.FairWorkflow"
       ]
      },
-     "execution_count": 22,
+     "execution_count": 24,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -139,8 +139,8 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 23,
-   "id": "subsequent-empty",
+   "execution_count": 8,
+   "id": "dependent-hindu",
    "metadata": {},
    "outputs": [
     {
@@ -148,47 +148,47 @@
       "image/svg+xml": [
        "<svg height=\"218pt\" viewBox=\"0.00 0.00 141.55 218.00\" width=\"142pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
        "<g class=\"graph\" id=\"graph0\" transform=\"scale(1 1) rotate(0) translate(4 214)\">\n",
-       "<!-- 140704616484752 -->\n",
+       "<!-- 140398481096784 -->\n",
        "<g class=\"node\" id=\"node1\">\n",
-       "<title>140704616484752</title>\n",
+       "<title>140398481096784</title>\n",
        "<ellipse cx=\"68.55\" cy=\"-18\" fill=\"none\" rx=\"27\" ry=\"18\" stroke=\"black\"/>\n",
        "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"68.55\" y=\"-14.3\">mul</text>\n",
        "</g>\n",
-       "<!-- 140704616535120 -->\n",
+       "<!-- 140398498145360 -->\n",
        "<g class=\"node\" id=\"node2\">\n",
-       "<title>140704616535120</title>\n",
+       "<title>140398498145360</title>\n",
        "<ellipse cx=\"30.55\" cy=\"-105\" fill=\"none\" rx=\"30.59\" ry=\"18\" stroke=\"black\"/>\n",
        "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"30.55\" y=\"-101.3\">weird</text>\n",
        "</g>\n",
-       "<!-- 140704616535120&#45;&gt;140704616484752 -->\n",
+       "<!-- 140398498145360&#45;&gt;140398481096784 -->\n",
        "<g class=\"edge\" id=\"edge1\">\n",
-       "<title>140704616535120-&gt;140704616484752</title>\n",
+       "<title>140398498145360-&gt;140398481096784</title>\n",
        "<path d=\"M38.05,-87.21C43.45,-75.14 50.83,-58.64 56.97,-44.89\" fill=\"none\" stroke=\"black\"/>\n",
        "<polygon fill=\"black\" points=\"60.3,-46.03 61.18,-35.47 53.91,-43.17 60.3,-46.03\" stroke=\"black\"/>\n",
        "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"56.05\" y=\"-57.8\">a</text>\n",
        "</g>\n",
-       "<!-- 140704617274960 -->\n",
+       "<!-- 140398498035984 -->\n",
        "<g class=\"node\" id=\"node3\">\n",
-       "<title>140704617274960</title>\n",
+       "<title>140398498035984</title>\n",
        "<ellipse cx=\"30.55\" cy=\"-192\" fill=\"none\" rx=\"27\" ry=\"18\" stroke=\"black\"/>\n",
        "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"30.55\" y=\"-188.3\">add</text>\n",
        "</g>\n",
-       "<!-- 140704617274960&#45;&gt;140704616535120 -->\n",
+       "<!-- 140398498035984&#45;&gt;140398498145360 -->\n",
        "<g class=\"edge\" id=\"edge2\">\n",
-       "<title>140704617274960-&gt;140704616535120</title>\n",
+       "<title>140398498035984-&gt;140398498145360</title>\n",
        "<path d=\"M30.55,-173.8C30.55,-162.16 30.55,-146.55 30.55,-133.24\" fill=\"none\" stroke=\"black\"/>\n",
        "<polygon fill=\"black\" points=\"34.05,-133.18 30.55,-123.18 27.05,-133.18 34.05,-133.18\" stroke=\"black\"/>\n",
        "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"34.05\" y=\"-144.8\">a</text>\n",
        "</g>\n",
-       "<!-- 140704616535504 -->\n",
+       "<!-- 140398498036240 -->\n",
        "<g class=\"node\" id=\"node4\">\n",
-       "<title>140704616535504</title>\n",
+       "<title>140398498036240</title>\n",
        "<ellipse cx=\"106.55\" cy=\"-105\" fill=\"none\" rx=\"27\" ry=\"18\" stroke=\"black\"/>\n",
        "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"106.55\" y=\"-101.3\">sub</text>\n",
        "</g>\n",
-       "<!-- 140704616535504&#45;&gt;140704616484752 -->\n",
+       "<!-- 140398498036240&#45;&gt;140398481096784 -->\n",
        "<g class=\"edge\" id=\"edge3\">\n",
-       "<title>140704616535504-&gt;140704616484752</title>\n",
+       "<title>140398498036240-&gt;140398481096784</title>\n",
        "<path d=\"M99.22,-87.61C93.81,-75.5 86.33,-58.77 80.11,-44.86\" fill=\"none\" stroke=\"black\"/>\n",
        "<polygon fill=\"black\" points=\"83.13,-43.04 75.85,-35.34 76.74,-45.9 83.13,-43.04\" stroke=\"black\"/>\n",
        "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"93.05\" y=\"-57.8\">b</text>\n",
@@ -210,8 +210,8 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 24,
-   "id": "accurate-motivation",
+   "execution_count": 9,
+   "id": "instrumental-carbon",
    "metadata": {},
    "outputs": [
     {
@@ -223,361 +223,361 @@
        "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n",
        " -->\n",
        "<!-- Pages: 1 -->\n",
-       "<svg width=\"1910pt\" height=\"565pt\"\n",
-       " viewBox=\"0.00 0.00 1910.00 565.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
+       "<svg width=\"1898pt\" height=\"565pt\"\n",
+       " viewBox=\"0.00 0.00 1898.00 565.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
        "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 561)\">\n",
-       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-561 1906,-561 1906,4 -4,4\"/>\n",
-       "<!-- node0 -->\n",
+       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-561 1894,-561 1894,4 -4,4\"/>\n",
+       "<!-- node1 -->\n",
        "<g id=\"node1\" class=\"node\">\n",
-       "<title>node0</title>\n",
-       "<polygon fill=\"grey\" stroke=\"transparent\" points=\"513.5,-133.5 513.5,-152.5 693.5,-152.5 693.5,-133.5 513.5,-133.5\"/>\n",
-       "<text text-anchor=\"start\" x=\"580.5\" y=\"-140.3\" font-family=\"DejaVu Sans\" font-weight=\"bold\" font-size=\"14.00\">python</text>\n",
-       "<g id=\"a_node1_0\"><a xlink:href=\"LinguisticSystem\" xlink:title=\"&lt;TABLE&gt;\">\n",
-       "<polygon fill=\"#eeeeee\" stroke=\"transparent\" points=\"513.5,-118.5 513.5,-133.5 693.5,-133.5 693.5,-118.5 513.5,-118.5\"/>\n",
-       "<text text-anchor=\"start\" x=\"565.5\" y=\"-123.5\" font-family=\"DejaVu Sans\" font-size=\"10.00\" fill=\"#6666ff\">LinguisticSystem</text>\n",
+       "<title>node1</title>\n",
+       "<polygon fill=\"grey\" stroke=\"transparent\" points=\"9.5,-247.5 9.5,-266.5 1392.5,-266.5 1392.5,-247.5 9.5,-247.5\"/>\n",
+       "<text text-anchor=\"start\" x=\"658.5\" y=\"-254.3\" font-family=\"DejaVu Sans\" font-weight=\"bold\" font-size=\"14.00\">My Workflow</text>\n",
+       "<g id=\"a_node1_0\"><a xlink:href=\"plan\" xlink:title=\"&lt;TABLE&gt;\">\n",
+       "<polygon fill=\"#eeeeee\" stroke=\"transparent\" points=\"9.5,-232.5 9.5,-247.5 1392.5,-247.5 1392.5,-232.5 9.5,-232.5\"/>\n",
+       "<text text-anchor=\"start\" x=\"691.5\" y=\"-237.5\" font-family=\"DejaVu Sans\" font-size=\"10.00\" fill=\"#6666ff\">plan</text>\n",
        "</a>\n",
        "</g>\n",
-       "<text text-anchor=\"start\" x=\"515.5\" y=\"-105.3\" font-family=\"DejaVu Sans\" font-size=\"14.00\">owl:versionInfo</text>\n",
-       "<text text-anchor=\"start\" x=\"610.5\" y=\"-105.3\" font-family=\"DejaVu Sans\" font-size=\"14.00\">&quot;3.7.9.final.0&quot;</text>\n",
-       "<polygon fill=\"none\" stroke=\"#666666\" points=\"512.5,-99 512.5,-154 694.5,-154 694.5,-99 512.5,-99\"/>\n",
+       "<text text-anchor=\"start\" x=\"11.5\" y=\"-219.3\" font-family=\"DejaVu Sans\" font-size=\"14.00\">dc:description</text>\n",
+       "<text text-anchor=\"start\" x=\"99.5\" y=\"-219.3\" font-family=\"DejaVu Sans\" font-size=\"14.00\">&quot;@is_fairworkflow(label=&#39;My Workflow&#39;)def my_workflow(in1, in2, in3): &#160;&#160;&#160;&quot;&quot;&quot; &#160;&#160;&#160;A simple addition, subtraction, multiplication workflow &#160;&#160;&#160;&quot;&quot;&quot; &#160;&#160;&#160;t1 = add(in1, in2) &#160;&#160;&#160;t2 = sub(in1, in2) &#160;&#160;&#160;t3 = mul(weird(t1, in3), t2) &#160;&#160;&#160;return t3&quot;</text>\n",
+       "<polygon fill=\"none\" stroke=\"#666666\" points=\"8,-213 8,-268 1393,-268 1393,-213 8,-213\"/>\n",
        "</g>\n",
-       "<!-- node1 -->\n",
+       "<!-- node2 -->\n",
        "<g id=\"node2\" class=\"node\">\n",
-       "<title>node1</title>\n",
-       "<polygon fill=\"grey\" stroke=\"transparent\" points=\"237.5,-20 237.5,-39 644.5,-39 644.5,-20 237.5,-20\"/>\n",
-       "<text text-anchor=\"start\" x=\"239.5\" y=\"-26.8\" font-family=\"DejaVu Sans\" font-weight=\"bold\" font-size=\"14.00\">https://en.wikipedia.org/wiki/Python_(programming_language)</text>\n",
-       "<g id=\"a_node2_1\"><a xlink:href=\"https://en.wikipedia.org/wiki/Python_(programming_language)\" xlink:title=\"&lt;TABLE&gt;\">\n",
-       "<polygon fill=\"#eeeeee\" stroke=\"transparent\" points=\"237.5,-5 237.5,-20 644.5,-20 644.5,-5 237.5,-5\"/>\n",
-       "<text text-anchor=\"start\" x=\"307\" y=\"-10\" font-family=\"DejaVu Sans\" font-size=\"10.00\" fill=\"#6666ff\">https://en.wikipedia.org/wiki/Python_(programming_language)</text>\n",
+       "<title>node2</title>\n",
+       "<polygon fill=\"grey\" stroke=\"transparent\" points=\"602.5,-124.5 602.5,-143.5 735.5,-143.5 735.5,-124.5 602.5,-124.5\"/>\n",
+       "<text text-anchor=\"start\" x=\"654.5\" y=\"-131.3\" font-family=\"DejaVu Sans\" font-weight=\"bold\" font-size=\"14.00\">Plan</text>\n",
+       "<g id=\"a_node2_1\"><a xlink:href=\"http://purl.org/net/p-plan#Plan\" xlink:title=\"&lt;TABLE&gt;\">\n",
+       "<polygon fill=\"#eeeeee\" stroke=\"transparent\" points=\"602.5,-109.5 602.5,-124.5 735.5,-124.5 735.5,-109.5 602.5,-109.5\"/>\n",
+       "<text text-anchor=\"start\" x=\"604.5\" y=\"-114.5\" font-family=\"DejaVu Sans\" font-size=\"10.00\" fill=\"#6666ff\">http://purl.org/net/p&#45;plan#Plan</text>\n",
        "</a>\n",
        "</g>\n",
-       "<polygon fill=\"none\" stroke=\"#666666\" points=\"236,-4 236,-40 645,-40 645,-4 236,-4\"/>\n",
+       "<polygon fill=\"none\" stroke=\"#666666\" points=\"601,-108.5 601,-144.5 736,-144.5 736,-108.5 601,-108.5\"/>\n",
        "</g>\n",
-       "<!-- node0&#45;&gt;node1 -->\n",
+       "<!-- node1&#45;&gt;node2 -->\n",
        "<g id=\"edge1\" class=\"edge\">\n",
-       "<title>node0&#45;&gt;node1</title>\n",
-       "<path fill=\"none\" stroke=\"BLACK\" d=\"M554.59,-94.75C531.66,-80.33 504.61,-63.31 482.6,-49.48\"/>\n",
-       "<polygon fill=\"BLACK\" stroke=\"BLACK\" points=\"484.46,-46.51 474.13,-44.15 480.73,-52.43 484.46,-46.51\"/>\n",
-       "<text text-anchor=\"start\" x=\"522.5\" y=\"-66.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
-       "<text text-anchor=\"start\" x=\"526.5\" y=\"-66.8\" font-family=\"Times,serif\" font-size=\"10.00\" fill=\"#336633\">rdfs:seeAlso</text>\n",
-       "<text text-anchor=\"start\" x=\"577.5\" y=\"-66.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
+       "<title>node1&#45;&gt;node2</title>\n",
+       "<path fill=\"none\" stroke=\"BLACK\" d=\"M691.76,-208.9C687.26,-193.17 681.8,-174.05 677.3,-158.3\"/>\n",
+       "<polygon fill=\"BLACK\" stroke=\"BLACK\" points=\"680.61,-157.15 674.5,-148.5 673.88,-159.08 680.61,-157.15\"/>\n",
+       "<text text-anchor=\"start\" x=\"686.5\" y=\"-180.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
+       "<text text-anchor=\"start\" x=\"690.5\" y=\"-180.8\" font-family=\"Times,serif\" font-size=\"10.00\" fill=\"#336633\">rdf:type</text>\n",
+       "<text text-anchor=\"start\" x=\"723.5\" y=\"-180.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
        "</g>\n",
-       "<!-- node16 -->\n",
-       "<g id=\"node17\" class=\"node\">\n",
-       "<title>node16</title>\n",
-       "<polygon fill=\"grey\" stroke=\"transparent\" points=\"680.5,-20 680.5,-39 854.5,-39 854.5,-20 680.5,-20\"/>\n",
-       "<text text-anchor=\"start\" x=\"703\" y=\"-26.8\" font-family=\"DejaVu Sans\" font-weight=\"bold\" font-size=\"14.00\">ComputerLanguage</text>\n",
-       "<g id=\"a_node17_2\"><a xlink:href=\"https://schema.org/ComputerLanguage\" xlink:title=\"&lt;TABLE&gt;\">\n",
-       "<polygon fill=\"#eeeeee\" stroke=\"transparent\" points=\"680.5,-5 680.5,-20 854.5,-20 854.5,-5 680.5,-5\"/>\n",
-       "<text text-anchor=\"start\" x=\"682.5\" y=\"-10\" font-family=\"DejaVu Sans\" font-size=\"10.00\" fill=\"#6666ff\">https://schema.org/ComputerLanguage</text>\n",
+       "<!-- node0 -->\n",
+       "<g id=\"node5\" class=\"node\">\n",
+       "<title>node0</title>\n",
+       "<polygon fill=\"grey\" stroke=\"transparent\" points=\"771.5,-133.5 771.5,-152.5 951.5,-152.5 951.5,-133.5 771.5,-133.5\"/>\n",
+       "<text text-anchor=\"start\" x=\"838.5\" y=\"-140.3\" font-family=\"DejaVu Sans\" font-weight=\"bold\" font-size=\"14.00\">python</text>\n",
+       "<g id=\"a_node5_2\"><a xlink:href=\"LinguisticSystem\" xlink:title=\"&lt;TABLE&gt;\">\n",
+       "<polygon fill=\"#eeeeee\" stroke=\"transparent\" points=\"771.5,-118.5 771.5,-133.5 951.5,-133.5 951.5,-118.5 771.5,-118.5\"/>\n",
+       "<text text-anchor=\"start\" x=\"823.5\" y=\"-123.5\" font-family=\"DejaVu Sans\" font-size=\"10.00\" fill=\"#6666ff\">LinguisticSystem</text>\n",
        "</a>\n",
        "</g>\n",
-       "<polygon fill=\"none\" stroke=\"#666666\" points=\"679.5,-4 679.5,-40 855.5,-40 855.5,-4 679.5,-4\"/>\n",
+       "<text text-anchor=\"start\" x=\"773.5\" y=\"-105.3\" font-family=\"DejaVu Sans\" font-size=\"14.00\">owl:versionInfo</text>\n",
+       "<text text-anchor=\"start\" x=\"868.5\" y=\"-105.3\" font-family=\"DejaVu Sans\" font-size=\"14.00\">&quot;3.7.9.final.0&quot;</text>\n",
+       "<polygon fill=\"none\" stroke=\"#666666\" points=\"770.5,-99 770.5,-154 952.5,-154 952.5,-99 770.5,-99\"/>\n",
        "</g>\n",
-       "<!-- node0&#45;&gt;node16 -->\n",
-       "<g id=\"edge13\" class=\"edge\">\n",
-       "<title>node0&#45;&gt;node16</title>\n",
-       "<path fill=\"none\" stroke=\"BLACK\" d=\"M652.71,-94.75C675.78,-80.33 703,-63.31 725.14,-49.48\"/>\n",
-       "<polygon fill=\"BLACK\" stroke=\"BLACK\" points=\"727.04,-52.41 733.67,-44.15 723.33,-46.48 727.04,-52.41\"/>\n",
-       "<text text-anchor=\"start\" x=\"705.5\" y=\"-66.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
-       "<text text-anchor=\"start\" x=\"709.5\" y=\"-66.8\" font-family=\"Times,serif\" font-size=\"10.00\" fill=\"#336633\">rdf:type</text>\n",
-       "<text text-anchor=\"start\" x=\"742.5\" y=\"-66.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
-       "</g>\n",
-       "<!-- node2 -->\n",
-       "<g id=\"node3\" class=\"node\">\n",
-       "<title>node2</title>\n",
-       "<polygon fill=\"grey\" stroke=\"transparent\" points=\"957.5,-533 957.5,-552 1162.5,-552 1162.5,-533 957.5,-533\"/>\n",
-       "<text text-anchor=\"start\" x=\"1045.5\" y=\"-539.8\" font-family=\"DejaVu Sans\" font-weight=\"bold\" font-size=\"14.00\">out1</text>\n",
-       "<g id=\"a_node3_3\"><a xlink:href=\"http://www.example.org/unpublished-mul#out1\" xlink:title=\"&lt;TABLE&gt;\">\n",
-       "<polygon fill=\"#eeeeee\" stroke=\"transparent\" points=\"957.5,-518 957.5,-533 1162.5,-533 1162.5,-518 957.5,-518\"/>\n",
-       "<text text-anchor=\"start\" x=\"959.5\" y=\"-523\" font-family=\"DejaVu Sans\" font-size=\"10.00\" fill=\"#6666ff\">http://www.example.org/unpublished&#45;mul#out1</text>\n",
-       "</a>\n",
-       "</g>\n",
-       "<polygon fill=\"none\" stroke=\"#666666\" points=\"956,-517 956,-553 1163,-553 1163,-517 956,-517\"/>\n",
+       "<!-- node1&#45;&gt;node0 -->\n",
+       "<g id=\"edge8\" class=\"edge\">\n",
+       "<title>node1&#45;&gt;node0</title>\n",
+       "<path fill=\"none\" stroke=\"BLACK\" d=\"M744.49,-208.9C764.46,-195.01 788.23,-178.47 809.11,-163.95\"/>\n",
+       "<polygon fill=\"BLACK\" stroke=\"BLACK\" points=\"811.35,-166.65 817.56,-158.07 807.35,-160.91 811.35,-166.65\"/>\n",
+       "<text text-anchor=\"start\" x=\"791.5\" y=\"-180.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
+       "<text text-anchor=\"start\" x=\"795.5\" y=\"-180.8\" font-family=\"Times,serif\" font-size=\"10.00\" fill=\"#336633\">dc:language</text>\n",
+       "<text text-anchor=\"start\" x=\"846.5\" y=\"-180.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
        "</g>\n",
        "<!-- node3 -->\n",
-       "<g id=\"node4\" class=\"node\">\n",
+       "<g id=\"node3\" class=\"node\">\n",
        "<title>node3</title>\n",
-       "<polygon fill=\"grey\" stroke=\"transparent\" points=\"1039.5,-438 1039.5,-457 1080.5,-457 1080.5,-438 1039.5,-438\"/>\n",
-       "<text text-anchor=\"start\" x=\"1041.5\" y=\"-444.8\" font-family=\"DejaVu Sans\" font-weight=\"bold\" font-size=\"14.00\">result</text>\n",
-       "<g id=\"a_node4_4\"><a xlink:href=\"result\" xlink:title=\"&lt;TABLE&gt;\">\n",
-       "<polygon fill=\"#eeeeee\" stroke=\"transparent\" points=\"1039.5,-423 1039.5,-438 1080.5,-438 1080.5,-423 1039.5,-423\"/>\n",
-       "<text text-anchor=\"start\" x=\"1047.5\" y=\"-428\" font-family=\"DejaVu Sans\" font-size=\"10.00\" fill=\"#6666ff\">result</text>\n",
+       "<polygon fill=\"grey\" stroke=\"transparent\" points=\"373.5,-438 373.5,-457 554.5,-457 554.5,-438 373.5,-438\"/>\n",
+       "<text text-anchor=\"start\" x=\"409.5\" y=\"-444.8\" font-family=\"DejaVu Sans\" font-weight=\"bold\" font-size=\"14.00\">unpublished&#45;sub</text>\n",
+       "<g id=\"a_node3_3\"><a xlink:href=\"http://www.example.org/unpublished-sub\" xlink:title=\"&lt;TABLE&gt;\">\n",
+       "<polygon fill=\"#eeeeee\" stroke=\"transparent\" points=\"373.5,-423 373.5,-438 554.5,-438 554.5,-423 373.5,-423\"/>\n",
+       "<text text-anchor=\"start\" x=\"375.5\" y=\"-428\" font-family=\"DejaVu Sans\" font-size=\"10.00\" fill=\"#6666ff\">http://www.example.org/unpublished&#45;sub</text>\n",
        "</a>\n",
        "</g>\n",
-       "<polygon fill=\"none\" stroke=\"#666666\" points=\"1038,-422 1038,-458 1081,-458 1081,-422 1038,-422\"/>\n",
+       "<polygon fill=\"none\" stroke=\"#666666\" points=\"372,-422 372,-458 555,-458 555,-422 372,-422\"/>\n",
        "</g>\n",
-       "<!-- node2&#45;&gt;node3 -->\n",
-       "<g id=\"edge2\" class=\"edge\">\n",
-       "<title>node2&#45;&gt;node3</title>\n",
-       "<path fill=\"none\" stroke=\"BLACK\" d=\"M1059.5,-512.9C1059.5,-500.89 1059.5,-485.62 1059.5,-472.24\"/>\n",
-       "<polygon fill=\"BLACK\" stroke=\"BLACK\" points=\"1063,-472.02 1059.5,-462.02 1056,-472.02 1063,-472.02\"/>\n",
-       "<text text-anchor=\"start\" x=\"1059.5\" y=\"-484.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
-       "<text text-anchor=\"start\" x=\"1063.5\" y=\"-484.8\" font-family=\"Times,serif\" font-size=\"10.00\" fill=\"#336633\">pplan:bindsTo</text>\n",
-       "<text text-anchor=\"start\" x=\"1123.5\" y=\"-484.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
+       "<!-- node3&#45;&gt;node1 -->\n",
+       "<g id=\"edge3\" class=\"edge\">\n",
+       "<title>node3&#45;&gt;node1</title>\n",
+       "<path fill=\"none\" stroke=\"BLACK\" d=\"M444.13,-418C423.82,-393.34 397.64,-352.1 419.5,-323 434.06,-303.62 476.8,-287.37 524.71,-274.6\"/>\n",
+       "<polygon fill=\"BLACK\" stroke=\"BLACK\" points=\"525.87,-277.91 534.67,-272.01 524.11,-271.14 525.87,-277.91\"/>\n",
+       "<text text-anchor=\"start\" x=\"419.5\" y=\"-342.3\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
+       "<text text-anchor=\"start\" x=\"423.5\" y=\"-342.3\" font-family=\"Times,serif\" font-size=\"10.00\" fill=\"#336633\">pplan:isStepOfPlan</text>\n",
+       "<text text-anchor=\"start\" x=\"503.5\" y=\"-342.3\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
        "</g>\n",
        "<!-- node4 -->\n",
-       "<g id=\"node5\" class=\"node\">\n",
+       "<g id=\"node4\" class=\"node\">\n",
        "<title>node4</title>\n",
-       "<polygon fill=\"grey\" stroke=\"transparent\" points=\"643.5,-438 643.5,-457 831.5,-457 831.5,-438 643.5,-438\"/>\n",
-       "<text text-anchor=\"start\" x=\"677\" y=\"-444.8\" font-family=\"DejaVu Sans\" font-weight=\"bold\" font-size=\"14.00\">unpublished&#45;weird</text>\n",
-       "<g id=\"a_node5_5\"><a xlink:href=\"http://www.example.org/unpublished-weird\" xlink:title=\"&lt;TABLE&gt;\">\n",
-       "<polygon fill=\"#eeeeee\" stroke=\"transparent\" points=\"643.5,-423 643.5,-438 831.5,-438 831.5,-423 643.5,-423\"/>\n",
-       "<text text-anchor=\"start\" x=\"645.5\" y=\"-428\" font-family=\"DejaVu Sans\" font-size=\"10.00\" fill=\"#6666ff\">http://www.example.org/unpublished&#45;weird</text>\n",
-       "</a>\n",
-       "</g>\n",
-       "<polygon fill=\"none\" stroke=\"#666666\" points=\"642.5,-422 642.5,-458 832.5,-458 832.5,-422 642.5,-422\"/>\n",
-       "</g>\n",
-       "<!-- node5 -->\n",
-       "<g id=\"node6\" class=\"node\">\n",
-       "<title>node5</title>\n",
        "<polygon fill=\"grey\" stroke=\"transparent\" points=\"526.5,-343 526.5,-362 707.5,-362 707.5,-343 526.5,-343\"/>\n",
        "<text text-anchor=\"start\" x=\"562\" y=\"-349.8\" font-family=\"DejaVu Sans\" font-weight=\"bold\" font-size=\"14.00\">unpublished&#45;mul</text>\n",
-       "<g id=\"a_node6_6\"><a xlink:href=\"http://www.example.org/unpublished-mul\" xlink:title=\"&lt;TABLE&gt;\">\n",
+       "<g id=\"a_node4_4\"><a xlink:href=\"http://www.example.org/unpublished-mul\" xlink:title=\"&lt;TABLE&gt;\">\n",
        "<polygon fill=\"#eeeeee\" stroke=\"transparent\" points=\"526.5,-328 526.5,-343 707.5,-343 707.5,-328 526.5,-328\"/>\n",
        "<text text-anchor=\"start\" x=\"528.5\" y=\"-333\" font-family=\"DejaVu Sans\" font-size=\"10.00\" fill=\"#6666ff\">http://www.example.org/unpublished&#45;mul</text>\n",
        "</a>\n",
        "</g>\n",
        "<polygon fill=\"none\" stroke=\"#666666\" points=\"525,-327 525,-363 708,-363 708,-327 525,-327\"/>\n",
        "</g>\n",
-       "<!-- node4&#45;&gt;node5 -->\n",
-       "<g id=\"edge3\" class=\"edge\">\n",
-       "<title>node4&#45;&gt;node5</title>\n",
-       "<path fill=\"none\" stroke=\"BLACK\" d=\"M703.89,-417.89C695.45,-412.29 686.51,-406.1 678.5,-400 667.83,-391.89 656.65,-382.46 646.76,-373.77\"/>\n",
-       "<polygon fill=\"BLACK\" stroke=\"BLACK\" points=\"648.95,-371.03 639.15,-367.01 644.3,-376.27 648.95,-371.03\"/>\n",
-       "<text text-anchor=\"start\" x=\"678.5\" y=\"-389.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
-       "<text text-anchor=\"start\" x=\"682.5\" y=\"-389.8\" font-family=\"Times,serif\" font-size=\"10.00\" fill=\"#336633\">dul:precedes</text>\n",
-       "<text text-anchor=\"start\" x=\"734.5\" y=\"-389.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
-       "</g>\n",
-       "<!-- node6 -->\n",
-       "<g id=\"node8\" class=\"node\">\n",
-       "<title>node6</title>\n",
-       "<polygon fill=\"grey\" stroke=\"transparent\" points=\"9.5,-247.5 9.5,-266.5 1392.5,-266.5 1392.5,-247.5 9.5,-247.5\"/>\n",
-       "<text text-anchor=\"start\" x=\"658.5\" y=\"-254.3\" font-family=\"DejaVu Sans\" font-weight=\"bold\" font-size=\"14.00\">My Workflow</text>\n",
-       "<g id=\"a_node8_7\"><a xlink:href=\"plan\" xlink:title=\"&lt;TABLE&gt;\">\n",
-       "<polygon fill=\"#eeeeee\" stroke=\"transparent\" points=\"9.5,-232.5 9.5,-247.5 1392.5,-247.5 1392.5,-232.5 9.5,-232.5\"/>\n",
-       "<text text-anchor=\"start\" x=\"691.5\" y=\"-237.5\" font-family=\"DejaVu Sans\" font-size=\"10.00\" fill=\"#6666ff\">plan</text>\n",
-       "</a>\n",
-       "</g>\n",
-       "<text text-anchor=\"start\" x=\"11.5\" y=\"-219.3\" font-family=\"DejaVu Sans\" font-size=\"14.00\">dc:description</text>\n",
-       "<text text-anchor=\"start\" x=\"99.5\" y=\"-219.3\" font-family=\"DejaVu Sans\" font-size=\"14.00\">&quot;@is_fairworkflow(label=&#39;My Workflow&#39;)def my_workflow(in1, in2, in3): &#160;&#160;&#160;&quot;&quot;&quot; &#160;&#160;&#160;A simple addition, subtraction, multiplication workflow &#160;&#160;&#160;&quot;&quot;&quot; &#160;&#160;&#160;t1 = add(in1, in2) &#160;&#160;&#160;t2 = sub(in1, in2) &#160;&#160;&#160;t3 = mul(weird(t1, in3), t2) &#160;&#160;&#160;return t3&quot;</text>\n",
-       "<polygon fill=\"none\" stroke=\"#666666\" points=\"8,-213 8,-268 1393,-268 1393,-213 8,-213\"/>\n",
+       "<!-- node3&#45;&gt;node4 -->\n",
+       "<g id=\"edge2\" class=\"edge\">\n",
+       "<title>node3&#45;&gt;node4</title>\n",
+       "<path fill=\"none\" stroke=\"BLACK\" d=\"M498.22,-417.9C520.42,-404.4 549.4,-386.79 573.11,-372.37\"/>\n",
+       "<polygon fill=\"BLACK\" stroke=\"BLACK\" points=\"575.19,-375.2 581.92,-367.02 571.56,-369.22 575.19,-375.2\"/>\n",
+       "<text text-anchor=\"start\" x=\"549.5\" y=\"-389.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
+       "<text text-anchor=\"start\" x=\"553.5\" y=\"-389.8\" font-family=\"Times,serif\" font-size=\"10.00\" fill=\"#336633\">dul:precedes</text>\n",
+       "<text text-anchor=\"start\" x=\"605.5\" y=\"-389.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
        "</g>\n",
-       "<!-- node4&#45;&gt;node6 -->\n",
+       "<!-- node4&#45;&gt;node1 -->\n",
        "<g id=\"edge12\" class=\"edge\">\n",
-       "<title>node4&#45;&gt;node6</title>\n",
-       "<path fill=\"none\" stroke=\"BLACK\" d=\"M741.99,-417.56C747.24,-387.94 753.44,-333.28 738.5,-290 737.42,-286.87 736.04,-283.78 734.46,-280.77\"/>\n",
-       "<polygon fill=\"BLACK\" stroke=\"BLACK\" points=\"737.34,-278.78 729.17,-272.04 731.35,-282.41 737.34,-278.78\"/>\n",
-       "<text text-anchor=\"start\" x=\"748.5\" y=\"-342.3\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
-       "<text text-anchor=\"start\" x=\"752.5\" y=\"-342.3\" font-family=\"Times,serif\" font-size=\"10.00\" fill=\"#336633\">pplan:isStepOfPlan</text>\n",
-       "<text text-anchor=\"start\" x=\"832.5\" y=\"-342.3\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
-       "</g>\n",
-       "<!-- node5&#45;&gt;node6 -->\n",
-       "<g id=\"edge6\" class=\"edge\">\n",
-       "<title>node5&#45;&gt;node6</title>\n",
+       "<title>node4&#45;&gt;node1</title>\n",
        "<path fill=\"none\" stroke=\"BLACK\" d=\"M628.16,-322.96C634.27,-312.63 642.2,-300.24 650.5,-290 653.36,-286.47 656.46,-282.93 659.67,-279.46\"/>\n",
        "<polygon fill=\"BLACK\" stroke=\"BLACK\" points=\"662.41,-281.65 666.8,-272.01 657.36,-276.81 662.41,-281.65\"/>\n",
        "<text text-anchor=\"start\" x=\"650.5\" y=\"-294.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
        "<text text-anchor=\"start\" x=\"654.5\" y=\"-294.8\" font-family=\"Times,serif\" font-size=\"10.00\" fill=\"#336633\">pplan:isStepOfPlan</text>\n",
        "<text text-anchor=\"start\" x=\"734.5\" y=\"-294.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
        "</g>\n",
-       "<!-- node7 -->\n",
-       "<g id=\"node7\" class=\"node\">\n",
-       "<title>node7</title>\n",
-       "<polygon fill=\"grey\" stroke=\"transparent\" points=\"373.5,-438 373.5,-457 554.5,-457 554.5,-438 373.5,-438\"/>\n",
-       "<text text-anchor=\"start\" x=\"409.5\" y=\"-444.8\" font-family=\"DejaVu Sans\" font-weight=\"bold\" font-size=\"14.00\">unpublished&#45;sub</text>\n",
-       "<g id=\"a_node7_8\"><a xlink:href=\"http://www.example.org/unpublished-sub\" xlink:title=\"&lt;TABLE&gt;\">\n",
-       "<polygon fill=\"#eeeeee\" stroke=\"transparent\" points=\"373.5,-423 373.5,-438 554.5,-438 554.5,-423 373.5,-423\"/>\n",
-       "<text text-anchor=\"start\" x=\"375.5\" y=\"-428\" font-family=\"DejaVu Sans\" font-size=\"10.00\" fill=\"#6666ff\">http://www.example.org/unpublished&#45;sub</text>\n",
+       "<!-- node5 -->\n",
+       "<g id=\"node6\" class=\"node\">\n",
+       "<title>node5</title>\n",
+       "<polygon fill=\"grey\" stroke=\"transparent\" points=\"673.5,-20 673.5,-39 842.5,-39 842.5,-20 673.5,-20\"/>\n",
+       "<text text-anchor=\"start\" x=\"733.5\" y=\"-26.8\" font-family=\"DejaVu Sans\" font-weight=\"bold\" font-size=\"14.00\">Q28865</text>\n",
+       "<g id=\"a_node6_5\"><a xlink:href=\"https://www.wikidata.org/wiki/Q28865\" xlink:title=\"&lt;TABLE&gt;\">\n",
+       "<polygon fill=\"#eeeeee\" stroke=\"transparent\" points=\"673.5,-5 673.5,-20 842.5,-20 842.5,-5 673.5,-5\"/>\n",
+       "<text text-anchor=\"start\" x=\"675.5\" y=\"-10\" font-family=\"DejaVu Sans\" font-size=\"10.00\" fill=\"#6666ff\">https://www.wikidata.org/wiki/Q28865</text>\n",
        "</a>\n",
        "</g>\n",
-       "<polygon fill=\"none\" stroke=\"#666666\" points=\"372,-422 372,-458 555,-458 555,-422 372,-422\"/>\n",
+       "<polygon fill=\"none\" stroke=\"#666666\" points=\"672,-4 672,-40 843,-40 843,-4 672,-4\"/>\n",
        "</g>\n",
-       "<!-- node7&#45;&gt;node5 -->\n",
+       "<!-- node0&#45;&gt;node5 -->\n",
+       "<g id=\"edge4\" class=\"edge\">\n",
+       "<title>node0&#45;&gt;node5</title>\n",
+       "<path fill=\"none\" stroke=\"BLACK\" d=\"M830.3,-94.75C816.36,-81.01 800.04,-64.93 786.39,-51.48\"/>\n",
+       "<polygon fill=\"BLACK\" stroke=\"BLACK\" points=\"788.7,-48.83 779.12,-44.3 783.78,-53.82 788.7,-48.83\"/>\n",
+       "<text text-anchor=\"start\" x=\"809.5\" y=\"-66.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
+       "<text text-anchor=\"start\" x=\"813.5\" y=\"-66.8\" font-family=\"Times,serif\" font-size=\"10.00\" fill=\"#336633\">rdfs:seeAlso</text>\n",
+       "<text text-anchor=\"start\" x=\"864.5\" y=\"-66.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
+       "</g>\n",
+       "<!-- node16 -->\n",
+       "<g id=\"node17\" class=\"node\">\n",
+       "<title>node16</title>\n",
+       "<polygon fill=\"grey\" stroke=\"transparent\" points=\"878.5,-20 878.5,-39 1052.5,-39 1052.5,-20 878.5,-20\"/>\n",
+       "<text text-anchor=\"start\" x=\"901\" y=\"-26.8\" font-family=\"DejaVu Sans\" font-weight=\"bold\" font-size=\"14.00\">ComputerLanguage</text>\n",
+       "<g id=\"a_node17_6\"><a xlink:href=\"https://schema.org/ComputerLanguage\" xlink:title=\"&lt;TABLE&gt;\">\n",
+       "<polygon fill=\"#eeeeee\" stroke=\"transparent\" points=\"878.5,-5 878.5,-20 1052.5,-20 1052.5,-5 878.5,-5\"/>\n",
+       "<text text-anchor=\"start\" x=\"880.5\" y=\"-10\" font-family=\"DejaVu Sans\" font-size=\"10.00\" fill=\"#6666ff\">https://schema.org/ComputerLanguage</text>\n",
+       "</a>\n",
+       "</g>\n",
+       "<polygon fill=\"none\" stroke=\"#666666\" points=\"877.5,-4 877.5,-40 1053.5,-40 1053.5,-4 877.5,-4\"/>\n",
+       "</g>\n",
+       "<!-- node0&#45;&gt;node16 -->\n",
        "<g id=\"edge15\" class=\"edge\">\n",
-       "<title>node7&#45;&gt;node5</title>\n",
-       "<path fill=\"none\" stroke=\"BLACK\" d=\"M498.22,-417.9C520.42,-404.4 549.4,-386.79 573.11,-372.37\"/>\n",
-       "<polygon fill=\"BLACK\" stroke=\"BLACK\" points=\"575.19,-375.2 581.92,-367.02 571.56,-369.22 575.19,-375.2\"/>\n",
-       "<text text-anchor=\"start\" x=\"549.5\" y=\"-389.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
-       "<text text-anchor=\"start\" x=\"553.5\" y=\"-389.8\" font-family=\"Times,serif\" font-size=\"10.00\" fill=\"#336633\">dul:precedes</text>\n",
-       "<text text-anchor=\"start\" x=\"605.5\" y=\"-389.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
+       "<title>node0&#45;&gt;node16</title>\n",
+       "<path fill=\"none\" stroke=\"BLACK\" d=\"M892.7,-94.75C906.64,-81.01 922.96,-64.93 936.61,-51.48\"/>\n",
+       "<polygon fill=\"BLACK\" stroke=\"BLACK\" points=\"939.22,-53.82 943.88,-44.3 934.3,-48.83 939.22,-53.82\"/>\n",
+       "<text text-anchor=\"start\" x=\"926.5\" y=\"-66.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
+       "<text text-anchor=\"start\" x=\"930.5\" y=\"-66.8\" font-family=\"Times,serif\" font-size=\"10.00\" fill=\"#336633\">rdf:type</text>\n",
+       "<text text-anchor=\"start\" x=\"963.5\" y=\"-66.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
        "</g>\n",
-       "<!-- node7&#45;&gt;node6 -->\n",
-       "<g id=\"edge4\" class=\"edge\">\n",
-       "<title>node7&#45;&gt;node6</title>\n",
-       "<path fill=\"none\" stroke=\"BLACK\" d=\"M444.13,-418C423.82,-393.34 397.64,-352.1 419.5,-323 434.06,-303.62 476.8,-287.37 524.71,-274.6\"/>\n",
-       "<polygon fill=\"BLACK\" stroke=\"BLACK\" points=\"525.87,-277.91 534.67,-272.01 524.11,-271.14 525.87,-277.91\"/>\n",
-       "<text text-anchor=\"start\" x=\"419.5\" y=\"-342.3\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
-       "<text text-anchor=\"start\" x=\"423.5\" y=\"-342.3\" font-family=\"Times,serif\" font-size=\"10.00\" fill=\"#336633\">pplan:isStepOfPlan</text>\n",
-       "<text text-anchor=\"start\" x=\"503.5\" y=\"-342.3\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
+       "<!-- node6 -->\n",
+       "<g id=\"node7\" class=\"node\">\n",
+       "<title>node6</title>\n",
+       "<polygon fill=\"grey\" stroke=\"transparent\" points=\"945.5,-533 945.5,-552 1157.5,-552 1157.5,-533 945.5,-533\"/>\n",
+       "<text text-anchor=\"start\" x=\"1037\" y=\"-539.8\" font-family=\"DejaVu Sans\" font-weight=\"bold\" font-size=\"14.00\">out1</text>\n",
+       "<g id=\"a_node7_7\"><a xlink:href=\"http://www.example.org/unpublished-weird#out1\" xlink:title=\"&lt;TABLE&gt;\">\n",
+       "<polygon fill=\"#eeeeee\" stroke=\"transparent\" points=\"945.5,-518 945.5,-533 1157.5,-533 1157.5,-518 945.5,-518\"/>\n",
+       "<text text-anchor=\"start\" x=\"947.5\" y=\"-523\" font-family=\"DejaVu Sans\" font-size=\"10.00\" fill=\"#6666ff\">http://www.example.org/unpublished&#45;weird#out1</text>\n",
+       "</a>\n",
        "</g>\n",
-       "<!-- node6&#45;&gt;node0 -->\n",
-       "<g id=\"edge14\" class=\"edge\">\n",
-       "<title>node6&#45;&gt;node0</title>\n",
-       "<path fill=\"none\" stroke=\"BLACK\" d=\"M673.99,-208.9C662.45,-195.56 648.79,-179.79 636.58,-165.7\"/>\n",
-       "<polygon fill=\"BLACK\" stroke=\"BLACK\" points=\"639.17,-163.34 629.97,-158.07 633.87,-167.92 639.17,-163.34\"/>\n",
-       "<text text-anchor=\"start\" x=\"658.5\" y=\"-180.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
-       "<text text-anchor=\"start\" x=\"662.5\" y=\"-180.8\" font-family=\"Times,serif\" font-size=\"10.00\" fill=\"#336633\">dc:language</text>\n",
-       "<text text-anchor=\"start\" x=\"713.5\" y=\"-180.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
+       "<polygon fill=\"none\" stroke=\"#666666\" points=\"944.5,-517 944.5,-553 1158.5,-553 1158.5,-517 944.5,-517\"/>\n",
        "</g>\n",
-       "<!-- node10 -->\n",
-       "<g id=\"node11\" class=\"node\">\n",
-       "<title>node10</title>\n",
-       "<polygon fill=\"grey\" stroke=\"transparent\" points=\"730.5,-124.5 730.5,-143.5 863.5,-143.5 863.5,-124.5 730.5,-124.5\"/>\n",
-       "<text text-anchor=\"start\" x=\"782.5\" y=\"-131.3\" font-family=\"DejaVu Sans\" font-weight=\"bold\" font-size=\"14.00\">Plan</text>\n",
-       "<g id=\"a_node11_9\"><a xlink:href=\"http://purl.org/net/p-plan#Plan\" xlink:title=\"&lt;TABLE&gt;\">\n",
-       "<polygon fill=\"#eeeeee\" stroke=\"transparent\" points=\"730.5,-109.5 730.5,-124.5 863.5,-124.5 863.5,-109.5 730.5,-109.5\"/>\n",
-       "<text text-anchor=\"start\" x=\"732.5\" y=\"-114.5\" font-family=\"DejaVu Sans\" font-size=\"10.00\" fill=\"#6666ff\">http://purl.org/net/p&#45;plan#Plan</text>\n",
+       "<!-- node7 -->\n",
+       "<g id=\"node8\" class=\"node\">\n",
+       "<title>node7</title>\n",
+       "<polygon fill=\"grey\" stroke=\"transparent\" points=\"956.5,-438 956.5,-457 1147.5,-457 1147.5,-438 956.5,-438\"/>\n",
+       "<text text-anchor=\"start\" x=\"1048\" y=\"-444.8\" font-family=\"DejaVu Sans\" font-weight=\"bold\" font-size=\"14.00\">a</text>\n",
+       "<g id=\"a_node8_8\"><a xlink:href=\"http://www.example.org/unpublished-mul#a\" xlink:title=\"&lt;TABLE&gt;\">\n",
+       "<polygon fill=\"#eeeeee\" stroke=\"transparent\" points=\"956.5,-423 956.5,-438 1147.5,-438 1147.5,-423 956.5,-423\"/>\n",
+       "<text text-anchor=\"start\" x=\"958.5\" y=\"-428\" font-family=\"DejaVu Sans\" font-size=\"10.00\" fill=\"#6666ff\">http://www.example.org/unpublished&#45;mul#a</text>\n",
        "</a>\n",
        "</g>\n",
-       "<polygon fill=\"none\" stroke=\"#666666\" points=\"729,-108.5 729,-144.5 864,-144.5 864,-108.5 729,-108.5\"/>\n",
+       "<polygon fill=\"none\" stroke=\"#666666\" points=\"955,-422 955,-458 1148,-458 1148,-422 955,-422\"/>\n",
        "</g>\n",
-       "<!-- node6&#45;&gt;node10 -->\n",
-       "<g id=\"edge7\" class=\"edge\">\n",
-       "<title>node6&#45;&gt;node10</title>\n",
-       "<path fill=\"none\" stroke=\"BLACK\" d=\"M726.73,-208.9C740.73,-192.57 757.85,-172.59 771.63,-156.51\"/>\n",
-       "<polygon fill=\"BLACK\" stroke=\"BLACK\" points=\"774.65,-158.37 778.5,-148.5 769.33,-153.82 774.65,-158.37\"/>\n",
-       "<text text-anchor=\"start\" x=\"754.5\" y=\"-180.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
-       "<text text-anchor=\"start\" x=\"758.5\" y=\"-180.8\" font-family=\"Times,serif\" font-size=\"10.00\" fill=\"#336633\">rdf:type</text>\n",
-       "<text text-anchor=\"start\" x=\"791.5\" y=\"-180.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
+       "<!-- node6&#45;&gt;node7 -->\n",
+       "<g id=\"edge5\" class=\"edge\">\n",
+       "<title>node6&#45;&gt;node7</title>\n",
+       "<path fill=\"none\" stroke=\"BLACK\" d=\"M1051.5,-512.9C1051.5,-500.89 1051.5,-485.62 1051.5,-472.24\"/>\n",
+       "<polygon fill=\"BLACK\" stroke=\"BLACK\" points=\"1055,-472.02 1051.5,-462.02 1048,-472.02 1055,-472.02\"/>\n",
+       "<text text-anchor=\"start\" x=\"1051.5\" y=\"-484.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
+       "<text text-anchor=\"start\" x=\"1055.5\" y=\"-484.8\" font-family=\"Times,serif\" font-size=\"10.00\" fill=\"#336633\">pplan:bindsTo</text>\n",
+       "<text text-anchor=\"start\" x=\"1115.5\" y=\"-484.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
        "</g>\n",
        "<!-- node8 -->\n",
        "<g id=\"node9\" class=\"node\">\n",
        "<title>node8</title>\n",
-       "<polygon fill=\"grey\" stroke=\"transparent\" points=\"1198.5,-533 1198.5,-552 1410.5,-552 1410.5,-533 1198.5,-533\"/>\n",
-       "<text text-anchor=\"start\" x=\"1290\" y=\"-539.8\" font-family=\"DejaVu Sans\" font-weight=\"bold\" font-size=\"14.00\">out1</text>\n",
-       "<g id=\"a_node9_10\"><a xlink:href=\"http://www.example.org/unpublished-weird#out1\" xlink:title=\"&lt;TABLE&gt;\">\n",
-       "<polygon fill=\"#eeeeee\" stroke=\"transparent\" points=\"1198.5,-518 1198.5,-533 1410.5,-533 1410.5,-518 1198.5,-518\"/>\n",
-       "<text text-anchor=\"start\" x=\"1200.5\" y=\"-523\" font-family=\"DejaVu Sans\" font-size=\"10.00\" fill=\"#6666ff\">http://www.example.org/unpublished&#45;weird#out1</text>\n",
+       "<polygon fill=\"grey\" stroke=\"transparent\" points=\"643.5,-438 643.5,-457 831.5,-457 831.5,-438 643.5,-438\"/>\n",
+       "<text text-anchor=\"start\" x=\"677\" y=\"-444.8\" font-family=\"DejaVu Sans\" font-weight=\"bold\" font-size=\"14.00\">unpublished&#45;weird</text>\n",
+       "<g id=\"a_node9_9\"><a xlink:href=\"http://www.example.org/unpublished-weird\" xlink:title=\"&lt;TABLE&gt;\">\n",
+       "<polygon fill=\"#eeeeee\" stroke=\"transparent\" points=\"643.5,-423 643.5,-438 831.5,-438 831.5,-423 643.5,-423\"/>\n",
+       "<text text-anchor=\"start\" x=\"645.5\" y=\"-428\" font-family=\"DejaVu Sans\" font-size=\"10.00\" fill=\"#6666ff\">http://www.example.org/unpublished&#45;weird</text>\n",
        "</a>\n",
        "</g>\n",
-       "<polygon fill=\"none\" stroke=\"#666666\" points=\"1197.5,-517 1197.5,-553 1411.5,-553 1411.5,-517 1197.5,-517\"/>\n",
+       "<polygon fill=\"none\" stroke=\"#666666\" points=\"642.5,-422 642.5,-458 832.5,-458 832.5,-422 642.5,-422\"/>\n",
+       "</g>\n",
+       "<!-- node8&#45;&gt;node1 -->\n",
+       "<g id=\"edge6\" class=\"edge\">\n",
+       "<title>node8&#45;&gt;node1</title>\n",
+       "<path fill=\"none\" stroke=\"BLACK\" d=\"M741.99,-417.56C747.24,-387.94 753.44,-333.28 738.5,-290 737.42,-286.87 736.04,-283.78 734.46,-280.77\"/>\n",
+       "<polygon fill=\"BLACK\" stroke=\"BLACK\" points=\"737.34,-278.78 729.17,-272.04 731.35,-282.41 737.34,-278.78\"/>\n",
+       "<text text-anchor=\"start\" x=\"748.5\" y=\"-342.3\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
+       "<text text-anchor=\"start\" x=\"752.5\" y=\"-342.3\" font-family=\"Times,serif\" font-size=\"10.00\" fill=\"#336633\">pplan:isStepOfPlan</text>\n",
+       "<text text-anchor=\"start\" x=\"832.5\" y=\"-342.3\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
+       "</g>\n",
+       "<!-- node8&#45;&gt;node4 -->\n",
+       "<g id=\"edge7\" class=\"edge\">\n",
+       "<title>node8&#45;&gt;node4</title>\n",
+       "<path fill=\"none\" stroke=\"BLACK\" d=\"M703.89,-417.89C695.45,-412.29 686.51,-406.1 678.5,-400 667.83,-391.89 656.65,-382.46 646.76,-373.77\"/>\n",
+       "<polygon fill=\"BLACK\" stroke=\"BLACK\" points=\"648.95,-371.03 639.15,-367.01 644.3,-376.27 648.95,-371.03\"/>\n",
+       "<text text-anchor=\"start\" x=\"678.5\" y=\"-389.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
+       "<text text-anchor=\"start\" x=\"682.5\" y=\"-389.8\" font-family=\"Times,serif\" font-size=\"10.00\" fill=\"#336633\">dul:precedes</text>\n",
+       "<text text-anchor=\"start\" x=\"734.5\" y=\"-389.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
        "</g>\n",
        "<!-- node9 -->\n",
        "<g id=\"node10\" class=\"node\">\n",
        "<title>node9</title>\n",
-       "<polygon fill=\"grey\" stroke=\"transparent\" points=\"1209.5,-438 1209.5,-457 1400.5,-457 1400.5,-438 1209.5,-438\"/>\n",
-       "<text text-anchor=\"start\" x=\"1301\" y=\"-444.8\" font-family=\"DejaVu Sans\" font-weight=\"bold\" font-size=\"14.00\">a</text>\n",
-       "<g id=\"a_node10_11\"><a xlink:href=\"http://www.example.org/unpublished-mul#a\" xlink:title=\"&lt;TABLE&gt;\">\n",
-       "<polygon fill=\"#eeeeee\" stroke=\"transparent\" points=\"1209.5,-423 1209.5,-438 1400.5,-438 1400.5,-423 1209.5,-423\"/>\n",
-       "<text text-anchor=\"start\" x=\"1211.5\" y=\"-428\" font-family=\"DejaVu Sans\" font-size=\"10.00\" fill=\"#6666ff\">http://www.example.org/unpublished&#45;mul#a</text>\n",
+       "<polygon fill=\"grey\" stroke=\"transparent\" points=\"688.5,-533 688.5,-552 869.5,-552 869.5,-533 688.5,-533\"/>\n",
+       "<text text-anchor=\"start\" x=\"724.5\" y=\"-539.8\" font-family=\"DejaVu Sans\" font-weight=\"bold\" font-size=\"14.00\">unpublished&#45;add</text>\n",
+       "<g id=\"a_node10_10\"><a xlink:href=\"http://www.example.org/unpublished-add\" xlink:title=\"&lt;TABLE&gt;\">\n",
+       "<polygon fill=\"#eeeeee\" stroke=\"transparent\" points=\"688.5,-518 688.5,-533 869.5,-533 869.5,-518 688.5,-518\"/>\n",
+       "<text text-anchor=\"start\" x=\"690.5\" y=\"-523\" font-family=\"DejaVu Sans\" font-size=\"10.00\" fill=\"#6666ff\">http://www.example.org/unpublished&#45;add</text>\n",
        "</a>\n",
        "</g>\n",
-       "<polygon fill=\"none\" stroke=\"#666666\" points=\"1208,-422 1208,-458 1401,-458 1401,-422 1208,-422\"/>\n",
+       "<polygon fill=\"none\" stroke=\"#666666\" points=\"687,-517 687,-553 870,-553 870,-517 687,-517\"/>\n",
        "</g>\n",
-       "<!-- node8&#45;&gt;node9 -->\n",
-       "<g id=\"edge5\" class=\"edge\">\n",
-       "<title>node8&#45;&gt;node9</title>\n",
-       "<path fill=\"none\" stroke=\"BLACK\" d=\"M1304.5,-512.9C1304.5,-500.89 1304.5,-485.62 1304.5,-472.24\"/>\n",
-       "<polygon fill=\"BLACK\" stroke=\"BLACK\" points=\"1308,-472.02 1304.5,-462.02 1301,-472.02 1308,-472.02\"/>\n",
-       "<text text-anchor=\"start\" x=\"1304.5\" y=\"-484.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
-       "<text text-anchor=\"start\" x=\"1308.5\" y=\"-484.8\" font-family=\"Times,serif\" font-size=\"10.00\" fill=\"#336633\">pplan:bindsTo</text>\n",
-       "<text text-anchor=\"start\" x=\"1368.5\" y=\"-484.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
+       "<!-- node9&#45;&gt;node1 -->\n",
+       "<g id=\"edge9\" class=\"edge\">\n",
+       "<title>node9&#45;&gt;node1</title>\n",
+       "<path fill=\"none\" stroke=\"BLACK\" d=\"M810.13,-512.77C825.69,-500.17 842.57,-482.63 849.5,-462 859.12,-433.37 847.52,-333.98 840.5,-323 828.41,-304.1 810.26,-289.06 791,-277.32\"/>\n",
+       "<polygon fill=\"BLACK\" stroke=\"BLACK\" points=\"792.49,-274.14 782.09,-272.15 788.98,-280.2 792.49,-274.14\"/>\n",
+       "<text text-anchor=\"start\" x=\"852.5\" y=\"-389.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
+       "<text text-anchor=\"start\" x=\"856.5\" y=\"-389.8\" font-family=\"Times,serif\" font-size=\"10.00\" fill=\"#336633\">pplan:isStepOfPlan</text>\n",
+       "<text text-anchor=\"start\" x=\"936.5\" y=\"-389.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
+       "</g>\n",
+       "<!-- node9&#45;&gt;node8 -->\n",
+       "<g id=\"edge11\" class=\"edge\">\n",
+       "<title>node9&#45;&gt;node8</title>\n",
+       "<path fill=\"none\" stroke=\"BLACK\" d=\"M769.2,-512.9C763.8,-500.65 756.9,-485.01 750.92,-471.45\"/>\n",
+       "<polygon fill=\"BLACK\" stroke=\"BLACK\" points=\"754,-469.76 746.77,-462.02 747.6,-472.58 754,-469.76\"/>\n",
+       "<text text-anchor=\"start\" x=\"760.5\" y=\"-484.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
+       "<text text-anchor=\"start\" x=\"764.5\" y=\"-484.8\" font-family=\"Times,serif\" font-size=\"10.00\" fill=\"#336633\">dul:precedes</text>\n",
+       "<text text-anchor=\"start\" x=\"816.5\" y=\"-484.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
+       "</g>\n",
+       "<!-- node10 -->\n",
+       "<g id=\"node11\" class=\"node\">\n",
+       "<title>node10</title>\n",
+       "<polygon fill=\"grey\" stroke=\"transparent\" points=\"1194.5,-533 1194.5,-552 1399.5,-552 1399.5,-533 1194.5,-533\"/>\n",
+       "<text text-anchor=\"start\" x=\"1282.5\" y=\"-539.8\" font-family=\"DejaVu Sans\" font-weight=\"bold\" font-size=\"14.00\">out1</text>\n",
+       "<g id=\"a_node11_11\"><a xlink:href=\"http://www.example.org/unpublished-add#out1\" xlink:title=\"&lt;TABLE&gt;\">\n",
+       "<polygon fill=\"#eeeeee\" stroke=\"transparent\" points=\"1194.5,-518 1194.5,-533 1399.5,-533 1399.5,-518 1194.5,-518\"/>\n",
+       "<text text-anchor=\"start\" x=\"1196.5\" y=\"-523\" font-family=\"DejaVu Sans\" font-size=\"10.00\" fill=\"#6666ff\">http://www.example.org/unpublished&#45;add#out1</text>\n",
+       "</a>\n",
+       "</g>\n",
+       "<polygon fill=\"none\" stroke=\"#666666\" points=\"1193,-517 1193,-553 1400,-553 1400,-517 1193,-517\"/>\n",
        "</g>\n",
        "<!-- node11 -->\n",
        "<g id=\"node12\" class=\"node\">\n",
        "<title>node11</title>\n",
-       "<polygon fill=\"grey\" stroke=\"transparent\" points=\"1447.5,-533 1447.5,-552 1652.5,-552 1652.5,-533 1447.5,-533\"/>\n",
-       "<text text-anchor=\"start\" x=\"1535.5\" y=\"-539.8\" font-family=\"DejaVu Sans\" font-weight=\"bold\" font-size=\"14.00\">out1</text>\n",
-       "<g id=\"a_node12_12\"><a xlink:href=\"http://www.example.org/unpublished-add#out1\" xlink:title=\"&lt;TABLE&gt;\">\n",
-       "<polygon fill=\"#eeeeee\" stroke=\"transparent\" points=\"1447.5,-518 1447.5,-533 1652.5,-533 1652.5,-518 1447.5,-518\"/>\n",
-       "<text text-anchor=\"start\" x=\"1449.5\" y=\"-523\" font-family=\"DejaVu Sans\" font-size=\"10.00\" fill=\"#6666ff\">http://www.example.org/unpublished&#45;add#out1</text>\n",
+       "<polygon fill=\"grey\" stroke=\"transparent\" points=\"1197.5,-438 1197.5,-457 1396.5,-457 1396.5,-438 1197.5,-438\"/>\n",
+       "<text text-anchor=\"start\" x=\"1293\" y=\"-444.8\" font-family=\"DejaVu Sans\" font-weight=\"bold\" font-size=\"14.00\">a</text>\n",
+       "<g id=\"a_node12_12\"><a xlink:href=\"http://www.example.org/unpublished-weird#a\" xlink:title=\"&lt;TABLE&gt;\">\n",
+       "<polygon fill=\"#eeeeee\" stroke=\"transparent\" points=\"1197.5,-423 1197.5,-438 1396.5,-438 1396.5,-423 1197.5,-423\"/>\n",
+       "<text text-anchor=\"start\" x=\"1199.5\" y=\"-428\" font-family=\"DejaVu Sans\" font-size=\"10.00\" fill=\"#6666ff\">http://www.example.org/unpublished&#45;weird#a</text>\n",
        "</a>\n",
        "</g>\n",
-       "<polygon fill=\"none\" stroke=\"#666666\" points=\"1446,-517 1446,-553 1653,-553 1653,-517 1446,-517\"/>\n",
+       "<polygon fill=\"none\" stroke=\"#666666\" points=\"1196,-422 1196,-458 1397,-458 1397,-422 1196,-422\"/>\n",
+       "</g>\n",
+       "<!-- node10&#45;&gt;node11 -->\n",
+       "<g id=\"edge10\" class=\"edge\">\n",
+       "<title>node10&#45;&gt;node11</title>\n",
+       "<path fill=\"none\" stroke=\"BLACK\" d=\"M1296.5,-512.9C1296.5,-500.89 1296.5,-485.62 1296.5,-472.24\"/>\n",
+       "<polygon fill=\"BLACK\" stroke=\"BLACK\" points=\"1300,-472.02 1296.5,-462.02 1293,-472.02 1300,-472.02\"/>\n",
+       "<text text-anchor=\"start\" x=\"1296.5\" y=\"-484.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
+       "<text text-anchor=\"start\" x=\"1300.5\" y=\"-484.8\" font-family=\"Times,serif\" font-size=\"10.00\" fill=\"#336633\">pplan:bindsTo</text>\n",
+       "<text text-anchor=\"start\" x=\"1360.5\" y=\"-484.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
        "</g>\n",
        "<!-- node12 -->\n",
        "<g id=\"node13\" class=\"node\">\n",
        "<title>node12</title>\n",
-       "<polygon fill=\"grey\" stroke=\"transparent\" points=\"1450.5,-438 1450.5,-457 1649.5,-457 1649.5,-438 1450.5,-438\"/>\n",
-       "<text text-anchor=\"start\" x=\"1546\" y=\"-444.8\" font-family=\"DejaVu Sans\" font-weight=\"bold\" font-size=\"14.00\">a</text>\n",
-       "<g id=\"a_node13_13\"><a xlink:href=\"http://www.example.org/unpublished-weird#a\" xlink:title=\"&lt;TABLE&gt;\">\n",
-       "<polygon fill=\"#eeeeee\" stroke=\"transparent\" points=\"1450.5,-423 1450.5,-438 1649.5,-438 1649.5,-423 1450.5,-423\"/>\n",
-       "<text text-anchor=\"start\" x=\"1452.5\" y=\"-428\" font-family=\"DejaVu Sans\" font-size=\"10.00\" fill=\"#6666ff\">http://www.example.org/unpublished&#45;weird#a</text>\n",
+       "<polygon fill=\"grey\" stroke=\"transparent\" points=\"1435.5,-533 1435.5,-552 1640.5,-552 1640.5,-533 1435.5,-533\"/>\n",
+       "<text text-anchor=\"start\" x=\"1523.5\" y=\"-539.8\" font-family=\"DejaVu Sans\" font-weight=\"bold\" font-size=\"14.00\">out1</text>\n",
+       "<g id=\"a_node13_13\"><a xlink:href=\"http://www.example.org/unpublished-mul#out1\" xlink:title=\"&lt;TABLE&gt;\">\n",
+       "<polygon fill=\"#eeeeee\" stroke=\"transparent\" points=\"1435.5,-518 1435.5,-533 1640.5,-533 1640.5,-518 1435.5,-518\"/>\n",
+       "<text text-anchor=\"start\" x=\"1437.5\" y=\"-523\" font-family=\"DejaVu Sans\" font-size=\"10.00\" fill=\"#6666ff\">http://www.example.org/unpublished&#45;mul#out1</text>\n",
        "</a>\n",
        "</g>\n",
-       "<polygon fill=\"none\" stroke=\"#666666\" points=\"1449,-422 1449,-458 1650,-458 1650,-422 1449,-422\"/>\n",
-       "</g>\n",
-       "<!-- node11&#45;&gt;node12 -->\n",
-       "<g id=\"edge8\" class=\"edge\">\n",
-       "<title>node11&#45;&gt;node12</title>\n",
-       "<path fill=\"none\" stroke=\"BLACK\" d=\"M1549.5,-512.9C1549.5,-500.89 1549.5,-485.62 1549.5,-472.24\"/>\n",
-       "<polygon fill=\"BLACK\" stroke=\"BLACK\" points=\"1553,-472.02 1549.5,-462.02 1546,-472.02 1553,-472.02\"/>\n",
-       "<text text-anchor=\"start\" x=\"1549.5\" y=\"-484.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
-       "<text text-anchor=\"start\" x=\"1553.5\" y=\"-484.8\" font-family=\"Times,serif\" font-size=\"10.00\" fill=\"#336633\">pplan:bindsTo</text>\n",
-       "<text text-anchor=\"start\" x=\"1613.5\" y=\"-484.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
+       "<polygon fill=\"none\" stroke=\"#666666\" points=\"1434,-517 1434,-553 1641,-553 1641,-517 1434,-517\"/>\n",
        "</g>\n",
        "<!-- node13 -->\n",
        "<g id=\"node14\" class=\"node\">\n",
        "<title>node13</title>\n",
-       "<polygon fill=\"grey\" stroke=\"transparent\" points=\"740.5,-533 740.5,-552 921.5,-552 921.5,-533 740.5,-533\"/>\n",
-       "<text text-anchor=\"start\" x=\"776.5\" y=\"-539.8\" font-family=\"DejaVu Sans\" font-weight=\"bold\" font-size=\"14.00\">unpublished&#45;add</text>\n",
-       "<g id=\"a_node14_14\"><a xlink:href=\"http://www.example.org/unpublished-add\" xlink:title=\"&lt;TABLE&gt;\">\n",
-       "<polygon fill=\"#eeeeee\" stroke=\"transparent\" points=\"740.5,-518 740.5,-533 921.5,-533 921.5,-518 740.5,-518\"/>\n",
-       "<text text-anchor=\"start\" x=\"742.5\" y=\"-523\" font-family=\"DejaVu Sans\" font-size=\"10.00\" fill=\"#6666ff\">http://www.example.org/unpublished&#45;add</text>\n",
+       "<polygon fill=\"grey\" stroke=\"transparent\" points=\"1517.5,-438 1517.5,-457 1558.5,-457 1558.5,-438 1517.5,-438\"/>\n",
+       "<text text-anchor=\"start\" x=\"1519.5\" y=\"-444.8\" font-family=\"DejaVu Sans\" font-weight=\"bold\" font-size=\"14.00\">result</text>\n",
+       "<g id=\"a_node14_14\"><a xlink:href=\"result\" xlink:title=\"&lt;TABLE&gt;\">\n",
+       "<polygon fill=\"#eeeeee\" stroke=\"transparent\" points=\"1517.5,-423 1517.5,-438 1558.5,-438 1558.5,-423 1517.5,-423\"/>\n",
+       "<text text-anchor=\"start\" x=\"1525.5\" y=\"-428\" font-family=\"DejaVu Sans\" font-size=\"10.00\" fill=\"#6666ff\">result</text>\n",
        "</a>\n",
        "</g>\n",
-       "<polygon fill=\"none\" stroke=\"#666666\" points=\"739,-517 739,-553 922,-553 922,-517 739,-517\"/>\n",
-       "</g>\n",
-       "<!-- node13&#45;&gt;node4 -->\n",
-       "<g id=\"edge10\" class=\"edge\">\n",
-       "<title>node13&#45;&gt;node4</title>\n",
-       "<path fill=\"none\" stroke=\"BLACK\" d=\"M809.4,-512.9C796.44,-499.94 779.68,-483.18 765.6,-469.1\"/>\n",
-       "<polygon fill=\"BLACK\" stroke=\"BLACK\" points=\"768.07,-466.62 758.52,-462.02 763.12,-471.57 768.07,-466.62\"/>\n",
-       "<text text-anchor=\"start\" x=\"790.5\" y=\"-484.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
-       "<text text-anchor=\"start\" x=\"794.5\" y=\"-484.8\" font-family=\"Times,serif\" font-size=\"10.00\" fill=\"#336633\">dul:precedes</text>\n",
-       "<text text-anchor=\"start\" x=\"846.5\" y=\"-484.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
+       "<polygon fill=\"none\" stroke=\"#666666\" points=\"1516,-422 1516,-458 1559,-458 1559,-422 1516,-422\"/>\n",
        "</g>\n",
-       "<!-- node13&#45;&gt;node6 -->\n",
-       "<g id=\"edge9\" class=\"edge\">\n",
-       "<title>node13&#45;&gt;node6</title>\n",
-       "<path fill=\"none\" stroke=\"BLACK\" d=\"M846.48,-512.72C849.77,-507.22 852.77,-501.12 854.5,-495 875.39,-421.2 881.83,-387.61 840.5,-323 828.41,-304.1 810.26,-289.06 791,-277.32\"/>\n",
-       "<polygon fill=\"BLACK\" stroke=\"BLACK\" points=\"792.49,-274.14 782.09,-272.15 788.98,-280.2 792.49,-274.14\"/>\n",
-       "<text text-anchor=\"start\" x=\"870.5\" y=\"-389.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
-       "<text text-anchor=\"start\" x=\"874.5\" y=\"-389.8\" font-family=\"Times,serif\" font-size=\"10.00\" fill=\"#336633\">pplan:isStepOfPlan</text>\n",
-       "<text text-anchor=\"start\" x=\"954.5\" y=\"-389.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
+       "<!-- node12&#45;&gt;node13 -->\n",
+       "<g id=\"edge13\" class=\"edge\">\n",
+       "<title>node12&#45;&gt;node13</title>\n",
+       "<path fill=\"none\" stroke=\"BLACK\" d=\"M1537.5,-512.9C1537.5,-500.89 1537.5,-485.62 1537.5,-472.24\"/>\n",
+       "<polygon fill=\"BLACK\" stroke=\"BLACK\" points=\"1541,-472.02 1537.5,-462.02 1534,-472.02 1541,-472.02\"/>\n",
+       "<text text-anchor=\"start\" x=\"1537.5\" y=\"-484.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
+       "<text text-anchor=\"start\" x=\"1541.5\" y=\"-484.8\" font-family=\"Times,serif\" font-size=\"10.00\" fill=\"#336633\">pplan:bindsTo</text>\n",
+       "<text text-anchor=\"start\" x=\"1601.5\" y=\"-484.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
        "</g>\n",
        "<!-- node14 -->\n",
        "<g id=\"node15\" class=\"node\">\n",
        "<title>node14</title>\n",
-       "<polygon fill=\"grey\" stroke=\"transparent\" points=\"1688.5,-533 1688.5,-552 1893.5,-552 1893.5,-533 1688.5,-533\"/>\n",
-       "<text text-anchor=\"start\" x=\"1776.5\" y=\"-539.8\" font-family=\"DejaVu Sans\" font-weight=\"bold\" font-size=\"14.00\">out1</text>\n",
+       "<polygon fill=\"grey\" stroke=\"transparent\" points=\"1676.5,-533 1676.5,-552 1881.5,-552 1881.5,-533 1676.5,-533\"/>\n",
+       "<text text-anchor=\"start\" x=\"1764.5\" y=\"-539.8\" font-family=\"DejaVu Sans\" font-weight=\"bold\" font-size=\"14.00\">out1</text>\n",
        "<g id=\"a_node15_15\"><a xlink:href=\"http://www.example.org/unpublished-sub#out1\" xlink:title=\"&lt;TABLE&gt;\">\n",
-       "<polygon fill=\"#eeeeee\" stroke=\"transparent\" points=\"1688.5,-518 1688.5,-533 1893.5,-533 1893.5,-518 1688.5,-518\"/>\n",
-       "<text text-anchor=\"start\" x=\"1690.5\" y=\"-523\" font-family=\"DejaVu Sans\" font-size=\"10.00\" fill=\"#6666ff\">http://www.example.org/unpublished&#45;sub#out1</text>\n",
+       "<polygon fill=\"#eeeeee\" stroke=\"transparent\" points=\"1676.5,-518 1676.5,-533 1881.5,-533 1881.5,-518 1676.5,-518\"/>\n",
+       "<text text-anchor=\"start\" x=\"1678.5\" y=\"-523\" font-family=\"DejaVu Sans\" font-size=\"10.00\" fill=\"#6666ff\">http://www.example.org/unpublished&#45;sub#out1</text>\n",
        "</a>\n",
        "</g>\n",
-       "<polygon fill=\"none\" stroke=\"#666666\" points=\"1687,-517 1687,-553 1894,-553 1894,-517 1687,-517\"/>\n",
+       "<polygon fill=\"none\" stroke=\"#666666\" points=\"1675,-517 1675,-553 1882,-553 1882,-517 1675,-517\"/>\n",
        "</g>\n",
        "<!-- node15 -->\n",
        "<g id=\"node16\" class=\"node\">\n",
        "<title>node15</title>\n",
-       "<polygon fill=\"grey\" stroke=\"transparent\" points=\"1695.5,-438 1695.5,-457 1886.5,-457 1886.5,-438 1695.5,-438\"/>\n",
-       "<text text-anchor=\"start\" x=\"1786.5\" y=\"-444.8\" font-family=\"DejaVu Sans\" font-weight=\"bold\" font-size=\"14.00\">b</text>\n",
+       "<polygon fill=\"grey\" stroke=\"transparent\" points=\"1683.5,-438 1683.5,-457 1874.5,-457 1874.5,-438 1683.5,-438\"/>\n",
+       "<text text-anchor=\"start\" x=\"1774.5\" y=\"-444.8\" font-family=\"DejaVu Sans\" font-weight=\"bold\" font-size=\"14.00\">b</text>\n",
        "<g id=\"a_node16_16\"><a xlink:href=\"http://www.example.org/unpublished-mul#b\" xlink:title=\"&lt;TABLE&gt;\">\n",
-       "<polygon fill=\"#eeeeee\" stroke=\"transparent\" points=\"1695.5,-423 1695.5,-438 1886.5,-438 1886.5,-423 1695.5,-423\"/>\n",
-       "<text text-anchor=\"start\" x=\"1697.5\" y=\"-428\" font-family=\"DejaVu Sans\" font-size=\"10.00\" fill=\"#6666ff\">http://www.example.org/unpublished&#45;mul#b</text>\n",
+       "<polygon fill=\"#eeeeee\" stroke=\"transparent\" points=\"1683.5,-423 1683.5,-438 1874.5,-438 1874.5,-423 1683.5,-423\"/>\n",
+       "<text text-anchor=\"start\" x=\"1685.5\" y=\"-428\" font-family=\"DejaVu Sans\" font-size=\"10.00\" fill=\"#6666ff\">http://www.example.org/unpublished&#45;mul#b</text>\n",
        "</a>\n",
        "</g>\n",
-       "<polygon fill=\"none\" stroke=\"#666666\" points=\"1694,-422 1694,-458 1887,-458 1887,-422 1694,-422\"/>\n",
+       "<polygon fill=\"none\" stroke=\"#666666\" points=\"1682,-422 1682,-458 1875,-458 1875,-422 1682,-422\"/>\n",
        "</g>\n",
        "<!-- node14&#45;&gt;node15 -->\n",
-       "<g id=\"edge11\" class=\"edge\">\n",
+       "<g id=\"edge14\" class=\"edge\">\n",
        "<title>node14&#45;&gt;node15</title>\n",
-       "<path fill=\"none\" stroke=\"BLACK\" d=\"M1790.5,-512.9C1790.5,-500.89 1790.5,-485.62 1790.5,-472.24\"/>\n",
-       "<polygon fill=\"BLACK\" stroke=\"BLACK\" points=\"1794,-472.02 1790.5,-462.02 1787,-472.02 1794,-472.02\"/>\n",
-       "<text text-anchor=\"start\" x=\"1790.5\" y=\"-484.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
-       "<text text-anchor=\"start\" x=\"1794.5\" y=\"-484.8\" font-family=\"Times,serif\" font-size=\"10.00\" fill=\"#336633\">pplan:bindsTo</text>\n",
-       "<text text-anchor=\"start\" x=\"1854.5\" y=\"-484.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
+       "<path fill=\"none\" stroke=\"BLACK\" d=\"M1778.5,-512.9C1778.5,-500.89 1778.5,-485.62 1778.5,-472.24\"/>\n",
+       "<polygon fill=\"BLACK\" stroke=\"BLACK\" points=\"1782,-472.02 1778.5,-462.02 1775,-472.02 1782,-472.02\"/>\n",
+       "<text text-anchor=\"start\" x=\"1778.5\" y=\"-484.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
+       "<text text-anchor=\"start\" x=\"1782.5\" y=\"-484.8\" font-family=\"Times,serif\" font-size=\"10.00\" fill=\"#336633\">pplan:bindsTo</text>\n",
+       "<text text-anchor=\"start\" x=\"1842.5\" y=\"-484.8\" font-family=\"Times,serif\" font-size=\"14.00\"> </text>\n",
        "</g>\n",
        "</g>\n",
        "</svg>\n"
       ],
       "text/plain": [
-       "<graphviz.files.Source at 0x7ff858bf2a50>"
+       "<graphviz.files.Source at 0x7fb11221fd50>"
       ]
      },
-     "execution_count": 24,
+     "execution_count": 9,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -588,7 +588,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "german-forest",
+   "id": "experimental-beach",
    "metadata": {},
    "source": [
     "## Publish the (prospective) workflow\n",
@@ -597,8 +597,8 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 25,
-   "id": "approved-damage",
+   "execution_count": 10,
+   "id": "artistic-continuity",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -607,7 +607,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "matched-colleague",
+   "id": "official-happiness",
    "metadata": {},
    "source": [
     "Be warned though - the above will keep publishing to the 'real' nanopub server network. For testing you may prefer to publish to the test servers as follows (note that this will refuse to publish a workflow you have already published :"
@@ -615,34 +615,34 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 27,
-   "id": "quarterly-shield",
+   "execution_count": 11,
+   "id": "biological-spyware",
    "metadata": {},
    "outputs": [
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "Published to http://purl.org/np/RArfw5pDGpdbmSFmqy43E8Q0qTESjloVrHPkGgWrrMk68\n",
-      "Published concept to http://purl.org/np/RArfw5pDGpdbmSFmqy43E8Q0qTESjloVrHPkGgWrrMk68#step\n",
-      "Published to http://purl.org/np/RABC9qOhvWb89wzSDhNfhMmA15cMHp7zfFaHBiwMZC7iA\n",
-      "Published concept to http://purl.org/np/RABC9qOhvWb89wzSDhNfhMmA15cMHp7zfFaHBiwMZC7iA#step\n",
-      "Published to http://purl.org/np/RAkelHhx0VSs6t1vvr15xXks3G7Hxast2jY80Eo9433ew\n",
-      "Published concept to http://purl.org/np/RAkelHhx0VSs6t1vvr15xXks3G7Hxast2jY80Eo9433ew#step\n",
-      "Published to http://purl.org/np/RAeVkW7gfsfXlmZlv9QkgI_C7DmNOCP6B4pEyJKwEIBgo\n",
-      "Published concept to http://purl.org/np/RAeVkW7gfsfXlmZlv9QkgI_C7DmNOCP6B4pEyJKwEIBgo#step\n",
-      "Published to http://purl.org/np/RAk8NF9sc1SpTS6CBvlvVV1QKRPBj040ezmar4nXclqGs\n",
-      "Published concept to http://purl.org/np/RAk8NF9sc1SpTS6CBvlvVV1QKRPBj040ezmar4nXclqGs#plan\n"
+      "Published to http://purl.org/np/RAyTHTDs-Qqqu4EVYQjva4JoxWxpCUApESi1AGh93oQkU\n",
+      "Published concept to http://purl.org/np/RAyTHTDs-Qqqu4EVYQjva4JoxWxpCUApESi1AGh93oQkU#step\n",
+      "Published to http://purl.org/np/RAf9o4Sso9DTfks61fYhCFFtQjvwqbDLGyShpDyUbf52w\n",
+      "Published concept to http://purl.org/np/RAf9o4Sso9DTfks61fYhCFFtQjvwqbDLGyShpDyUbf52w#step\n",
+      "Published to http://purl.org/np/RAq59L4lExTS_SdtWurLgLYANXJZUlqcU6f00TV8xHuJ8\n",
+      "Published concept to http://purl.org/np/RAq59L4lExTS_SdtWurLgLYANXJZUlqcU6f00TV8xHuJ8#step\n",
+      "Published to http://purl.org/np/RA6QiW9xeTK8QarZVSUWTipZRvjfux_VlrcZilArD6wnY\n",
+      "Published concept to http://purl.org/np/RA6QiW9xeTK8QarZVSUWTipZRvjfux_VlrcZilArD6wnY#step\n",
+      "Published to http://purl.org/np/RAPHCa5UMvnF40Jt7wimjUdxDMrMepUUqfAB9BTiA1tmY\n",
+      "Published concept to http://purl.org/np/RAPHCa5UMvnF40Jt7wimjUdxDMrMepUUqfAB9BTiA1tmY#plan\n"
      ]
     },
     {
      "data": {
       "text/plain": [
-       "{'nanopub_uri': 'http://purl.org/np/RAk8NF9sc1SpTS6CBvlvVV1QKRPBj040ezmar4nXclqGs',\n",
-       " 'concept_uri': 'http://purl.org/np/RAk8NF9sc1SpTS6CBvlvVV1QKRPBj040ezmar4nXclqGs#plan'}"
+       "{'nanopub_uri': 'http://purl.org/np/RAPHCa5UMvnF40Jt7wimjUdxDMrMepUUqfAB9BTiA1tmY',\n",
+       " 'concept_uri': 'http://purl.org/np/RAPHCa5UMvnF40Jt7wimjUdxDMrMepUUqfAB9BTiA1tmY#plan'}"
       ]
      },
-     "execution_count": 27,
+     "execution_count": 11,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -653,7 +653,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "black-jason",
+   "id": "loaded-milan",
    "metadata": {},
    "source": [
     "You can then find your nanopublications by replacing the base of the URI with http://test-server.nanopubs.lod.labs.vu.nl/"
@@ -661,7 +661,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "wrapped-toner",
+   "id": "derived-monitor",
    "metadata": {},
    "source": [
     "## Execute your workflow using .execute()\n",
@@ -670,8 +670,8 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 28,
-   "id": "civil-representative",
+   "execution_count": 12,
+   "id": "external-cambridge",
    "metadata": {},
    "outputs": [
     {
@@ -680,7 +680,7 @@
        "-66"
       ]
      },
-     "execution_count": 28,
+     "execution_count": 12,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -692,26 +692,26 @@
   },
   {
    "cell_type": "markdown",
-   "id": "distinct-share",
+   "id": "thirty-auction",
    "metadata": {},
    "source": [
-    " ## Retrospective prov\n",
-    " The retrospective prov object is not yet implemented, pending one of the RDF tasks set out in the planning document. For now, you may see simply the provenance trace for this run. We wish to turn this into a (Plex) RDF nanopublication:"
+    "### Retrospective prov\n",
+    "A WorkflowRetroProv object is returned along with the result of the execution."
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 31,
-   "id": "photographic-adrian",
+   "execution_count": 13,
+   "id": "developed-departure",
    "metadata": {},
    "outputs": [
     {
      "data": {
       "text/plain": [
-       "nanopub.publication.Publication"
+       "fairworkflows.prov.WorkflowRetroProv"
       ]
      },
-     "execution_count": 31,
+     "execution_count": 13,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -722,69 +722,226 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 32,
-   "id": "grateful-indication",
+   "execution_count": 14,
+   "id": "demanding-rally",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Workflow retrospective provenance.\n",
+      "@prefix pplan: <http://purl.org/net/p-plan#> .\n",
+      "@prefix prov: <http://www.w3.org/ns/prov#> .\n",
+      "\n",
+      "[] a pplan:Bundle,\n",
+      "        prov:Collection ;\n",
+      "    prov:wasDerivedFrom <http://purl.org/np/RAPHCa5UMvnF40Jt7wimjUdxDMrMepUUqfAB9BTiA1tmY#plan> .\n",
+      "\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(prov)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "dress-thunder",
+   "metadata": {},
+   "source": [
+    "### Retrospective prov for each step\n",
+    "You can iterate through a WorkflowRetroProv object to get the StepRetroProv objects for each step. Print these to see the RDF they contain (input/output variable values, start and end datetime of the step's execution etc.) "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 17,
+   "id": "vietnamese-soldier",
    "metadata": {},
    "outputs": [
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "Original source URI = None\n",
-      "@prefix : <http://purl.org/nanopub/temp/mynanopub#> .\n",
-      "@prefix np: <http://www.nanopub.org/nschema#> .\n",
+      "Step retrospective provenance.\n",
+      "@prefix pplan: <http://purl.org/net/p-plan#> .\n",
       "@prefix prov: <http://www.w3.org/ns/prov#> .\n",
+      "@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .\n",
       "@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\n",
       "@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .\n",
       "\n",
-      ":Head {\n",
-      "    : a np:Nanopublication ;\n",
-      "        np:hasAssertion :assertion ;\n",
-      "        np:hasProvenance :provenance ;\n",
-      "        np:hasPublicationInfo :pubInfo .\n",
-      "}\n",
+      "[] a pplan:Activity ;\n",
+      "    pplan:correspondsToStep <http://purl.org/np/RAyTHTDs-Qqqu4EVYQjva4JoxWxpCUApESi1AGh93oQkU#step> ;\n",
+      "    prov:endedAtTime \"2021-03-05T13:14:00.084623\"^^xsd:dateTime ;\n",
+      "    prov:startedAtTime \"2021-03-05T13:14:00.084616\"^^xsd:dateTime ;\n",
+      "    prov:used [ a pplan:Entity ;\n",
+      "            rdfs:label \"a\" ;\n",
+      "            pplan:correspondsToVariable <http://purl.org/np/RAyTHTDs-Qqqu4EVYQjva4JoxWxpCUApESi1AGh93oQkU#a> ;\n",
+      "            rdf:value 1 ],\n",
+      "        [ a pplan:Entity ;\n",
+      "            rdfs:label \"b\" ;\n",
+      "            pplan:correspondsToVariable <http://purl.org/np/RAyTHTDs-Qqqu4EVYQjva4JoxWxpCUApESi1AGh93oQkU#b> ;\n",
+      "            rdf:value 4 ],\n",
+      "        [ a pplan:Entity ;\n",
+      "            rdfs:label \"out1\" ;\n",
+      "            pplan:correspondsToVariable <http://purl.org/np/RAyTHTDs-Qqqu4EVYQjva4JoxWxpCUApESi1AGh93oQkU#out1> ;\n",
+      "            rdf:value 5 ] .\n",
       "\n",
-      ":assertion {\n",
-      "    :retroprov a prov:Activity ;\n",
-      "        rdfs:label \"\"\"2021-02-16 13:39:47,454 - Running step: add\n",
-      "2021-02-16 13:39:47,455 - Running step: sub\n",
-      "2021-02-16 13:39:47,455 - Running step: weird\n",
-      "2021-02-16 13:39:47,455 - Running step: mul\n",
-      "\"\"\" ;\n",
-      "        prov:wasDerivedFrom <http://purl.org/np/RAk8NF9sc1SpTS6CBvlvVV1QKRPBj040ezmar4nXclqGs#plan> .\n",
-      "}\n",
       "\n",
-      ":provenance {\n",
-      "    :assertion prov:generatedAtTime \"2021-02-16T13:39:47.456746\"^^xsd:dateTime .\n",
-      "}\n",
+      "Step retrospective provenance.\n",
+      "@prefix pplan: <http://purl.org/net/p-plan#> .\n",
+      "@prefix prov: <http://www.w3.org/ns/prov#> .\n",
+      "@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .\n",
+      "@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\n",
+      "@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .\n",
       "\n",
-      ":pubInfo {\n",
-      "    : prov:generatedAtTime \"2021-02-16T13:39:47.456746\"^^xsd:dateTime ;\n",
-      "        prov:wasAttributedTo <https://orcid.org/0000-0000-0000-0000> .\n",
-      "}\n",
+      "[] a pplan:Activity ;\n",
+      "    pplan:correspondsToStep <http://purl.org/np/RAq59L4lExTS_SdtWurLgLYANXJZUlqcU6f00TV8xHuJ8#step> ;\n",
+      "    prov:endedAtTime \"2021-03-05T13:14:00.086260\"^^xsd:dateTime ;\n",
+      "    prov:startedAtTime \"2021-03-05T13:14:00.086257\"^^xsd:dateTime ;\n",
+      "    prov:used [ a pplan:Entity ;\n",
+      "            rdfs:label \"a\" ;\n",
+      "            pplan:correspondsToVariable <http://purl.org/np/RAq59L4lExTS_SdtWurLgLYANXJZUlqcU6f00TV8xHuJ8#a> ;\n",
+      "            rdf:value 1 ],\n",
+      "        [ a pplan:Entity ;\n",
+      "            rdfs:label \"b\" ;\n",
+      "            pplan:correspondsToVariable <http://purl.org/np/RAq59L4lExTS_SdtWurLgLYANXJZUlqcU6f00TV8xHuJ8#b> ;\n",
+      "            rdf:value 4 ],\n",
+      "        [ a pplan:Entity ;\n",
+      "            rdfs:label \"out1\" ;\n",
+      "            pplan:correspondsToVariable <http://purl.org/np/RAq59L4lExTS_SdtWurLgLYANXJZUlqcU6f00TV8xHuJ8#out1> ;\n",
+      "            rdf:value -3 ] .\n",
+      "\n",
+      "\n",
+      "Step retrospective provenance.\n",
+      "@prefix pplan: <http://purl.org/net/p-plan#> .\n",
+      "@prefix prov: <http://www.w3.org/ns/prov#> .\n",
+      "@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .\n",
+      "@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\n",
+      "@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .\n",
+      "\n",
+      "[] a pplan:Activity ;\n",
+      "    pplan:correspondsToStep <http://purl.org/np/RAf9o4Sso9DTfks61fYhCFFtQjvwqbDLGyShpDyUbf52w#step> ;\n",
+      "    prov:endedAtTime \"2021-03-05T13:14:00.087809\"^^xsd:dateTime ;\n",
+      "    prov:startedAtTime \"2021-03-05T13:14:00.087805\"^^xsd:dateTime ;\n",
+      "    prov:used [ a pplan:Entity ;\n",
+      "            rdfs:label \"a\" ;\n",
+      "            pplan:correspondsToVariable <http://purl.org/np/RAf9o4Sso9DTfks61fYhCFFtQjvwqbDLGyShpDyUbf52w#a> ;\n",
+      "            rdf:value 5 ],\n",
+      "        [ a pplan:Entity ;\n",
+      "            rdfs:label \"b\" ;\n",
+      "            pplan:correspondsToVariable <http://purl.org/np/RAf9o4Sso9DTfks61fYhCFFtQjvwqbDLGyShpDyUbf52w#b> ;\n",
+      "            rdf:value 3 ],\n",
+      "        [ a pplan:Entity ;\n",
+      "            rdfs:label \"out1\" ;\n",
+      "            pplan:correspondsToVariable <http://purl.org/np/RAf9o4Sso9DTfks61fYhCFFtQjvwqbDLGyShpDyUbf52w#out1> ;\n",
+      "            rdf:value 22 ] .\n",
+      "\n",
+      "\n",
+      "Step retrospective provenance.\n",
+      "@prefix pplan: <http://purl.org/net/p-plan#> .\n",
+      "@prefix prov: <http://www.w3.org/ns/prov#> .\n",
+      "@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .\n",
+      "@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\n",
+      "@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .\n",
+      "\n",
+      "[] a pplan:Activity ;\n",
+      "    pplan:correspondsToStep <http://purl.org/np/RA6QiW9xeTK8QarZVSUWTipZRvjfux_VlrcZilArD6wnY#step> ;\n",
+      "    prov:endedAtTime \"2021-03-05T13:14:00.089282\"^^xsd:dateTime ;\n",
+      "    prov:startedAtTime \"2021-03-05T13:14:00.089278\"^^xsd:dateTime ;\n",
+      "    prov:used [ a pplan:Entity ;\n",
+      "            rdfs:label \"a\" ;\n",
+      "            pplan:correspondsToVariable <http://purl.org/np/RA6QiW9xeTK8QarZVSUWTipZRvjfux_VlrcZilArD6wnY#a> ;\n",
+      "            rdf:value 22 ],\n",
+      "        [ a pplan:Entity ;\n",
+      "            rdfs:label \"b\" ;\n",
+      "            pplan:correspondsToVariable <http://purl.org/np/RA6QiW9xeTK8QarZVSUWTipZRvjfux_VlrcZilArD6wnY#b> ;\n",
+      "            rdf:value -3 ],\n",
+      "        [ a pplan:Entity ;\n",
+      "            rdfs:label \"out1\" ;\n",
+      "            pplan:correspondsToVariable <http://purl.org/np/RA6QiW9xeTK8QarZVSUWTipZRvjfux_VlrcZilArD6wnY#out1> ;\n",
+      "            rdf:value -66 ] .\n",
       "\n",
       "\n"
      ]
     }
    ],
    "source": [
-    "print(prov)"
+    "for sp in prov:\n",
+    "    print(sp)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "occupational-enclosure",
+   "metadata": {},
+   "source": [
+    "### Publish the retrospective provenance\n",
+    "You can use the .publish_as_nanopub() method as with FairStep and FairWorkflow objects. This publishes a nanopub per step and one for the whole workflow, mirroring the prospective RDF."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 16,
+   "id": "mediterranean-accessory",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Published to http://purl.org/np/RAS5YybkJDH1go2SOQBqfoz1po5nHiyzRmNVgOW_CjiWs\n",
+      "Published concept to http://purl.org/np/RAS5YybkJDH1go2SOQBqfoz1po5nHiyzRmNVgOW_CjiWs#fairstepprov\n",
+      "Published to http://purl.org/np/RA7UtS-evZuhRiXnBVfCHElgzbnqAn3p7Sfyuuwh7bvP8\n",
+      "Published concept to http://purl.org/np/RA7UtS-evZuhRiXnBVfCHElgzbnqAn3p7Sfyuuwh7bvP8#fairstepprov\n",
+      "Published to http://purl.org/np/RAwoC5X6IiDrlsKS_ilgNN_DVGrr2THL30DeElETlC_ac\n",
+      "Published concept to http://purl.org/np/RAwoC5X6IiDrlsKS_ilgNN_DVGrr2THL30DeElETlC_ac#fairstepprov\n",
+      "Published to http://purl.org/np/RACERKeebWRMrV3-i0rgYGWtE3-7AGIVfHmWs8Gl34Zro\n",
+      "Published concept to http://purl.org/np/RACERKeebWRMrV3-i0rgYGWtE3-7AGIVfHmWs8Gl34Zro#fairstepprov\n",
+      "Published to http://purl.org/np/RAoV5hX_Hz9Ce_hJtmYNxGAqzrfM45KzokI_Pdr8HOAgQ\n",
+      "Published concept to http://purl.org/np/RAoV5hX_Hz9Ce_hJtmYNxGAqzrfM45KzokI_Pdr8HOAgQ#fairworkflowprov\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "{'nanopub_uri': 'http://purl.org/np/RAoV5hX_Hz9Ce_hJtmYNxGAqzrfM45KzokI_Pdr8HOAgQ',\n",
+       " 'concept_uri': 'http://purl.org/np/RAoV5hX_Hz9Ce_hJtmYNxGAqzrfM45KzokI_Pdr8HOAgQ#fairworkflowprov'}"
+      ]
+     },
+     "execution_count": 16,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "prov.publish_as_nanopub(use_test_server=True)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "everyday-wonder",
+   "metadata": {},
+   "source": [
+    "The last nanopub (whose URI ends in #fairworkflowprov) contains the links to all of the individual step retrospective provenances."
    ]
   },
   {
    "cell_type": "markdown",
-   "id": "official-broad",
+   "id": "colored-integrity",
    "metadata": {},
    "source": [
-    "### Provide semantic annotations for input and output variables\n",
+    "## Provide semantic annotations for input and output variables\n",
     "If you wish to specify semantic types for the inputs/outputs to a step, you can do so in the arguments to the decorator.\n",
     "For example, if you have an input parameter 'a', you can write a='http://www.example.org/distance' to assign that (semantic) type to a. As output of functions is not named in python, you can specify the same but with 'out1', 'out2' etc. See the following example:"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 33,
-   "id": "partial-northwest",
+   "execution_count": 16,
+   "id": "capital-oracle",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -795,7 +952,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "retired-stupid",
+   "id": "stone-desire",
    "metadata": {},
    "source": [
     "If we now look at the RDF generated for the step, we will see that input parameter 'a' and the step output ('out1') both have the (additional) semantic types specified."
@@ -803,8 +960,8 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 34,
-   "id": "junior-coordinate",
+   "execution_count": 17,
+   "id": "sunset-crime",
    "metadata": {},
    "outputs": [
     {
@@ -819,7 +976,7 @@
       "@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\n",
       "@prefix schema: <https://schema.org/> .\n",
       "\n",
-      "_:Nd2641b6028ec4f02b285cf7d74ef3902 {\n",
+      "_:N55c6db2a96b4414499dd088141690acb {\n",
       "    [] a bpmn:ScriptTask,\n",
       "            pplan:Step ;\n",
       "        rdfs:label \"Addition\" ;\n",
@@ -829,7 +986,7 @@
       "\"\"\" ;\n",
       "        dc:language [ a schema:ComputerLanguage ;\n",
       "                rdfs:label \"python\" ;\n",
-      "                rdfs:seeAlso <https://en.wikipedia.org/wiki/Python_(programming_language)> ;\n",
+      "                rdfs:seeAlso <https://www.wikidata.org/wiki/Q28865> ;\n",
       "                owl:versionInfo \"3.7.9.final.0\" ] ;\n",
       "        pplan:hasInputVar [ a pplan:Variable,\n",
       "                    <http://www.example.org/distance> ;\n",
@@ -856,7 +1013,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "detailed-sherman",
+   "id": "scenic-appendix",
    "metadata": {},
    "source": [
     "### Specify more than one semantic type for a parameter\n",
@@ -865,8 +1022,8 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 35,
-   "id": "increased-highland",
+   "execution_count": 18,
+   "id": "blond-communist",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -878,8 +1035,8 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 36,
-   "id": "special-doctrine",
+   "execution_count": 19,
+   "id": "challenging-responsibility",
    "metadata": {},
    "outputs": [
     {
@@ -894,7 +1051,7 @@
       "@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\n",
       "@prefix schema: <https://schema.org/> .\n",
       "\n",
-      "_:N0d48ef67a35e4611b0c5eaaa15436b88 {\n",
+      "_:Nab534dffa6f1415cbbd25881f8d8e11d {\n",
       "    [] a bpmn:ScriptTask,\n",
       "            pplan:Step ;\n",
       "        rdfs:label \"Addition\" ;\n",
@@ -905,7 +1062,7 @@
       "\"\"\" ;\n",
       "        dc:language [ a schema:ComputerLanguage ;\n",
       "                rdfs:label \"python\" ;\n",
-      "                rdfs:seeAlso <https://en.wikipedia.org/wiki/Python_(programming_language)> ;\n",
+      "                rdfs:seeAlso <https://www.wikidata.org/wiki/Q28865> ;\n",
       "                owl:versionInfo \"3.7.9.final.0\" ] ;\n",
       "        pplan:hasInputVar [ a pplan:Variable,\n",
       "                    <http://www.example.org/distance>,\n",
@@ -930,7 +1087,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "eligible-dollar",
+   "id": "analyzed-motel",
    "metadata": {},
    "source": [
     "You can check the programming language that was used for writing the step:"
@@ -938,15 +1095,15 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 39,
-   "id": "decent-anatomy",
+   "execution_count": 19,
+   "id": "arbitrary-philippines",
    "metadata": {},
    "outputs": [
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "LinguisticSystem with type=https://schema.org/ComputerLanguage, label=python, seeAlso=https://en.wikipedia.org/wiki/Python_(programming_language), versionInfo=3.7.9.final.0\n"
+      "LinguisticSystem with type=https://schema.org/ComputerLanguage, label=python, seeAlso=https://www.wikidata.org/wiki/Q28865, versionInfo=3.7.9.final.0\n"
      ]
     }
    ],
@@ -956,7 +1113,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "flush-grove",
+   "id": "brilliant-composition",
    "metadata": {},
    "source": [
     "## Semantic types for function producing multiple outputs\n",
@@ -965,8 +1122,8 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 40,
-   "id": "personalized-wilson",
+   "execution_count": 20,
+   "id": "ready-geneva",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -978,8 +1135,8 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 41,
-   "id": "certified-guess",
+   "execution_count": 21,
+   "id": "disturbed-seven",
    "metadata": {},
    "outputs": [
     {
@@ -994,7 +1151,7 @@
       "@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\n",
       "@prefix schema: <https://schema.org/> .\n",
       "\n",
-      "_:N049c5deb99fe48d1a04b060b07a455b3 {\n",
+      "_:N1345fcd9251f4f8b86ee8e59bbab507d {\n",
       "    [] a bpmn:ScriptTask,\n",
       "            pplan:Step ;\n",
       "        rdfs:label \"Addition and subtraction\" ;\n",
@@ -1004,7 +1161,7 @@
       "\"\"\" ;\n",
       "        dc:language [ a schema:ComputerLanguage ;\n",
       "                rdfs:label \"python\" ;\n",
-      "                rdfs:seeAlso <https://en.wikipedia.org/wiki/Python_(programming_language)> ;\n",
+      "                rdfs:seeAlso <https://www.wikidata.org/wiki/Q28865> ;\n",
       "                owl:versionInfo \"3.7.9.final.0\" ] ;\n",
       "        pplan:hasInputVar [ a pplan:Variable ;\n",
       "                rdfs:label \"a\" ;\n",
@@ -1032,7 +1189,7 @@
   },
   {
    "cell_type": "markdown",
-   "id": "surprising-optics",
+   "id": "failing-standard",
    "metadata": {},
    "source": [
     "As before, you may provide a list of URIs for each output. If you do not want to provide semantic types for a particular output, simply pass None:"
@@ -1040,8 +1197,8 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 42,
-   "id": "correct-perry",
+   "execution_count": 22,
+   "id": "pressing-houston",
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1054,8 +1211,8 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 43,
-   "id": "extensive-standing",
+   "execution_count": 23,
+   "id": "impaired-element",
    "metadata": {},
    "outputs": [
     {
@@ -1070,7 +1227,7 @@
       "@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\n",
       "@prefix schema: <https://schema.org/> .\n",
       "\n",
-      "_:N230e6f57b6fc4bc1be68bcfa1a6edb6c {\n",
+      "_:Nd65e996b1d9546a4899eaff4131e159f {\n",
       "    [] a bpmn:ScriptTask,\n",
       "            pplan:Step ;\n",
       "        rdfs:label \"Addition and subtraction\" ;\n",
@@ -1081,7 +1238,7 @@
       "\"\"\" ;\n",
       "        dc:language [ a schema:ComputerLanguage ;\n",
       "                rdfs:label \"python\" ;\n",
-      "                rdfs:seeAlso <https://en.wikipedia.org/wiki/Python_(programming_language)> ;\n",
+      "                rdfs:seeAlso <https://www.wikidata.org/wiki/Q28865> ;\n",
       "                owl:versionInfo \"3.7.9.final.0\" ] ;\n",
       "        pplan:hasInputVar [ a pplan:Variable ;\n",
       "                rdfs:label \"a\" ;\n",
@@ -1110,7 +1267,7 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "criminal-fifty",
+   "id": "neural-commissioner",
    "metadata": {},
    "outputs": [],
    "source": []
diff --git a/fairworkflows/_version.py b/fairworkflows/_version.py
index 788da1f..fe404ae 100644
--- a/fairworkflows/_version.py
+++ b/fairworkflows/_version.py
@@ -1,1 +1,1 @@
-__version__ = "0.2.4"
+__version__ = "0.2.5"
diff --git a/fairworkflows/fairstep.py b/fairworkflows/fairstep.py
index b409a74..554dfba 100644
--- a/fairworkflows/fairstep.py
+++ b/fairworkflows/fairstep.py
@@ -5,6 +5,7 @@
 from copy import deepcopy
 from typing import Callable, get_type_hints, List, Union
 from urllib.parse import urldefrag
+from datetime import datetime
 
 import noodles
 import rdflib
@@ -38,13 +39,23 @@ class FairVariable:
                             become mapped to e.g. XSD types.
         semantic_types: One or more URIs that describe the semantic type(s) of this FairVariable.
     """
-    def __init__(self, name: str = None, computational_type: str = None, semantic_types = None, uri: str = None):
+    def __init__(self, name: str = None, computational_type: str = None, semantic_types = None, uri: str = None, stepuri: str = None):
         if uri and name is None:
             # Get the name from the uri (i.e. 'input1' from http://example.org#input1)
             _, name = urldefrag(uri)
+
+        if name is None and uri is None:
+            raise ValueError('Both name and uri cannot both be None when constructing a FairVariable.')
+
         self.name = name
         self.computational_type = computational_type
 
+        if uri:
+            self._uri = rdflib.URIRef(uri)
+        else:
+            step_base_uri, _ = urldefrag(stepuri)
+            self._uri = rdflib.Namespace(step_base_uri)['#' + name]
+
         if semantic_types is None:
             self.semantic_types = []
         else:
@@ -53,6 +64,11 @@ def __init__(self, name: str = None, computational_type: str = None, semantic_ty
             else:
                 self.semantic_types = [rdflib.URIRef(t) for t in semantic_types]
 
+    @property
+    def uri(self):
+        if self._uri:
+            return self._uri
+
     def __eq__(self, other):
         return self.name == other.name and self.computational_type == other.computational_type
 
@@ -60,7 +76,8 @@ def __hash__(self):
         return hash(str(self))
 
     def __str__(self):
-        return f'FairVariable {self.name} of computational type: {self.computational_type} and semantic types: {self.semantic_types}'
+        return (f'FairVariable {self.name} of computational type: {self.computational_type},'
+                f'semantic types: {self.semantic_types}.\nHas URI {self.uri}.\n')
 
 
 class FairStep(RdfWrapper):
@@ -237,6 +254,10 @@ def is_script_task(self, value: bool):
 
     def _get_variable(self, var_ref: Union[rdflib.term.BNode, rdflib.URIRef]) -> FairVariable:
         """Retrieve a specific FairVariable from the RDF triples."""
+
+        if var_ref is None:
+            raise ValueError('Variable reference var_ref cannot be None.')
+
         rdfs_comment_objs = list(self._rdf.objects(var_ref, RDFS.comment))
         computational_type = str(rdfs_comment_objs[0])
 
@@ -245,9 +266,9 @@ def _get_variable(self, var_ref: Union[rdflib.term.BNode, rdflib.URIRef]) -> Fai
         sem_types = [sem_type for sem_type in sem_type_objs if sem_type != namespaces.PPLAN.Variable]
 
         if isinstance(var_ref, rdflib.term.BNode):
-            return FairVariable(name=str(var_ref), computational_type=computational_type, semantic_types=sem_types)
+            return FairVariable(name=str(var_ref), computational_type=computational_type, semantic_types=sem_types, stepuri=self._uri)
         else:
-            return FairVariable(uri=str(var_ref), computational_type=computational_type, semantic_types=sem_types)
+            return FairVariable(uri=str(var_ref), computational_type=computational_type, semantic_types=sem_types, stepuri=self._uri)
 
     def _add_variable(self, variable: FairVariable, relation_to_step):
         """Add triples describing FairVariable to rdf."""
@@ -360,12 +381,15 @@ def publish_as_nanopub(self, use_test_server=False, **kwargs):
                            newvalue=rdflib.URIRef(self.uri))
 
             # Similarly replace old URIs for variable name bindings
+            # in both this step and any workflow objects that use it.
             published_step_uri_defrag, _ = urldefrag(self.uri)
             for var_name in var_names:
                 old_var_uri = old_uri + '#' + var_name
                 new_var_uri = published_step_uri_defrag + '#' + var_name
                 replace_in_rdf(self.rdf, oldvalue=rdflib.URIRef(old_var_uri),
                                newvalue=rdflib.URIRef(new_var_uri))
+                replace_in_rdf(workflow.rdf, oldvalue=rdflib.URIRef(old_var_uri),
+                               newvalue=rdflib.URIRef(new_var_uri))
             del workflow._steps[old_uri]
             workflow._steps[self.uri] = self
 
@@ -442,8 +466,21 @@ def _modify_function(func):
         def _add_logging(func):
             @functools.wraps(func)
             def _wrapper(*func_args, **func_kwargs):
-                prov_logger.add(StepRetroProv(step=fairstep))
-                return func(*func_args, **func_kwargs)
+
+                # Get the arg label/value pairs as a dict (for both args and kwargs)
+                func_args_dict = dict(zip(inspect.getfullargspec(func).args, func_args))
+                all_args = {**func_args_dict, **func_kwargs}
+
+                # Execute step (with timing)
+                t0 = datetime.now()
+                execution_result = func(*func_args, **func_kwargs)
+                t1 = datetime.now()
+
+                # Log step execution
+                prov_logger.add(StepRetroProv(step=fairstep, step_args=all_args, output=execution_result, time_start=t0, time_end=t1))
+
+                return execution_result
+
             return _wrapper
         func._fairstep = fairstep
         return noodles.schedule(_add_logging(func))
diff --git a/fairworkflows/prov.py b/fairworkflows/prov.py
index d138b62..ec94e36 100644
--- a/fairworkflows/prov.py
+++ b/fairworkflows/prov.py
@@ -1,6 +1,6 @@
 import threading
 from datetime import datetime
-from typing import List, Iterator
+from typing import List, Iterator, Dict
 
 import rdflib
 
@@ -29,46 +29,102 @@ def empty(self):
 prov_logger = ProvLogger()
 
 
-class RetroProv(RdfWrapper):
-    def __init__(self):
-        super().__init__(uri=None, ref_name='retroprov')
-        self.timestamp = datetime.now()
-
-
-class StepRetroProv(RetroProv):
-    def __init__(self, step):
-        super().__init__()
+class StepRetroProv(RdfWrapper):
+    def __init__(self, step=None, step_args:Dict = None, time_start:datetime = None, time_end:datetime = None, output=None):
+        super().__init__(uri=None, ref_name='fairstepprov')
         self.set_attribute(rdflib.RDF.type, namespaces.PPLAN.Activity)
         self.step = step
         self.step_uri = step.uri
 
+        stepbase = rdflib.Namespace(step.uri)
+
+        # Bind inputs
+        for inputvar in step.inputs:
+            if inputvar.name in step_args:
+                retrovar = rdflib.BNode(inputvar.name)
+                self._rdf.add( (self.self_ref, namespaces.PROV.used, retrovar) )
+                self._rdf.add( (retrovar, rdflib.RDF.type, namespaces.PPLAN.Entity) )
+                self._rdf.add( (retrovar, rdflib.RDFS.label, rdflib.Literal(inputvar.name)) )
+                self._rdf.add( (retrovar, rdflib.RDF.value, rdflib.Literal(step_args[inputvar.name])) )
+
+                if inputvar.uri:
+                    self._rdf.add( (retrovar, namespaces.PPLAN.correspondsToVariable, inputvar.uri) )
+
+        # Bind outputs
+        num_outputs = len(list(step.outputs))
+        if num_outputs == 1:
+            outvardict = {'out1': output}
+        else:
+            outvardict = {('out' + str(i)): outval for i, outval in enumerate(output) }
+
+        for outputvar in step.outputs:
+            retrovar = rdflib.BNode(outputvar.name)
+            if outputvar.name in outvardict:
+                self._rdf.add( (self.self_ref, namespaces.PROV.used, retrovar) )
+                self._rdf.add( (retrovar, rdflib.RDF.type, namespaces.PPLAN.Entity) )
+                self._rdf.add( (retrovar, rdflib.RDFS.label, rdflib.Literal(outputvar.name)) )
+                self._rdf.add( (retrovar, rdflib.RDF.value, rdflib.Literal(outvardict[outputvar.name])) )
+
+                if outputvar.uri:
+                    self._rdf.add( (retrovar, namespaces.PPLAN.correspondsToVariable, outputvar.uri) )
+
+        # Add times to RDF (if available)
+        if time_start:
+            self.set_attribute(namespaces.PROV.startedAtTime, rdflib.Literal(time_start, datatype=rdflib.XSD.dateTime))
+        if time_end:
+            self.set_attribute(namespaces.PROV.endedAtTime, rdflib.Literal(time_end, datatype=rdflib.XSD.dateTime))
+
     @property
     def step_uri(self):
         """Refers to URI of step associated to this provenance.
 
-        Matches the predicate prov:wasDerivedFrom associated to this retrospective provenance
+        Matches the predicate pplan:correspondsToStep associated to this retrospective provenance
         """
-        return self.get_attribute(namespaces.PROV.wasDerivedFrom)
+        return self.get_attribute(namespaces.PPLAN.correspondsToStep)
 
     @step_uri.setter
     def step_uri(self, value):
         self.set_attribute(namespaces.PPLAN.correspondsToStep, rdflib.URIRef(value), overwrite=True)
 
+    def publish_as_nanopub(self, use_test_server=False, **kwargs):
+        """
+        Publish this rdf as a nanopublication.
+
+        Args:
+            use_test_server (bool): Toggle using the test nanopub server.
+            kwargs: Keyword arguments to be passed to [nanopub.Publication.from_assertion](
+                https://nanopub.readthedocs.io/en/latest/reference/publication.html#
+                nanopub.publication.Publication.from_assertion).
+                This allows for more control over the nanopublication RDF.
+
+        Returns:
+            a dictionary with publication info, including 'nanopub_uri', and 'concept_uri'
+        """
+        return self._publish_as_nanopub(use_test_server=use_test_server, **kwargs)
+
     def __str__(self):
         """String representation."""
         s = f'Step retrospective provenance.\n'
-        s += self._rdf.serialize(format='trig').decode('utf-8')
+        s += self._rdf.serialize(format='turtle').decode('utf-8')
         return s
 
 
-class WorkflowRetroProv(RetroProv):
+class WorkflowRetroProv(RdfWrapper):
     def __init__(self, workflow, workflow_uri, step_provs: List[StepRetroProv]):
-        super().__init__()
-        self.set_attribute(rdflib.RDF.type, namespaces.PPLAN.Bundle)
+        super().__init__(uri=None, ref_name='fairworkflowprov')
+        self._rdf.add((self.self_ref, rdflib.RDF.type, namespaces.PPLAN.Bundle))
+        self._rdf.add((self.self_ref, rdflib.RDF.type, namespaces.PROV.Collection))
         self.workflow = workflow
         self.workflow_uri = workflow_uri
         self._step_provs = step_provs
 
+        # Add the Entity links for now (dummy links, if unpublished)
+        for stepprov in self._step_provs:
+            if stepprov.uri:
+                self._rdf.add((self.self_ref, namespaces.PROV.hasMember, rdflib.URIRef(stepprov.uri)))
+            else:
+                self._rdf.add((self.self_ref, namespaces.PROV.hasMember, rdflib.URIRef('http://www.example.org/unpublished-entity-' + str(hash(stepprov)))))
+
     @property
     def workflow_uri(self):
         """Refers to URI of step associated to this provenance.
@@ -88,8 +144,32 @@ def __iter__(self) -> Iterator[StepRetroProv]:
     def __len__(self) -> int:
         return len(self._step_provs)
 
+    def publish_as_nanopub(self, use_test_server=False, **kwargs):
+        """
+        Publish this rdf as a nanopublication.
+
+        Args:
+            use_test_server (bool): Toggle using the test nanopub server.
+            kwargs: Keyword arguments to be passed to [nanopub.Publication.from_assertion](
+                https://nanopub.readthedocs.io/en/latest/reference/publication.html#
+                nanopub.publication.Publication.from_assertion).
+                This allows for more control over the nanopublication RDF.
+
+        Returns:
+            a dictionary with publication info, including 'nanopub_uri', and 'concept_uri'
+        """
+
+        # Clear existing members of this entity (to be replaced with newly published links)
+        self.remove_attribute(namespaces.PROV.hasMember)
+
+        for stepprov in self._step_provs:
+            stepprov.publish_as_nanopub(use_test_server=use_test_server, **kwargs)
+            self._rdf.add((self.self_ref, namespaces.PROV.hasMember, rdflib.URIRef(stepprov.uri)))
+
+        return self._publish_as_nanopub(use_test_server=use_test_server, **kwargs)
+
     def __str__(self):
         """String representation."""
         s = f'Workflow retrospective provenance.\n'
-        s += self._rdf.serialize(format='trig').decode('utf-8')
+        s += self._rdf.serialize(format='turtle').decode('utf-8')
         return s
diff --git a/fairworkflows/rdf_wrapper.py b/fairworkflows/rdf_wrapper.py
index 0cfae89..f9d5a69 100644
--- a/fairworkflows/rdf_wrapper.py
+++ b/fairworkflows/rdf_wrapper.py
@@ -19,7 +19,10 @@ class RdfWrapper:
     def __init__(self, uri, ref_name='fairobject', derived_from: List[str] = None,
                  language: LinguisticSystem = None ):
         self._rdf = rdflib.Graph()
-        self._uri = str(uri)
+        if uri:
+            self._uri = str(uri)
+        else:
+            self._uri = None
         self.self_ref = rdflib.term.BNode(ref_name)
         self._is_modified = False
         self._is_published = False
@@ -30,7 +33,6 @@ def __init__(self, uri, ref_name='fairobject', derived_from: List[str] = None,
         # A blank node to which triples about the linguistic
         # system for this FAIR object can be added
         self.lingsys_ref = rdflib.BNode('LinguisticSystem')
-        self._rdf.add((self.self_ref, DCTERMS.language, self.lingsys_ref))
 
         if language is not None:
             self.language = language
@@ -42,6 +44,7 @@ def _bind_namespaces(self):
         """
         self.rdf.bind("npx", namespaces.NPX)
         self.rdf.bind("pplan", namespaces.PPLAN)
+        self.rdf.bind("prov", namespaces.PROV)
         self.rdf.bind("dul", namespaces.DUL)
         self.rdf.bind("bpmn", namespaces.BPMN)
         self.rdf.bind("pwo", namespaces.PWO)
@@ -163,16 +166,23 @@ def language(self):
         """Returns the language for this fair objects's description (could be code).
            Returns a LinguisticSystem object.
         """
-        lingsys_rdf = rdflib.Graph()
-        for t in self._rdf.triples((self.lingsys_ref, None, None)):
-            lingsys_rdf.add(t)
-        return LinguisticSystem.from_rdf(lingsys_rdf)
+        if (None, DCTERMS.language, self.lingsys_ref) in self._rdf:
+            lingsys_rdf = rdflib.Graph()
+            for t in self._rdf.triples((self.lingsys_ref, None, None)):
+                lingsys_rdf.add(t)
+            return LinguisticSystem.from_rdf(lingsys_rdf)
+        else:
+            return None
 
     @language.setter
     def language(self, value: LinguisticSystem):
         """Sets the language for this fair object's code (takes a LinguisticSystem).
            Removes the existing linguistic system triples from the RDF decription
            and replaces them with the new linguistic system."""
+
+        if (None, DCTERMS.language, self.lingsys_ref) not in self._rdf:
+            self._rdf.add((self.self_ref, DCTERMS.language, self.lingsys_ref))
+
         lingsys_triples = list(self._rdf.triples( (self.lingsys_ref, None, None) ))
         if len(lingsys_triples) > 0:
             self._rdf.remove(lingsys_triples)
@@ -299,6 +309,7 @@ def _publish_as_nanopub(self, use_test_server=False, **kwargs):
                                              introduces_concept=self.self_ref,
                                              derived_from=self._derived_from,
                                              **kwargs)
+
         client = NanopubClient(use_test_server=use_test_server)
         publication_info = client.publish(nanopub)
 
diff --git a/requirements.txt b/requirements.txt
index 30ff9b3..1bd2462 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,4 +1,4 @@
-nanopub==1.2.3
+nanopub==1.2.5
 networkx~=2.5
 pytest
 pyyaml


Test patch:
diff --git a/tests/test_fairstep.py b/tests/test_fairstep.py
index 8b4f525..85cb119 100644
--- a/tests/test_fairstep.py
+++ b/tests/test_fairstep.py
@@ -246,8 +246,8 @@ def test_shacl_does_not_validate(self):
 
         assert len(step.rdf) == n_triples_before, 'shacl_validate mutated RDF'
 
-
-def test_is_fairstep_decorator():
+@patch('fairworkflows.rdf_wrapper.NanopubClient.publish')
+def test_is_fairstep_decorator(mock_publish):
     @is_fairstep(label='test_label')
     def add(a: int, b: int) -> int:
         """
@@ -257,6 +257,9 @@ def add(a: int, b: int) -> int:
 
     assert hasattr(add(1,2), '_fairstep')
 
+    add._fairstep.publish_as_nanopub()
+    assert mock_publish.call_count == 1
+
 def test_decorator_semantic_types():
     test_types_a = ['http://www.example.org/distance', 'http://www.example.org/number']
     test_type_output = 'http://www.example.org/walrus'
diff --git a/tests/test_fairworkflow.py b/tests/test_fairworkflow.py
index e368e9c..e25601a 100644
--- a/tests/test_fairworkflow.py
+++ b/tests/test_fairworkflow.py
@@ -308,10 +308,12 @@ def test_publish_as_nanopub_no_modifications(self, mock_publish, test_workflow):
         assert mock_publish.call_count == 0
         assert pubinfo['nanopub_uri'] is None
 
-    def test_workflow_construction_and_execution(self):
+    @mock.patch('fairworkflows.rdf_wrapper.NanopubClient.publish')
+    def test_workflow_construction_and_execution(self, mock_publish):
         """
         Construct a workflow using the is_fairstep and is_fairworkflow decorators
-        and check that execution and returned provenance is as expected.
+        and check that execution and returned provenance is as expected. Then
+        (mock) publishes the provenance and checks the entities are updated.
         """
         @is_fairstep(label='Addition')
         def add(a:float, b:float) -> float:
@@ -354,9 +356,26 @@ def my_workflow(in1, in2, in3):
 
         assert isinstance(prov, WorkflowRetroProv)
         assert len(prov) == 4
+        print(prov)
         for step_prov in prov:
             assert isinstance(step_prov, StepRetroProv)
             assert step_prov.step in fw._steps.values()
+            print(step_prov)
+
+        test_published_uris = [
+                                'www.example.org/published1#prov',
+                                'www.example.org/published2#prov',
+                                'www.example.org/published3#prov',
+                                'www.example.org/published4#prov',
+                                'www.example.org/published5#prov'
+                              ]
+        mock_publish.side_effect = [{'concept_uri': uri} for uri in test_published_uris]
+
+        prov.publish_as_nanopub()
+        assert mock_publish.call_count == 5  # 1 workflow, 4 steps
+
+        for uri in test_published_uris[:4]:
+            assert (None, namespaces.PROV.hasMember, rdflib.URIRef(uri)) in prov._rdf
 
     def test_workflow_complex_serialization(self):
         class OtherType: