<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rdf:RDF [
  <!ENTITY owl "http://www.w3.org/2002/07/owl#">
  <!ENTITY pml-provenance "http://inference-web.org/2.0/pml-provenance.owl">
  <!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#">
  <!ENTITY wdo "http://trust.utep.edu/1.0/wdo.owl">
  <!ENTITY xsd "http://www.w3.org/2001/XMLSchema#">
]>
<rdf:RDF xml:base="&wdo;"
         xmlns:owl="&owl;"
         xmlns:rdf="&rdf;"
         xmlns:rdfs="&rdfs;">

<!-- Ontology Information -->
  <owl:Ontology rdf:about="">
    <rdfs:comment xml:lang="en">The Workflow-Driven Ontology</rdfs:comment>
    <rdfs:label xml:lang="en">Workflow-Driven Ontology</rdfs:label>
    <owl:imports>
      <owl:Ontology rdf:about="&pml-provenance;"/>
    </owl:imports>
    <owl:versionInfo xml:lang="en">Version 1.0 of the Workflow Driven Ontology. Authors: Leonardo Salayandia, Ann Q. Gates, and Paulo Pinheiro da Silva</owl:versionInfo>
  </owl:Ontology>

<!-- Classes -->
  <owl:Class rdf:about="#Data">
    <rdfs:comment xml:lang="en">Data and dataset concepts of the domain being modeled.</rdfs:comment>
    <rdfs:label xml:lang="en">Data</rdfs:label>
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:allValuesFrom rdf:resource="#Method"/>
        <owl:onProperty rdf:resource="#isInputTo"/>
      </owl:Restriction>
    </rdfs:subClassOf>
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:allValuesFrom rdf:resource="#Method"/>
        <owl:onProperty rdf:resource="#isOutputOf"/>
      </owl:Restriction>
    </rdfs:subClassOf>
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:allValuesFrom rdf:resource="#Data"/>
        <owl:onProperty rdf:resource="#isComposedOf"/>
      </owl:Restriction>
    </rdfs:subClassOf>
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:allValuesFrom rdf:resource="#Data"/>
        <owl:onProperty rdf:resource="#isPartOf"/>
      </owl:Restriction>
    </rdfs:subClassOf>
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:allValuesFrom rdf:resource="&pml-provenance;#Source"/>
        <owl:onProperty rdf:resource="#hasSource"/>
      </owl:Restriction>
    </rdfs:subClassOf>
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:maxCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:maxCardinality>
        <owl:onProperty rdf:resource="#hasSource"/>
      </owl:Restriction>
    </rdfs:subClassOf>
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:allValuesFrom rdf:resource="&pml-provenance;#Source"/>
        <owl:onProperty rdf:resource="#hasSink"/>
      </owl:Restriction>
    </rdfs:subClassOf>
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:maxCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:maxCardinality>
        <owl:onProperty rdf:resource="#hasSink"/>
      </owl:Restriction>
    </rdfs:subClassOf>
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:allValuesFrom rdf:resource="&pml-provenance;#Format"/>
        <owl:onProperty rdf:resource="#hasFormat"/>
      </owl:Restriction>
    </rdfs:subClassOf>
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:maxCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:maxCardinality>
        <owl:onProperty rdf:resource="#hasFormat"/>
      </owl:Restriction>
    </rdfs:subClassOf>
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:allValuesFrom rdf:resource="#RectangularCoordinate"/>
        <owl:onProperty rdf:resource="#hasLabelCoordinate"/>
      </owl:Restriction>
    </rdfs:subClassOf>
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:maxCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:maxCardinality>
        <owl:onProperty rdf:resource="#hasLabelCoordinate"/>
      </owl:Restriction>
    </rdfs:subClassOf>
  </owl:Class>

  <owl:Class rdf:about="#Method">
    <rdfs:comment xml:lang="en">Methods, algorithms and other functionality concepts of the domain being modeled.</rdfs:comment>
    <rdfs:label xml:lang="en">Method</rdfs:label>
    <rdfs:subClassOf rdf:resource="&pml-provenance;#MethodRule"/>
    <rdfs:subClassOf rdf:resource="#WorkflowNode"/>
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:allValuesFrom rdf:resource="#Data"/>
        <owl:onProperty rdf:resource="#hasInput"/>
      </owl:Restriction>
    </rdfs:subClassOf>
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:allValuesFrom rdf:resource="#Data"/>
        <owl:onProperty rdf:resource="#hasOutput"/>
      </owl:Restriction>
    </rdfs:subClassOf>
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:allValuesFrom rdf:resource="#SemanticAbstractWorkflow"/>
        <owl:onProperty rdf:resource="#isDetailedBy"/>
      </owl:Restriction>
    </rdfs:subClassOf>
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:maxCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:maxCardinality>
        <owl:onProperty rdf:resource="#isDetailedBy"/>
      </owl:Restriction>
    </rdfs:subClassOf>
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:allValuesFrom rdf:resource="&pml-provenance;#InferenceEngine"/>
        <owl:onProperty rdf:resource="#hasInferenceEngine"/>
      </owl:Restriction>
    </rdfs:subClassOf>
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:maxCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:maxCardinality>
        <owl:onProperty rdf:resource="#hasInferenceEngine"/>
      </owl:Restriction>
    </rdfs:subClassOf>
  </owl:Class>

  <owl:Class rdf:about="#SemanticAbstractWorkflow">
    <rdfs:comment xml:lang="en">Used to reference Semantic Abstract Workflows as first-class citizens. Workflows are considered abstract because the control flow is not formally specified.</rdfs:comment>
    <rdfs:label xml:lang="en">Workflow</rdfs:label>
    <rdfs:subClassOf rdf:resource="#Method"/>
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:allValuesFrom rdf:resource="#Method"/>
        <owl:onProperty rdf:resource="#isAbstractedBy"/>
      </owl:Restriction>
    </rdfs:subClassOf>
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:maxCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:maxCardinality>
        <owl:onProperty rdf:resource="#isAbstractedBy"/>
      </owl:Restriction>
    </rdfs:subClassOf>
  </owl:Class>

  <owl:Class rdf:about="#Decision">
    <rdfs:comment xml:lang="en">Used to specify a decision point in an abstract workflow. Semantics of the decision concept are intentionally vague.</rdfs:comment>
    <rdfs:label xml:lang="en">Decision</rdfs:label>
    <rdfs:subClassOf rdf:resource="#Method"/>
  </owl:Class>

  <owl:Class rdf:about="#Broadcast">
    <rdfs:comment xml:lang="en">Used to specify a fork point in a workflow where a single incoming data concept is broadcasted to multiple outgoing branches.</rdfs:comment>
    <rdfs:label xml:lang="en">Broadcast</rdfs:label>
    <rdfs:subClassOf rdf:resource="#Decision"/>
  </owl:Class>

  <owl:Class rdf:about="#XOR">
    <rdfs:comment xml:lang="en">Used to specify a decision point in the workflow specification where exactly one route is taken in the workflow execution.</rdfs:comment>
    <rdfs:label xml:lang="en">XOR</rdfs:label>
    <rdfs:subClassOf rdf:resource="#Decision"/>
  </owl:Class>

  <owl:Class rdf:about="#RectangularCoordinate">
    <rdfs:comment xml:lang="en">Used to specify the location of an artifact in a workflow graph.</rdfs:comment>
    <rdfs:label xml:lang="en">RectCoord</rdfs:label>
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:allValuesFrom rdf:resource="&xsd;decimal"/>
        <owl:onProperty rdf:resource="#hasXCoordinateValue"/>
      </owl:Restriction>
    </rdfs:subClassOf>
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:maxCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:maxCardinality>
        <owl:onProperty rdf:resource="#hasXCoordinateValue"/>
      </owl:Restriction>
    </rdfs:subClassOf>
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:allValuesFrom rdf:resource="&xsd;decimal"/>
        <owl:onProperty rdf:resource="#hasYCoordinateValue"/>
      </owl:Restriction>
    </rdfs:subClassOf>
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:maxCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:maxCardinality>
        <owl:onProperty rdf:resource="#hasYCoordinateValue"/>
      </owl:Restriction>
    </rdfs:subClassOf>
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:allValuesFrom rdf:resource="&xsd;decimal"/>
        <owl:onProperty rdf:resource="#hasZCoordinateValue"/>
      </owl:Restriction>
    </rdfs:subClassOf>
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:maxCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:maxCardinality>
        <owl:onProperty rdf:resource="#hasZCoordinateValue"/>
      </owl:Restriction>
    </rdfs:subClassOf>
  </owl:Class>
  
  <owl:Class rdf:about="#WorkflowNode">
    <rdfs:comment xml:lang="en">Used to classify the concepts that are represented by a node in a workflow graph, and hence have a location given by a coordinate.</rdfs:comment>
    <rdfs:label xml:lang="en">Node</rdfs:label>
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:allValuesFrom rdf:resource="#RectangularCoordinate"/>
        <owl:onProperty rdf:resource="#hasCoordinate"/>
      </owl:Restriction>
    </rdfs:subClassOf>
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:maxCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:maxCardinality>
        <owl:onProperty rdf:resource="#hasCoordinate"/>
      </owl:Restriction>
    </rdfs:subClassOf>
  </owl:Class>
  
  <owl:Class rdf:about="&pml-provenance;#Source">
    <rdfs:subClassOf rdf:resource="#WorkflowNode"/>
  </owl:Class>

<!-- Datatype Properties -->
  <owl:DatatypeProperty rdf:about="#hasXCoordinateValue">
    <rdfs:domain rdf:resource="#RectangularCoordinate"/>
    <rdfs:range rdf:resource="&xsd;decimal"/>
  </owl:DatatypeProperty>

  <owl:DatatypeProperty rdf:about="#hasYCoordinateValue">
    <rdfs:domain rdf:resource="#RectangularCoordinate"/>
    <rdfs:range rdf:resource="&xsd;decimal"/>
  </owl:DatatypeProperty>

  <owl:DatatypeProperty rdf:about="#hasZCoordinateValue">
    <rdfs:domain rdf:resource="#RectangularCoordinate"/>
    <rdfs:range rdf:resource="&xsd;decimal"/>
  </owl:DatatypeProperty>

<!-- Object Properties -->
  <owl:ObjectProperty rdf:about="#hasFormat">
    <rdfs:comment xml:lang="en">Used to specify the format of data, e.g. "pdf", "ascii", "tab-delimited-dataset". It is similar to the hasFormat property of the pmlp ontology, except that the domain of this property is wdo:Data instead of pmlp:Information.</rdfs:comment>
    <rdfs:label xml:lang="en">has format</rdfs:label>
    <rdfs:domain rdf:resource="#Data"/>
    <rdfs:range rdf:resource="&pml-provenance;#Format"/>
  </owl:ObjectProperty>
  
  <owl:ObjectProperty rdf:about="#hasCoordinate">
    <rdfs:comment xml:lang="en">Used to specify layout position information of workflow nodes.</rdfs:comment>
    <rdfs:label xml:lang="en">has coordinate</rdfs:label>
    <rdfs:domain rdf:resource="#WorkflowNode"/>
    <rdfs:range rdf:resource="#RectangularCoordinate"/>
  </owl:ObjectProperty>
  
  <owl:ObjectProperty rdf:about="#hasLabelCoordinate">
    <rdfs:comment xml:lang="en">Used to specify layout position information of data labels.</rdfs:comment>
    <rdfs:label xml:lang="en">has coordinate</rdfs:label>
    <rdfs:domain rdf:resource="#Data"/>
    <rdfs:range rdf:resource="#RectangularCoordinate"/>
  </owl:ObjectProperty>

  <owl:ObjectProperty rdf:about="#hasInput">
    <rdfs:comment xml:lang="en">Used to specify the wdo:Data concepts that a wdo:Method uses as inputs. Inverse of the wdo:isInputTo property.</rdfs:comment>
    <rdfs:label xml:lang="en">has input</rdfs:label>
    <rdfs:domain rdf:resource="#Method"/>
    <rdfs:range rdf:resource="#Data"/>
    <owl:inverseOf rdf:resource="#isInputTo"/>
  </owl:ObjectProperty>

  <owl:ObjectProperty rdf:about="#isInputTo">
    <rdfs:comment xml:lang="en">Used to specify the wdo:Method concepts where a wdo:Data concept can be used as input.</rdfs:comment>
    <rdfs:label xml:lang="en">is input to</rdfs:label>
    <rdfs:domain rdf:resource="#Data"/>
    <rdfs:range rdf:resource="#Method"/>
    <owl:inverseOf rdf:resource="#hasInput"/>
  </owl:ObjectProperty>

  <owl:ObjectProperty rdf:about="#hasOutput">
    <rdfs:comment xml:lang="en">Used to specify the outputs of a wdo:Method concept.</rdfs:comment>
    <rdfs:label xml:lang="en">has output</rdfs:label>
    <rdfs:domain rdf:resource="#Method"/>
    <rdfs:range rdf:resource="#Data"/>
    <owl:inverseOf rdf:resource="#isOutputOf"/>
  </owl:ObjectProperty>

  <owl:ObjectProperty rdf:about="#isOutputOf">
    <rdfs:comment xml:lang="en">Used to specify the wdo:Method concepts that generate a given wdo:Data concept. Inverse of the wdo:hasOutput property.</rdfs:comment>
    <rdfs:label xml:lang="en">is output of</rdfs:label>
    <rdfs:domain rdf:resource="#Data"/>
    <rdfs:range rdf:resource="#Method"/>
    <owl:inverseOf rdf:resource="#hasOutput"/>
  </owl:ObjectProperty>

  <owl:ObjectProperty rdf:about="#hasSource">
    <rdfs:comment xml:lang="en">Used to set the pmlp:Source of a wdo:Data instance. It is similar to the hasSource property of the pmlp ontology, except that the domain of this property is wdo:Data instead of pmlp:SourceUsage.</rdfs:comment>
    <rdfs:label xml:lang="en">has source</rdfs:label>
    <rdfs:domain rdf:resource="#Data"/>
    <rdfs:range rdf:resource="&pml-provenance;#Source"/>
  </owl:ObjectProperty>

  <owl:ObjectProperty rdf:about="#hasSink">
    <rdfs:comment xml:lang="en">Used to set the pmlp:Source of a wdo:Data instance. It is similar to the hasSource property of the pmlp ontology, except that the domain of this property is wdo:Data instead of pmlp:SourceUsage.</rdfs:comment>
    <rdfs:label xml:lang="en">has sink</rdfs:label>
    <rdfs:domain rdf:resource="#Data"/>
    <rdfs:range rdf:resource="&pml-provenance;#Source"/>
  </owl:ObjectProperty>

  <owl:ObjectProperty rdf:about="#isAbstractedBy">
    <rdfs:comment xml:lang="en">Used to link an wdo:SemanticAbstractWorkflow instance to a wdo:Method instance; mechanism to support subworkflows.</rdfs:comment>
    <rdfs:label xml:lang="en">is abstracted by</rdfs:label>
    <rdfs:domain rdf:resource="#SemanticAbstractWorkflow"/>
    <rdfs:range rdf:resource="#Method"/>
    <owl:inverseOf rdf:resource="#isDetailedBy"/>
  </owl:ObjectProperty>

  <owl:ObjectProperty rdf:about="#isDetailedBy">
    <rdfs:comment xml:lang="en">Used to link a wdo:Method instance to a wdo:SemanticAbstractWorkflow instance; mechanism used to support subworkflows. Inverse of wdo:isAbstractedBy.</rdfs:comment>
    <rdfs:label xml:lang="en">is detailed by</rdfs:label>
    <rdfs:domain rdf:resource="#Method"/>
    <rdfs:range rdf:resource="#SemanticAbstractWorkflow"/>
    <owl:inverseOf rdf:resource="#isAbstractedBy"/>
  </owl:ObjectProperty>

  <owl:ObjectProperty rdf:about="#isComposedOf">
    <rdfs:comment xml:lang="en">Used to specify abstractions between wdo:Data concepts, e.g., Coordinate is composed of Latitude and Longitude.</rdfs:comment>
    <rdfs:label xml:lang="en">is composed of</rdfs:label>
    <rdfs:domain rdf:resource="#Data"/>
    <rdfs:range rdf:resource="#Data"/>
    <owl:inverseOf rdf:resource="#isPartOf"/>
  </owl:ObjectProperty>

  <owl:ObjectProperty rdf:about="#isPartOf">
    <rdfs:comment xml:lang="en">Used to specify abstractions between wdo:Data concepts, e.g., Latitude is part of Coordinate, and Longitude is part of Coordinate. Inverse of wdo:isComposedOf.</rdfs:comment>
    <rdfs:label xml:lang="en">is part of</rdfs:label>
    <rdfs:domain rdf:resource="#Data"/>
    <rdfs:range rdf:resource="#Data"/>
    <owl:inverseOf rdf:resource="#isComposedOf"/>
  </owl:ObjectProperty>
  
  <owl:ObjectProperty rdf:about="#hasInferenceEngine">
    <rdfs:comment xml:lang="en">Used to set the pmlp:InferenceEngine of a wdo:Method instance.</rdfs:comment>
    <rdfs:label xml:lang="en">has inference engine</rdfs:label>
    <rdfs:domain rdf:resource="#Method"/>
    <rdfs:range rdf:resource="&pml-provenance;#InferenceEngine"/>
  </owl:ObjectProperty>
</rdf:RDF>
