<?xml version="1.0" encoding="UTF-8"?>

<!-- Authors: Paul Groth and Luc Moreau -->


<xs:schema targetNamespace="http://openprovenance.org/model/v1.01.a"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:opm="http://openprovenance.org/model/v1.01.a"
           elementFormDefault="qualified"
           attributeFormDefault="unqualified">

  <xs:complexType name="ProcessId">
	<xs:attribute name="id" type="xs:IDREF"/>
  </xs:complexType>
  <xs:complexType name="ArtifactId">
	<xs:attribute name="id" type="xs:IDREF"/>
  </xs:complexType>
  <xs:complexType name="AgentId">
	<xs:attribute name="id" type="xs:IDREF"/>
  </xs:complexType>
  <xs:complexType name="AccountId">
	<xs:attribute name="id" type="xs:IDREF"/>
  </xs:complexType>

  <xs:complexType name="Account">
	<xs:sequence>
      <xs:element name="value"/>
	</xs:sequence>
	<xs:attribute name="id" type="xs:ID"/>
  </xs:complexType>

  <xs:complexType name="Role">
	<xs:attribute name="value" type="xs:string"/>
  </xs:complexType>

  <xs:complexType name="Process">
	<xs:sequence>
	  <xs:element name="account" minOccurs="0" maxOccurs="unbounded" type="opm:AccountId"/>
      <xs:element name="value"/>
	</xs:sequence>
	<xs:attribute name="id" type="xs:ID"/>
  </xs:complexType>


  <xs:complexType name="Artifact">
	<xs:sequence>
      <xs:element name="value"/>
	  <xs:element name="account" minOccurs="0" maxOccurs="unbounded" type="opm:AccountId"/>
	</xs:sequence>
	<xs:attribute name="id" type="xs:ID"/>
  </xs:complexType>


  <xs:complexType name="Agent">
	<xs:sequence>
      <xs:element name="value"/>
	  <xs:element name="account" minOccurs="0" maxOccurs="unbounded" type="opm:AccountId"/>
	</xs:sequence>
	<xs:attribute name="id" type="xs:ID"/>
  </xs:complexType>


  <xs:complexType name="Used">
	<xs:sequence>
	  <xs:element name="effect"  type="opm:ProcessId"/>  <!-- or should it be named process? -->
	  <xs:element name="role"    type="opm:Role"/>
	  <xs:element name="cause"   type="opm:ArtifactId"/>
	  <xs:element name="account" minOccurs="0"    maxOccurs="unbounded" type="opm:AccountId"/>
      <xs:element name="time"    type="opm:OTime" minOccurs="0"/>
	</xs:sequence>
  </xs:complexType>

  <xs:complexType name="WasGeneratedBy">
	<xs:sequence>
	  <xs:element name="effect"  type="opm:ArtifactId"/>
	  <xs:element name="role"    type="opm:Role"/>
	  <xs:element name="cause"   type="opm:ProcessId"/>
	  <xs:element name="account" minOccurs="0"    maxOccurs="unbounded" type="opm:AccountId"/>
      <xs:element name="time"    type="opm:OTime" minOccurs="0"/>
	</xs:sequence>
  </xs:complexType>

  <xs:complexType name="WasControlledBy">
	<xs:sequence>
	  <xs:element name="effect"  type="opm:ProcessId"/>
	  <xs:element name="role"    type="opm:Role"/>
	  <xs:element name="cause"   type="opm:AgentId"/>
	  <xs:element name="account" minOccurs="0"    maxOccurs="unbounded" type="opm:AccountId"/>
      <xs:element name="start"   type="opm:OTime" minOccurs="0"/>
      <xs:element name="end"     type="opm:OTime" minOccurs="0"/>
	</xs:sequence>
  </xs:complexType>

  <xs:complexType name="WasDerivedFrom">
	<xs:sequence>
	  <xs:element name="effect"  type="opm:ArtifactId"/>
	  <xs:element name="cause"   type="opm:ArtifactId"/>
	  <xs:element name="account" minOccurs="0"    maxOccurs="unbounded" type="opm:AccountId"/>
      <xs:element name="time"    type="opm:OTime" minOccurs="0"/>
	</xs:sequence>
  </xs:complexType>

  <xs:complexType name="WasTriggeredBy">
	<xs:sequence>
	  <xs:element name="effect"  type="opm:ProcessId"/>
	  <xs:element name="cause"   type="opm:ProcessId"/>
	  <xs:element name="account" minOccurs="0"    maxOccurs="unbounded" type="opm:AccountId"/>
      <xs:element name="time"    type="opm:OTime" minOccurs="0"/>
	</xs:sequence>
  </xs:complexType>


  <xs:complexType name="CausalDependencies">
	<xs:sequence>
	  <xs:choice minOccurs="0" maxOccurs="unbounded">
		<xs:element name="used"            type="opm:Used"/>
		<xs:element name="wasGeneratedBy"  type="opm:WasGeneratedBy"/>
		<xs:element name="wasTriggeredBy"  type="opm:WasTriggeredBy"/>
		<xs:element name="wasDerivedFrom"  type="opm:WasDerivedFrom"/>
		<xs:element name="wasControlledBy" type="opm:WasControlledBy"/>
	  </xs:choice>
	</xs:sequence>
  </xs:complexType>

  <xs:complexType name="Artifacts">
	<xs:sequence>
	  <xs:element name="artifact" type="opm:Artifact" minOccurs="0" maxOccurs="unbounded"/>
	</xs:sequence>
  </xs:complexType>


  <xs:complexType name="Accounts">
	<xs:sequence>
	  <xs:element name="account"  type="opm:Account"  minOccurs="0" maxOccurs="unbounded"/>
	  <xs:element name="overlaps" type="opm:Overlaps" minOccurs="0" maxOccurs="unbounded"/>
	</xs:sequence>
  </xs:complexType>

  <xs:complexType name="Overlaps">
	<xs:sequence>
	  <xs:element name="account" type="opm:AccountId" minOccurs="2" maxOccurs="2"/>
	</xs:sequence>
  </xs:complexType>


  <xs:complexType name="Processes">
	<xs:sequence>
	  <xs:element name="process" type="opm:Process" minOccurs="0" maxOccurs="unbounded"/>
	</xs:sequence>
  </xs:complexType>

  <xs:complexType name="Agents">
	<xs:sequence>
	  <xs:element name="agent"   type="opm:Agent" minOccurs="0" maxOccurs="unbounded"/>
	</xs:sequence>
  </xs:complexType>

  <xs:complexType name="OPMGraph">
	<xs:sequence>
	  <xs:element name="accounts" type="opm:Accounts" minOccurs="0"/>
	  <xs:element name="processes" type="opm:Processes" minOccurs="0"/>
	  <xs:element name="artifacts" type="opm:Artifacts" minOccurs="0"/>
	  <xs:element name="agents" type="opm:Agents" minOccurs="0"/>
	  <xs:element name="causalDependencies" type="opm:CausalDependencies" minOccurs="0"/>
	</xs:sequence>
  </xs:complexType>

  <xs:element name="opmGraph" type="opm:OPMGraph">
	<xs:annotation>
	  <xs:documentation>A set of assertions about the provenance of things</xs:documentation>
	</xs:annotation>
  </xs:element>

 <!-- Observed Time allow for interval of observation. -->
  <xs:complexType name="OTime">
	<xs:sequence>
	  <xs:element name="noLaterThan"   type="xs:time" minOccurs="0"  maxOccurs="1" />
	  <xs:element name="noEarlierThan" type="xs:time" minOccurs="0"  maxOccurs="1" />
	  <xs:element name="clockId"       type="xs:string"/>
	</xs:sequence>
  </xs:complexType>



</xs:schema>

