Merge
authorSimon Miles <simon.miles@kcl.ac.uk>
Thu, 28 Mar 2013 17:29:18 +0000
changeset 6012 0b2deecf9a53
parent 6011 84e4fffdad11 (current diff)
parent 6010 784f5361aa03 (diff)
child 6013 533399e45425
Merge
--- a/dictionary/Overview.html	Thu Mar 28 17:28:39 2013 +0000
+++ b/dictionary/Overview.html	Thu Mar 28 17:29:18 2013 +0000
@@ -836,7 +836,7 @@
 <li><span class='attribute' id="membership-d.key">key</span>: a key <span class="name">key_1</span> that is associated with the specified entity. <span class="name">key_1</span> is a <a href=" http://www.w3.org/TR/2013/PR-prov-dm-20130312/#term-value">value</a> ;</li>
 </ul>
 <p>Keys cannot be repeated in the same dictionary. However, a dictionary can contain the same entity more than once, as long as it is associated with different keys.</p>
-<p>Note that the <a href=" http://www.w3.org/TR/2013/PR-prov-dm-20130312/#term-membership">collection membership</a> relation, written <span class="name">prov:hadMember(c, e)</span>, can be used when <span class="name">c</span> has <span class="name">prov:type = 'prov:Collection'</span> or <span class="name">prov:type = 'prov:Dictionary'</span>. However, the <a href="#term-dictionary-membership">dictionary  membership</a>, written <span class="name">hadDictionaryMember(d, e, "k")</span>, can only be used when <span class="name">d</span> has <span class="name">prov:type = 'prov:Dictionary'</span>. </p>
+<p>Note that the <a href=" http://www.w3.org/TR/2013/PR-prov-dm-20130312/#term-membership">collection membership</a> relation, written <span class="name">hadMember(c, e)</span>, can be used when <span class="name">c</span> has <span class="name">prov:type = 'prov:Collection'</span> or <span class="name">prov:type = 'prov:Dictionary'</span>. However, the <a href="#term-dictionary-membership">dictionary  membership</a>, written <span class="name">hadDictionaryMember(d, e, "k")</span>, can only be used when <span class="name">d</span> has <span class="name">prov:type = 'prov:Dictionary'</span>. </p>
 	
 </div>
 
@@ -873,7 +873,7 @@
 <li><span class='attribute' id="insertion.after">after</span>: an identifier (<span class="name">d2</span>) for the dictionary <em>after</em> insertion; </li>
 <li><span class='attribute' id="insertion.before">before</span>: an identifier (<span class="name">d1</span>) for the dictionary <em>before</em> insertion;</li>
 <li><span class='attribute' id="insertion.key-entity-set">key-entity-set</span>: all inserted key-entity pairs <span class="name">(key_1, e_1)</span>, ..., <span class="name">(key_n, e_n)</span>. Here, each <span class="name">key_i</span> is a <a href=" http://www.w3.org/TR/2013/PR-prov-dm-20130312/#term-value">value</a>, and <span class="name">e_i</span> is an identifier  for the entity that has been inserted with the key;
- each <span class="name">key_i</span> is expected to be unique for the key-entity-set, as formalized in <a href="#key-single-entity-inference">Inference D2</a>;
+ each <span class="name">key_i</span> is expected to be unique for the key-entity-set, as formalized in <a href="#key-single-entity-inference">Inference D3</a>;
 </li>
 <li><span class='attribute' id="insertion.attributes">attributes</span>: an OPTIONAL set (<span class="name">attrs</span>) of attribute-value pairs representing additional information about this relation.</li>
 </ul>
@@ -882,7 +882,7 @@
 <p>
 An Insertion relation <span class="name">prov:derivedByInsertionFrom(id; d2, d1,  {(key_1, e_1), ..., (key_n, e_n)})</span> states that  <span class="name">d2</span> is the dictionary
 following the insertion of pairs <span class="name">(key_1, e_1)</span>, ..., <span class="name">(key_n, e_n)</span> into dictionary  <span class="name">d1</span>. 
-Note that insertion and the specified key-entity-set are considered to be complete. This means that we assume that no unknown keys were inserted in or removed from a dictionary after an insertion. This is formalized in <a href="#insertion-removal-membership-inference">Inference D7</a>.</p>
+Note that insertion and the specified key-entity-set are considered to be complete. This means that we assume that no unknown keys were inserted in or removed from a dictionary after an insertion. This is formalized in <a href="#insertion-removal-membership-inference">Inference D8</a>.</p>
 
 
 
@@ -950,7 +950,7 @@
 </div>
 
 <p>A Removal relation <span class="name">prov:derivedByRemovalFrom(id; d2,d1, {key_1, ..., key_n})</span> states that  <span class="name">d2</span> is  the  dictionary following the removal of the set of pairs corresponding to keys  <span class="name">key_1...key_n</span> from  <span class="name">d1</span>. If a key that is not present in the dictionary is removed, the dictionary remains unchanged.
-  Note that removal and the specified key-set are considered to be complete. This means that we assume that no unknown keys were inserted in or removed from a dictionary after a removal. This is formalized in <a href="#insertion-removal-membership-inference">Inference D7</a>.
+  Note that removal and the specified key-set are considered to be complete. This means that we assume that no unknown keys were inserted in or removed from a dictionary after a removal. This is formalized in <a href="#insertion-removal-membership-inference">Inference D8</a>.
 </p>
 
 <div class="anexample">
@@ -2365,7 +2365,27 @@
 <h3>Dictionary</h3>
 <div class="glossary-ref" data-ref="glossary-dictionary"></div>
 <p>To specialize an Entity as a Dictionary, include a <code>prov:type</code> with the value "prov:Dictionary".</p>
+<pre class="schema-type">
+&lt;xs:complexType xmlns:xs="http://www.w3.org/2001/XMLSchema" name="Dictionary"  &gt;
+  &lt;xs:complexContent&gt;
+  &lt;xs:extension base="prov:Collection"&gt;&lt;/xs:extension&gt;
+  &lt;/xs:complexContent&gt;
+&lt;/xs:complexType&gt;
+</pre>
+<pre class="schema-usage">
+&lt;xs:element name="dictionary" type="prov:Dictionary" substitutionGroup="prov:internalElement" /&gt;
+</pre>
 <p>An EmptyDictionary is asserted with the <code>prov:type</code> "prov:EmptyDictionary" and denotes a Dictionary with no members.</p>
+<pre class="schema-type">
+&lt;xs:complexType xmlns:xs="http://www.w3.org/2001/XMLSchema" name="EmptyDictionary"  &gt;
+  &lt;xs:complexContent&gt;
+  &lt;xs:extension base="prov:Dictionary"&gt;&lt;/xs:extension&gt;
+  &lt;/xs:complexContent&gt;
+&lt;/xs:complexType&gt;
+</pre>
+<pre class="schema-usage">
+&lt;xs:element name="emptyDictionary" type="prov:EmptyDictionary" substitutionGroup="prov:internalElement" /&gt;
+</pre>
 <pre class="example">
 &lt;prov:document
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
@@ -2389,17 +2409,19 @@
 
 
 <section id="term-KeyEntityPair">
-<h3>Key-Value Pair</h3>
+<h3>Key-Entity Pair</h3>
 <div class="glossary-ref" data-ref="glossary-keyEntityPair"></div>
-<p>Key-value pairs are used to identify the members of a dictionary.</p>
+<p>Key-entity pairs are used to identify the members of a dictionary.</p>
 <pre class="schema-type">
 &lt;xs:complexType xmlns:xs="http://www.w3.org/2001/XMLSchema" name="KeyEntityPair"  &gt;
-  &lt;xs:element name="entity" type="prov:IDRef" /&gt;
-  &lt;xs:element name="key" type="xs:anySimpleType" /&gt;
+  &lt;xs:sequence&gt;
+    &lt;xs:element name="entity" type="prov:IDRef" /&gt;
+    &lt;xs:element name="key" type="xs:anySimpleType" /&gt;
+  &lt;/xs:sequence&gt;
 &lt;/xs:complexType&gt;
 </pre>
 <pre class="schema-usage">
-&lt;xs:element xmlns:xs="http://www.w3.org/2001/XMLSchema" name="keyEntityPair" type="prov:KeyEntityPair"/&gt;
+&lt;xs:element xmlns:xs="http://www.w3.org/2001/XMLSchema" name="keyEntityPair" type="prov:KeyEntityPair" substitutionGroup="prov:internalElement"/&gt;
 </pre>
 <pre class="example">
 &lt;prov:document&gt;
@@ -2432,12 +2454,12 @@
 &lt;xs:complexType xmlns:xs="http://www.w3.org/2001/XMLSchema" name="DictionaryMembership"&gt;
   &lt;xs:sequence&gt;
     &lt;xs:element name="dictionary" type="prov:IDRef"/&gt;
-	&lt;xs:element name="keyEntityPair type="prov:KeyEntityPair" maxOccurs="unbounded"/&gt;
+    &lt;xs:element name="keyEntityPair type="prov:KeyEntityPair" maxOccurs="unbounded"/&gt;
   &lt;/xs:sequence&gt;
 &lt;/xs:complexType&gt;
 </pre>
 <pre class="schema-usage">
-&lt;xs:element xmlns:xs="http://www.w3.org/2001/XMLSchema" name="hadDictionaryMember" type="prov:DictionaryMembership"/&gt;
+&lt;xs:element xmlns:xs="http://www.w3.org/2001/XMLSchema" name="hadDictionaryMember" type="prov:DictionaryMembership" substitutionGroup="prov:internalElement"/&gt;
 </pre>
 <pre class="example">
 &lt;prov:document
@@ -2482,12 +2504,16 @@
   &lt;xs:sequence&gt;
     &lt;xs:element name="newDictionary" type="prov:IDRef"/&gt;
     &lt;xs:element name="oldDictionary" type="prov:IDRef"/&gt;
-	&lt;xs:element name="keyEntityPair type="prov:KeyEntityPair" maxOccurs="unbounded"/&gt;
+    &lt;xs:element name="keyEntityPair type="prov:KeyEntityPair" maxOccurs="unbounded"/&gt;
+    &lt;xs:element ref="prov:label" minOccurs="0" maxOccurs="unbounded"/&gt;
+    &lt;xs:element ref="prov:type" minOccurs="0" maxOccurs="unbounded"/&gt;
+    &lt;xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/&gt;
   &lt;/xs:sequence&gt;
+  &lt;xs:attribute ref="prov:id"/&gt;
 &lt;/xs:complexType&gt;
 </pre>
 <pre class="schema-usage">
-&lt;xs:element xmlns:xs="http://www.w3.org/2001/XMLSchema" name="derivedByInsertionFrom" type="prov:Insertion"/&gt;
+&lt;xs:element xmlns:xs="http://www.w3.org/2001/XMLSchema" name="derivedByInsertionFrom" type="prov:Insertion" substitutionGroup="prov:internalElement"/&gt;
 </pre>
 <pre class="example">
 &lt;prov:document
@@ -2541,11 +2567,15 @@
     &lt;xs:element name="newDictionary" type="prov:IDRef"/&gt;
     &lt;xs:element name="oldDictionary" type="prov:IDRef"/&gt;
     &lt;xs:element name="key" type="xs:anySimpleType" maxOccurs="unbounded" /&gt;
+    &lt;xs:element ref="prov:label" minOccurs="0" maxOccurs="unbounded"/&gt;
+    &lt;xs:element ref="prov:type" minOccurs="0" maxOccurs="unbounded"/&gt;
+    &lt;xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/&gt;
   &lt;/xs:sequence&gt;
+  &lt;xs:attribute ref="prov:id"/&gt;
 &lt;/xs:complexType&gt;
 </pre>
 <pre class="schema-usage">
-&lt;xs:element xmlns:xs="http://www.w3.org/2001/XMLSchema" name="derivedByRemovalFrom" type="prov:Removal"/&gt;
+&lt;xs:element xmlns:xs="http://www.w3.org/2001/XMLSchema" name="derivedByRemovalFrom" type="prov:Removal" substitutionGroup="prov:internalElement"/&gt;
 </pre>
 <pre class="example">
 &lt;prov:document
@@ -2614,12 +2644,20 @@
 	<span class='ruleTitle'><a class="internalDFN" href="#dmembership-cmembership-inference">Inference D1 (dictionary-membership-collection-membership)</a></span>
 <p>
 <span class="conditional">IF</span>  <span class="name">prov:hadDictionaryMember(d, e1, k1)</span>
-   <span class='conditional'>THEN</span> <span class="name">prov:hadMember(d, e1)</span>
+   <span class='conditional'>THEN</span> <span class="name">hadMember(d, e1)</span>
+</p></div>
+
+<p id="cmembership-dmembership-inference_text"><a href=" http://www.w3.org/TR/2013/PR-prov-dm-20130312/#term-membership">Collection membership</a> for collections that are dictionaries implies <a href="#term-dictionary-membership">dictionary  membership</a>.</p>
+	 <div class='inference' id='cmembership-dmembership-inference'>
+	<span class='ruleTitle'><a class="internalDFN" href="#cmembership-dmembership-inference">Inference D2 (collection-membership-dictionary-membership)</a></span>
+<p>
+<span class="conditional">IF</span>  <span class="name">hadMember(d, e)</span> and <span class="name">'prov:Dictionary' &isin; typeOf(d)</span> <span class='conditional'>THEN</span> there exists a 
+key <span class="name">k</span> such that <span class="name">prov:hadDictionaryMember(d, e, k)</span>
 </p></div>
 
 	<p id="membership-membership-inference_text">Each key maps to a single entity.</p>
 	 <div class='inference' id='key-single-entity-inference'>
-	<span class='ruleTitle'><a class="internalDFN" href="#key-single-entity-inference">Inference D2 (key-single-entity)</a></span>
+	<span class='ruleTitle'><a class="internalDFN" href="#key-single-entity-inference">Inference D3 (key-single-entity)</a></span>
 <p>
 <span class="conditional">IF</span>  <span class="name">prov:hadDictionaryMember(d1, e1, k1)</span>
    and <span class="name">prov:hadDictionaryMember(d1, e2, k1)</span> 
@@ -2628,7 +2666,7 @@
 
 <p id="membership-insertion-membership-inference_text">If a dictionary was derived from another dictionary by an insertion, then the former holds all key-entity pairs of the latter, except those updated by the insertion.</p>
 	 <div class='inference' id='membership-insertion-membership-inference'>
-	<span class='ruleTitle'><a class="internalDFN" href="#membership-insertion-membership-inference">Inference D3 (membership-insertion-membership)</a></span>
+	<span class='ruleTitle'><a class="internalDFN" href="#membership-insertion-membership-inference">Inference D4 (membership-insertion-membership)</a></span>
 <p>Here, KV1 is a set of key-entity pairs and K1 is the key-set of KV1.</p>
   <p>
 <span class="conditional">IF</span>  <span class="name">prov:hadDictionaryMember(d1, e, k)</span>
@@ -2646,7 +2684,7 @@
 
 <p id="insertion-membership-inference_text">A dictionary that was derived by an insertion of key-entity pairs, holds all these specified key-entity pairs. This inference also means that Insertion provides an "update semantics" for the keys that are already present in a dictionary.</p>
 	 <div class='inference' id='insertion-membership-inference'>
-	<span class='ruleTitle'><a class="internalDFN" href="#insertion-membership-inference">Inference D4 (insertion-membership)</a></span>
+	<span class='ruleTitle'><a class="internalDFN" href="#insertion-membership-inference">Inference D5 (insertion-membership)</a></span>
  <p>Here, KV1 is a set of key-entity pairs.</p>
   <p>
 <span class="conditional">IF</span> <span class="name">prov:derivedByInsertionFrom(d2, d1, KV1)</span> 
@@ -2665,14 +2703,14 @@
 
 <p id="insertion-derivation-inference_text">Insertion and removal are special cases of derivation.</p>
 	 <div class='inference' id='insertion-derivation-inference'>
-	<span class='ruleTitle'><a class="internalDFN" href="#insertion-derivation-inference">Inference D5 (insertion-derivation)</a></span>
+	<span class='ruleTitle'><a class="internalDFN" href="#insertion-derivation-inference">Inference D6 (insertion-derivation)</a></span>
  <p>Here, KV1 is a set of key-entity pairs and K1 is a set of keys.</p>
  <p>
 <span class="conditional">IF</span> <span class="name">prov:derivedByInsertionFrom(d2, d1, KV1)</span> 
    <span class='conditional'>THEN</span> <span class="name">prov:wasDerivedFrom(d2, d1)</span>
 </p></div>
 	 <div class='inference' id='removal-derivation-inference'>
-	<span class='ruleTitle'><a class="internalDFN" href="#removal-derivation-inference">Inference D6 (removal-derivation)</a></span>
+	<span class='ruleTitle'><a class="internalDFN" href="#removal-derivation-inference">Inference D7 (removal-derivation)</a></span>
 <p>
 <span class="conditional">IF</span> <span class="name">prov:derivedByRemovalFrom(d2, d1, K1)</span> 
    <span class='conditional'>THEN</span> <span class="name">prov:wasDerivedFrom(d2, d1)</span>
@@ -2681,7 +2719,7 @@
 
 <p id="insertion-removal-membership-inference_text">Insertions and removals do not introduce any new key-entity pairs, other than those specified.</p>
 	 <div class='inference' id='insertion-removal-membership-inference'>
-	<span class='ruleTitle'><a class="internalDFN" href="#insertion-removal-membership-inference">Inference D7 (insertion-removal-membership)</a></span>
+	<span class='ruleTitle'><a class="internalDFN" href="#insertion-removal-membership-inference">Inference D8 (insertion-removal-membership)</a></span>
 <ol>
 	<li>
 	<span class="conditional">IF</span> <span class="name">prov:derivedByInsertionFrom(d2, d1, {("k1", e1)})</span> and 
@@ -2708,7 +2746,7 @@
 
 <p id="impossible-removal-membership_text">A dictionary that was derived by removal from another dictionary, cannot contain the key-entity pairs that were removed from the latter.</p>
 	 <div class='constraint' id='impossible-removal-membership-constraint'>
-	<span class='ruleTitle'><a class="internalDFN" href="#impossible-removal-membership-constraint">Constraint D8 (impossible-removal-membership)</a></span>
+	<span class='ruleTitle'><a class="internalDFN" href="#impossible-removal-membership-constraint">Constraint D9 (impossible-removal-membership)</a></span>
 <p>
   <p>Here, <span class="name">K1</span> is a set of key-entity pairs.</p>
 <span class="conditional">IF</span> <span class="name">prov:derivedByRemovalFrom(d2, d1, K1)</span> and 
@@ -2718,7 +2756,7 @@
 	
 	<p id="impossible-removal-insertion_text">A dictionary must not be derived through multiple insertion or removal relations.</p>
 	 <div class='constraint' id='impossible-removal-insertion-constraint'>
-	<span class='ruleTitle'><a class="internalDFN" href="#impossible-removal-insertion-constraint">Constraint D9 (impossible-removal-insertion)</a></span>
+	<span class='ruleTitle'><a class="internalDFN" href="#impossible-removal-insertion-constraint">Constraint D10 (impossible-removal-insertion)</a></span>
   <p>Here, <span class="name">K1</span> is a set of keys and <span class="name">KV2</span> is a set of key-entity pairs.</p>
 <p>
 <span class="conditional">IF</span> <span class="name">prov:derivedByRemovalFrom(d2, d1, K1)</span> and 
@@ -2734,7 +2772,7 @@
 	 class="name">KV1 = KV2</span>
 </p></div>
 <div class='constraint' id='impossible-removal-removal-constraint'>
-	<span class='ruleTitle'><a class="internalDFN" href="#impossible-removal-removal-constraint">Constraint D11 (impossible-removal-removal)</a></span>
+	<span class='ruleTitle'><a class="internalDFN" href="#impossible-removal-removal-constraint">Constraint D12 (impossible-removal-removal)</a></span>
 <p>Here, <span class="name">K1</span> and <span class="name">K2</span> are sets of keys.</p>
 <p>
 <span class="conditional">IF</span> <span class="name">prov:derivedByRemovalFrom(d2, d1, K1)</span> and 
@@ -2755,7 +2793,7 @@
 <section id="dictionary-typing">
 		<h3>Typing</h3>
 	 <div class='constraint' id='typing'>
-	<span class='ruleTitle'><a class="internalDFN" href="#typing">Constraint D12 (typing)</a></span>
+	<span class='ruleTitle'><a class="internalDFN" href="#typing">Constraint D13 (typing)</a></span>
 		<ol>
 			<li>
 			<p>
--- a/dictionary/prov-dictionary-grammar.txt	Thu Mar 28 17:28:39 2013 +0000
+++ b/dictionary/prov-dictionary-grammar.txt	Thu Mar 28 17:29:18 2013 +0000
@@ -1,8 +1,8 @@
 [1] membershipExpression ::= "hadDictionaryMember" "(" dIdentifier "," eIdentifier "," key ")"
-[2] derivationByInsertionFromExpression ::= "derivedByInsertionFrom" "(" optionalIdentifier ";" dIdentifier "," dIdentifier "," "{" keyValuePairs "}" "," optionalAttributeValuePairs ")"
+[2] derivationByInsertionFromExpression ::= "derivedByInsertionFrom" "(" optionalIdentifier ";" dIdentifier "," dIdentifier "," "{" keyEntityPairs "}" "," optionalAttributeValuePairs ")"
 [3] derivationByRemovalFromExpression ::= "derivedByRemovalFrom" "(" optionalIdentifier ";" dIdentifier "," dIdentifier "," "{" keySet "}" "," optionalAttributeValuePairs ")"
 [4] dIdentifier ::= identifier 
 [5] key ::= literal 
-[6] keyValuePairs ::= keyValuePair ( "," keyValuePair )*
-[7] keyValuePair ::= "(" key "," eIdentifier ")"
+[6] keyEntityPairs ::= keyEntityPair ( "," keyEntityPair )*
+[7] keyEntityPair ::= "(" key "," eIdentifier ")"
 [8] keySet ::= key ( "," key )*
\ No newline at end of file
--- a/xml/schema/prov-dictionary.xsd	Thu Mar 28 17:28:39 2013 +0000
+++ b/xml/schema/prov-dictionary.xsd	Thu Mar 28 17:29:18 2013 +0000
@@ -25,8 +25,8 @@
 	
 	<xs:element name="emptyDictionary" type="prov:EmptyDictionary" substitutionGroup="prov:internalElement" />
 		
-	<!-- Key-Value Pair -->
-	<xs:complexType name="KeyValuePair">
+	<!-- Key-Entity Pair -->
+	<xs:complexType name="KeyEntityPair">
         <xs:sequence>
     	  <xs:element name="entity" type="prov:IDRef" />
     	  <xs:element name="key" type="xs:anySimpleType" />
@@ -34,13 +34,13 @@
 	</xs:complexType>
 	
 	<!-- do we need to have this use the substitutionGroup? -->
-	<xs:element name="keyValuePair" type="prov:KeyValuePair" substitutionGroup="prov:internalElement"/>
+	<xs:element name="keyEntityPair" type="prov:KeyEntityPair" substitutionGroup="prov:internalElement"/>
 
 	<!-- Dictionary Membership -->
 	<xs:complexType name="DictionaryMembership">
 	  <xs:sequence>
 		<xs:element name="dictionary" type="prov:IDRef"/>
-		<xs:element name="keyValuePair" type="prov:KeyValuePair" maxOccurs="unbounded"/>
+		<xs:element name="keyEntityPair" type="prov:KeyEntityPair" maxOccurs="unbounded"/>
 	  </xs:sequence>
 	</xs:complexType>
 	
@@ -49,10 +49,15 @@
 	<!-- Insertion -->
 	<xs:complexType name="Insertion">
 	  <xs:sequence>
-		<xs:element name="newDictionary" type="prov:IDRef"/>
-		<xs:element name="oldDictionary" type="prov:IDRef"/>
-		<xs:element name="keyValuePair" type="prov:KeyValuePair" maxOccurs="unbounded"/>
-	  </xs:sequence>
+      <xs:element name="newDictionary" type="prov:IDRef"/>
+      <xs:element name="oldDictionary" type="prov:IDRef"/>
+      <xs:element name="keyEntityPair" type="prov:KeyEntityPair" maxOccurs="unbounded"/>
+      <!-- prov attributes -->
+      <xs:element ref="prov:label" minOccurs="0" maxOccurs="unbounded"/>
+      <xs:element ref="prov:type" minOccurs="0" maxOccurs="unbounded"/>
+      <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+    <xs:attribute ref="prov:id"/>
 	</xs:complexType>
 	
 	<xs:element name="derivedByInsertionFrom" type="prov:Insertion" substitutionGroup="prov:internalElement"/>
@@ -60,10 +65,15 @@
 	<!-- Removal -->
 	<xs:complexType name="Removal">
 	  <xs:sequence>
-		<xs:element name="newDictionary" type="prov:IDRef"/>
-		<xs:element name="oldDictionary" type="prov:IDRef"/>
-		<xs:element name="key" type="xs:anySimpleType" maxOccurs="unbounded" />
+      <xs:element name="newDictionary" type="prov:IDRef"/>
+      <xs:element name="oldDictionary" type="prov:IDRef"/>
+      <xs:element name="key" type="xs:anySimpleType" maxOccurs="unbounded" />
+      <!-- prov attributes -->
+      <xs:element ref="prov:label" minOccurs="0" maxOccurs="unbounded"/>
+      <xs:element ref="prov:type" minOccurs="0" maxOccurs="unbounded"/>
+      <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
 	  </xs:sequence>
+    <xs:attribute ref="prov:id"/>
 	</xs:complexType>
 	
 	<xs:element name="derivedByRemovalFrom" type="prov:Removal" substitutionGroup="prov:internalElement"/>