<?xml version="1.0"?>
<rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" 
         xmlns:oil="http://www.ontoknowledge.org/oil/rdf-schema/2000/11/10-oil-standard#" 
         xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
         xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
      
  <rdf:Description rdf:about="">
    <dc:title>African Animals</dc:title>
    <dc:creator>Ian Horrocks</dc:creator>
    <dc:subject>animal food vegetarians</dc:subject>
    <dc:description>A didactic example ontology describing African animals</dc:description>
    <dc:description.release>2.0</dc:description.release>
    <dc:publisher>I. Horrocks</dc:publisher>
    <dc:type>ontology</dc:type>
    <dc:format>rdfs</dc:format>
    <dc:identifier>http://www.ontoknowledge.org/oil/oil-rdfs.pdf</dc:identifier>
    <dc:source>http://www.africa.com/nature/animals.html</dc:source>
    <dc:language>OIL</dc:language>
    <dc:language>en-uk</dc:language>
  </rdf:Description>

  <rdf:Property rdf:ID="eats">
    <oil:inverseRelationOf rdf:resource="#is-eaten-by"/>
  </rdf:Property>

  <oil:TransitiveProperty rdf:ID="has-part">
    <oil:inverseRelationOf rdf:resource="#is-part-of"/>
  </oil:TransitiveProperty>

  <oil:FunctionalProperty rdf:ID="weight">
    <rdf:range>
      <oil:Min>
        <oil:integerValue>0</oil:integerValue>
      </oil:Min>
    </rdf:range>
  </oil:FunctionalProperty>

  <oil:FunctionalProperty rdf:ID="colour">
    <rdf:range rdf:resource="http://www.ontoknowledge.org/oil/rdf-schema/2000/11/10-oil-standard#String"/>
  </oil:FunctionalProperty>

  <rdfs:Class rdf:ID="animal"/>
  
  <rdfs:Class rdf:ID="plant"/>

  <oil:Disjoint>
    <oil:hasObject rdf:resource="#animal"/>
    <oil:hasObject rdf:resource="#plant"/>
  </oil:Disjoint>

  <rdfs:Class rdf:ID="tree">
    <rdfs:subClassOf rdf:resource="#plant"/>
  </rdfs:Class>

  <rdfs:Class rdf:ID="branch">
    <oil:hasPropertyRestriction>
      <oil:HasValue>
        <oil:onProperty rdf:resource="#is-part-of"/>
        <oil:toClass rdf:resource="#tree"/>
      </oil:HasValue>
    </oil:hasPropertyRestriction>
  </rdfs:Class>

  <rdfs:Class rdf:ID="leaf">
    <oil:hasPropertyRestriction>
      <oil:HasValue>
        <oil:onProperty rdf:resource="#is-part-of"/>
        <oil:toClass rdf:resource="#branch"/>
      </oil:HasValue>
    </oil:hasPropertyRestriction>
  </rdfs:Class>

  <oil:DefinedClass rdf:ID="carnivore">
    <rdfs:subClassOf rdf:resource="#animal"/>
    <oil:hasPropertyRestriction>
      <oil:ValueType>
        <oil:onProperty rdf:resource="#eats"/>
        <oil:toClass rdf:resource="#animal"/>
      </oil:ValueType>
    </oil:hasPropertyRestriction>
  </oil:DefinedClass>

  <oil:DefinedClass rdf:ID="herbivore">
    <rdfs:subClassOf rdf:resource="#animal"/>
    <oil:hasPropertyRestriction>
      <oil:ValueType>
        <oil:onProperty rdf:resource="#eats"/>
        <oil:toClass>
          <oil:Or>
            <oil:hasOperand rdf:resource="#plant"/>
            <oil:hasOperand>
              <oil:HasValue>
                <oil:onProperty rdf:resource="#is-part-of"/>
                <oil:toClass rdf:resource="#plant"/>
              </oil:HasValue>
            </oil:hasOperand>
          </oil:Or>
        </oil:toClass>
      </oil:ValueType>
    </oil:hasPropertyRestriction>
  </oil:DefinedClass>

  <oil:Disjoint>
    <oil:hasObject rdf:resource="#carnivore"/>
    <oil:hasObject rdf:resource="#herbivore"/>
  </oil:Disjoint>

  <rdfs:Class rdf:ID="mammal">
    <rdfs:subClassOf rdf:resource="#animal"/>
  </rdfs:Class>

  <rdfs:Class rdf:ID="elephant">
    <rdfs:subClassOf rdf:resource="#herbivore"/>
    <rdfs:subClassOf rdf:resource="#mammal"/>
    <oil:hasPropertyRestriction>
      <oil:ValueType>
        <oil:onProperty rdf:resource="#eats"/>
        <oil:toClass rdf:resource="#plant"/>
      </oil:ValueType>
    </oil:hasPropertyRestriction>
    <oil:hasPropertyRestriction>
      <oil:HasFiller>
        <oil:onProperty rdf:resource="#colour"/>
        <oil:stringFiller>grey</oil:stringFiller>
      </oil:HasFiller>
    </oil:hasPropertyRestriction>
  </rdfs:Class>

  <oil:DefinedClass rdf:ID="african-elephant">
    <rdfs:subClassOf rdf:resource="#elephant"/>
    <oil:hasPropertyRestriction>
      <oil:HasFiller>
        <oil:onProperty rdf:resource="#comes-from"/>
        <oil:individual rdf:resource="#Africa"/>
      </oil:HasFiller>
    </oil:hasPropertyRestriction>
  </oil:DefinedClass>

  <oil:DefinedClass rdf:ID="indian-elephant">
    <rdfs:subClassOf rdf:resource="#elephant"/>
    <oil:hasPropertyRestriction>
      <oil:HasFiller>
        <oil:onProperty rdf:resource="#comes-from"/>
        <oil:individual rdf:resource="#India"/>
      </oil:HasFiller>
    </oil:hasPropertyRestriction>
  </oil:DefinedClass>

  <oil:DisjointCover>
    <oil:hasSubject rdf:resource="#elephant"/>
    <oil:isCoveredBy rdf:resource="#african-elephant"/>
    <oil:isCoveredBy rdf:resource="#indian-elephant"/>
  </oil:DisjointCover>

<!-- instances; plain RDF; should be in a separate document --> 

  <rdf:Description rdf:ID="Africa">
    <rdf:type rdf:resource="#continent"/>
  </rdf:Description>  

  <rdf:Description rdf:ID="Asia">
    <rdf:type rdf:resource="#continent"/>
  </rdf:Description>  

  <rdf:Description rdf:ID="India">
    <is-part-of rdf:resource="#Asia"/>
  </rdf:Description>  

</rdf:RDF>
