<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     xmlns:owl="http://www.w3.org/2002/07/owl#"
     xmlns:ol="http://www.owllink.org/owllink-xml#"
     xmlns:told="http://www.owllink.org/ext/told-xml#"
     targetNamespace="http://www.owllink.org/ext/told-xml#"
     elementFormDefault="qualified" attributeFormDefault="unqualified">

    <!-- Thorsten Liebig, 21.10.2008, Olaf Noppens  14.09.2009 -->
        
    <xsd:import namespace="http://www.owllink.org/owllink-xml#" schemaLocation="http://www.owllink.org/owllink-xml-20091016.xsd"/>
    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/>
    <xsd:import namespace="http://www.w3.org/2002/07/owl#" schemaLocation="http://owllink.org/owl2-20090914.xsd"/> 

 <!-- REQUESTS -->

 <xsd:element name="GetClassAxioms" type="told:KBRequestWithOneOptionalDescription"/>

 <xsd:element name="GetAllGeneralClassAxioms" type="ol:KBRequest"/>

 <xsd:element name="GetObjectPropertyAxioms"
  type="told:KBRequestWithOneOptionalObjectPropertyExpression"/>

 <xsd:element name="GetDataPropertyAxioms"
  type="told:KBRequestWithOneOptionalDataPropertyExpression"/>

 <xsd:element name="GetAllGeneralObjectPropertyAxioms" type="ol:KBRequest"/>

 <xsd:element name="GetToldTypes" type="told:KBRequestWithOneOptionalIndividual"/>

 <xsd:element name="GetToldInstance" type="ol:KBRequestWithOneDescription"/>

 <xsd:element name="GetToldEquivalentIndividuals"
  type="told:KBRequestWithOneOptionalIndividual"/>

 <xsd:element name="GetToldObjectPropertyFillers"
  type="told:KBRequestWithOneIndividualAndObjectPropertyExprNegativeAttribute"/>

 <xsd:element name="GetToldObjectPropertySources"
  type="told:KBRequestWithOneIndividualAndObjectPropertyExprNegativeAttribute"/>

 <xsd:element name="GetToldObjectPropertyAssertionsForSource"
  type="ol:KBRequestWithOneIndividualAndNegativeAttribute"/>

 <xsd:element name="GetToldObjectPropertyAssertionsForFiller"
  type="ol:KBRequestWithOneIndividualAndNegativeAttribute"/>

 <xsd:element name="GetToldObjectPropertyAssertions"
  type="told:KBRequestWithOneOptionalObjectPropertyExpressionAndNegativeAttribute"/>

 <!-- the first is the source individual and the second is the target individual -->
 <xsd:element name="GetToldRelatedIndividuals"
  type="told:KBRequestWithTwoIndividualsAndNegativeAttribute"/>

 <xsd:element name="GetAnnotationPropertyDeclarations">
  <xsd:complexType>
   <xsd:complexContent>
    <xsd:extension base="ol:KBRequest">
     <xsd:sequence minOccurs="0">
      <xsd:element ref="owl:AnnotationProperty"/>
     </xsd:sequence>
    </xsd:extension>
   </xsd:complexContent>
  </xsd:complexType>
 </xsd:element>

 <xsd:element name="GetOWLClassDeclarations">
  <xsd:complexType>
   <xsd:complexContent>
    <xsd:extension base="ol:KBRequest">
     <xsd:sequence minOccurs="0">
      <xsd:element ref="owl:Class"/>
     </xsd:sequence>
    </xsd:extension>
   </xsd:complexContent>
  </xsd:complexType>
 </xsd:element>

 <xsd:element name="GetIndividualDeclarations">
  <xsd:complexType>
   <xsd:complexContent>
    <xsd:extension base="ol:KBRequest">
     <xsd:sequence minOccurs="0">
      <xsd:element ref="owl:NamedIndividual"/>
     </xsd:sequence>
    </xsd:extension>
   </xsd:complexContent>
  </xsd:complexType>
 </xsd:element>

 <xsd:element name="GetObjectPropertyDeclarations">
  <xsd:complexType>
   <xsd:complexContent>
    <xsd:extension base="ol:KBRequest">
     <xsd:sequence minOccurs="0">
      <xsd:element ref="owl:ObjectProperty"/>
     </xsd:sequence>
    </xsd:extension>
   </xsd:complexContent>
  </xsd:complexType>
 </xsd:element>

 <xsd:element name="GetDataPropertyDeclarations">
  <xsd:complexType>
   <xsd:complexContent>
    <xsd:extension base="ol:KBRequest">
     <xsd:sequence minOccurs="0">
      <xsd:element ref="owl:DataProperty"/>
     </xsd:sequence>
    </xsd:extension>
   </xsd:complexContent>
  </xsd:complexType>
 </xsd:element>

 <xsd:element name="GetDatatypeDeclarations">
  <xsd:complexType>
   <xsd:complexContent>
    <xsd:extension base="ol:KBRequest">
     <xsd:sequence minOccurs="0">
      <xsd:element ref="owl:Datatype"/>
     </xsd:sequence>
    </xsd:extension>
   </xsd:complexContent>
  </xsd:complexType>
 </xsd:element>

 <xsd:element name="GetAnnotations">
  <xsd:complexType>
   <xsd:complexContent>
    <xsd:extension base="ol:KBRequest">
     <xsd:sequence minOccurs="0">
      <xsd:group ref="owl:Entity"/>
     </xsd:sequence>
    </xsd:extension>
   </xsd:complexContent>
  </xsd:complexType>
 </xsd:element>

 <xsd:element name="GetKB">
  <xsd:complexType>
   <xsd:complexContent>
    <xsd:extension base="ol:KBRequest">
     <xsd:attribute name="declarations" type="xsd:boolean" default="true"/>
    </xsd:extension>
   </xsd:complexContent>
  </xsd:complexType>
 </xsd:element>

 <!-- ADDITIONAL REQUEST TYPES NEEDED FOR TOLD QUERIES -->
 <xsd:complexType name="KBRequestWithOneOptionalDescription">
  <xsd:complexContent>
   <xsd:extension base="ol:KBRequest">
    <xsd:sequence minOccurs="0">
     <xsd:group ref="owl:ClassExpression"/>
    </xsd:sequence>
   </xsd:extension>
  </xsd:complexContent>
 </xsd:complexType>

 <xsd:complexType name="KBRequestWithOneOptionalObjectPropertyExpression">
  <xsd:complexContent>
   <xsd:extension base="ol:KBRequest">
    <xsd:sequence minOccurs="0">
     <xsd:group ref="owl:ObjectPropertyExpression"/>
    </xsd:sequence>
   </xsd:extension>
  </xsd:complexContent>
 </xsd:complexType>

 <xsd:complexType name="KBRequestWithOneOptionalDataPropertyExpression">
  <xsd:complexContent>
   <xsd:extension base="ol:KBRequest">
    <xsd:sequence minOccurs="0">
     <xsd:group ref="owl:DataPropertyExpression"/>
    </xsd:sequence>
   </xsd:extension>
  </xsd:complexContent>
 </xsd:complexType>

 <xsd:complexType name="KBRequestWithOneOptionalIndividual">
  <xsd:complexContent>
   <xsd:extension base="ol:KBRequest">
    <xsd:sequence minOccurs="0">
     <xsd:element ref="owl:NamedIndividual"/>
    </xsd:sequence>
   </xsd:extension>
  </xsd:complexContent>
 </xsd:complexType>

 <xsd:complexType
  name="KBRequestWithOneOptionalObjectPropertyExpressionAndNegativeAttribute">
  <xsd:complexContent>
   <xsd:extension base="ol:KBRequest">
    <xsd:sequence minOccurs="0">
     <xsd:group ref="owl:ObjectPropertyExpression"/>
    </xsd:sequence>
    <xsd:attribute name="negative" type="xsd:boolean" default="false"/>
   </xsd:extension>
  </xsd:complexContent>
 </xsd:complexType>

 <xsd:complexType name="KBRequestWithTwoIndividualsAndNegativeAttribute">
  <xsd:complexContent>
   <xsd:extension base="ol:KBRequest">
    <xsd:sequence>
     <xsd:element ref="owl:NamedIndividual"/>
     <xsd:element ref="owl:NamedIndividual"/>
    </xsd:sequence>
    <xsd:attribute name="negative" type="xsd:boolean" default="false"/>
   </xsd:extension>
  </xsd:complexContent>
 </xsd:complexType>

 <xsd:complexType name="KBRequestWithOneIndividualAndObjectPropertyExprNegativeAttribute">
  <xsd:complexContent>
   <xsd:extension base="ol:KBRequest">
    <xsd:sequence>
     <xsd:element ref="owl:NamedIndividual" maxOccurs="1" minOccurs="1"/>
     <xsd:group ref="owl:ObjectPropertyExpression" maxOccurs="1" minOccurs="1"/>
    </xsd:sequence>
    <xsd:attribute name="negative" type="xsd:boolean" default="false"/>
   </xsd:extension>
  </xsd:complexContent>
 </xsd:complexType>


 <!-- the group of told requests -->

 <xsd:group name="ToldRequests">
  <xsd:choice>
   <xsd:element ref="told:GetClassAxioms"/>
   <xsd:element ref="told:GetAllGeneralClassAxioms"/>
   <xsd:element ref="told:GetObjectPropertyAxioms"/>
   <xsd:element ref="told:GetDataPropertyAxioms"/>
   <xsd:element ref="told:GetAllGeneralObjectPropertyAxioms"/>
   <xsd:element ref="told:GetToldTypes"/>
   <xsd:element ref="told:GetToldInstance"/>
   <xsd:element ref="told:GetToldEquivalentIndividuals"/>
   <xsd:element ref="told:GetToldObjectPropertyFillers"/>
   <xsd:element ref="told:GetToldObjectPropertySources"/>
   <xsd:element ref="told:GetToldObjectPropertyAssertionsForSource"/>
   <xsd:element ref="told:GetToldObjectPropertyAssertionsForFiller"/>
   <xsd:element ref="told:GetToldObjectPropertyAssertions"/>
   <xsd:element ref="told:GetToldRelatedIndividuals"/>
   <xsd:element ref="told:GetAnnotationPropertyDeclarations"/>
   <xsd:element ref="told:GetOWLClassDeclarations"/>
   <xsd:element ref="told:GetIndividualDeclarations"/>
   <xsd:element ref="told:GetObjectPropertyDeclarations"/>
   <xsd:element ref="told:GetDataPropertyDeclarations"/>
   <xsd:element ref="told:GetDatatypeDeclarations"/>
   <xsd:element ref="told:GetAnnotations"/>
   <xsd:element ref="told:GetKB"/>
  </xsd:choice>
 </xsd:group>

 <!--  RESPONSES -->

 <!-- the group of told requests -->

 <xsd:group name="ToldResponses">
  <xsd:choice>
   <xsd:element ref="told:ToldClassAxioms"/>
   <xsd:element ref="told:ToldGeneralClassAxioms"/>
   <xsd:element ref="told:ToldObjectPropertyAxioms"/>
   <xsd:element ref="told:ToldDataPropertyAxioms"/>
   <xsd:element ref="told:ToldGeneralObjectPropertyAxioms"/>
   <xsd:element ref="told:ToldClassAssertions"/>
   <xsd:element ref="told:ToldEquivalentIndividuals"/>
   <xsd:element ref="told:ToldDisjointIndividuals"/>
   <xsd:element ref="told:ToldObjectPropertyAssertions"/>
   <xsd:element ref="told:ToldDataPropertyAssertions"/>
   <xsd:element ref="told:ToldDeclarationAxioms"/>
  <!-- <xsd:element ref="told:ToldAnnotationAxioms"/>-->
   <xsd:element ref="told:ToldKBAxioms"/>
  </xsd:choice>
 </xsd:group>

 
 <xsd:element name="ToldClassAxioms">
  <xsd:complexType>
   <xsd:complexContent>
    <xsd:extension base="ol:KBResponse">
     <xsd:sequence minOccurs="0" maxOccurs="unbounded">
      <xsd:choice>
       <xsd:element ref="owl:SubClassOf"/>
       <xsd:element ref="owl:EquivalentClasses"/>
       <xsd:element ref="owl:DisjointClasses"/>
       <xsd:element ref="owl:DisjointUnion"/>
      </xsd:choice>
     </xsd:sequence>
     <xsd:attributeGroup ref="xml:specialAttrs"/>
    </xsd:extension>
   </xsd:complexContent>
  </xsd:complexType>
 </xsd:element>

 <xsd:element name="ToldGeneralClassAxioms">
  <xsd:complexType>
   <xsd:complexContent>
    <xsd:extension base="ol:KBResponse">
     <xsd:sequence minOccurs="0" maxOccurs="unbounded">
      <xsd:choice>
       <xsd:element ref="owl:SubClassOf"/>
       <xsd:element ref="owl:EquivalentClasses"/>
       <xsd:element ref="owl:DisjointClasses"/>
      </xsd:choice>
     </xsd:sequence>
     <xsd:attributeGroup ref="xml:specialAttrs"/>
    </xsd:extension>
   </xsd:complexContent>
  </xsd:complexType>
 </xsd:element>
 
 <xsd:element name="ToldObjectPropertyAxioms">
  <xsd:complexType>
   <xsd:complexContent>
    <xsd:extension base="ol:KBResponse">
     <xsd:sequence minOccurs="0" maxOccurs="unbounded">
      <xsd:choice>
       <xsd:element ref="owl:ObjectPropertyDomain"/>
       <xsd:element ref="owl:ObjectPropertyRange"/>
       <xsd:element ref="owl:FunctionalObjectProperty"/>
       <xsd:element ref="owl:ReflexiveObjectProperty"/>
       <xsd:element ref="owl:InverseFunctionalObjectProperty"/>
       <xsd:element ref="owl:IrreflexiveObjectProperty"/>
       <xsd:element ref="owl:SymmetricObjectProperty"/>
       <xsd:element ref="owl:TransitiveObjectProperty"/>
       <xsd:element ref="owl:AsymmetricObjectProperty"/>
       <xsd:element ref="owl:EquivalentObjectProperties"/>
       <xsd:element ref="owl:DisjointObjectProperties"/>
       <xsd:element ref="owl:SubObjectPropertyOf"/>
       <xsd:element ref="owl:InverseObjectProperties"/>
      </xsd:choice>
     </xsd:sequence>
    </xsd:extension>
   </xsd:complexContent>
  </xsd:complexType>
 </xsd:element>

 <xsd:element name="ToldDataPropertyAxioms">
  <xsd:complexType>
   <xsd:complexContent>
    <xsd:extension base="ol:KBResponse">
     <xsd:sequence minOccurs="0" maxOccurs="unbounded">
      <xsd:choice>
       <xsd:element ref="owl:DataPropertyDomain"/>
       <xsd:element ref="owl:DataPropertyRange"/>
       <xsd:element ref="owl:FunctionalDataProperty"/>
       <xsd:element ref="owl:EquivalentDataProperties"/>
       <xsd:element ref="owl:DisjointDataProperties"/>
       <xsd:element ref="owl:SubDataPropertyOf"/>
      </xsd:choice>
     </xsd:sequence>
    </xsd:extension>
   </xsd:complexContent>
  </xsd:complexType>
 </xsd:element>
 
 <xsd:element name="ToldGeneralObjectPropertyAxioms">
  <xsd:complexType>
   <xsd:complexContent>
    <xsd:extension base="ol:KBResponse">
     <xsd:sequence minOccurs="0" maxOccurs="unbounded">
      <xsd:choice>
       <xsd:element ref="owl:ObjectPropertyDomain"/>
       <xsd:element ref="owl:ObjectPropertyRange"/>
       <xsd:element ref="owl:FunctionalObjectProperty"/>
       <xsd:element ref="owl:ReflexiveObjectProperty"/>
       <xsd:element ref="owl:InverseFunctionalObjectProperty"/>
       <xsd:element ref="owl:IrreflexiveObjectProperty"/>
       <xsd:element ref="owl:SymmetricObjectProperty"/>
       <xsd:element ref="owl:TransitiveObjectProperty"/>
       <xsd:element ref="owl:AsymmetricObjectProperty"/>
       <xsd:element ref="owl:EquivalentObjectProperties"/>
       <xsd:element ref="owl:DisjointObjectProperties"/>
       <xsd:element ref="owl:SubObjectPropertyOf"/>
       <xsd:element ref="owl:InverseObjectProperties"/>
      </xsd:choice>
     </xsd:sequence>
    </xsd:extension>
   </xsd:complexContent>
  </xsd:complexType>
 </xsd:element>
 
 <xsd:element name="ToldClassAssertions">
  <xsd:complexType>
   <xsd:complexContent>
    <xsd:extension base="ol:KBResponse">
     <xsd:sequence minOccurs="0" maxOccurs="unbounded">
      <xsd:element ref="owl:ClassAssertion"/>
     </xsd:sequence>
    </xsd:extension>
   </xsd:complexContent>
  </xsd:complexType>
 </xsd:element>
 
 <xsd:element name="ToldEquivalentIndividuals">
  <xsd:complexType>
   <xsd:complexContent>
    <xsd:extension base="ol:KBResponse">
     <xsd:sequence minOccurs="0" maxOccurs="unbounded">
      <!-- note that there is a typo in the OWL 2 schema as of April 2008
           ox:SameIndividual (instead of ox:SameIndividuals) -->
      <xsd:element ref="owl:SameIndividual"/>
     </xsd:sequence>
    </xsd:extension>
   </xsd:complexContent>
  </xsd:complexType>
 </xsd:element>
 
 <xsd:element name="ToldDisjointIndividuals">
  <xsd:complexType>
   <xsd:complexContent>
    <xsd:extension base="ol:KBResponse">
     <xsd:sequence minOccurs="0" maxOccurs="unbounded">
      <xsd:element ref="owl:DifferentIndividuals"/>
     </xsd:sequence>
    </xsd:extension>
   </xsd:complexContent>
  </xsd:complexType>
 </xsd:element>
 
 <xsd:element name="ToldObjectPropertyAssertions">
  <xsd:complexType>
   <xsd:complexContent>
    <xsd:extension base="ol:KBResponse">
     <xsd:sequence minOccurs="0" maxOccurs="unbounded">
      <xsd:element ref="owl:ObjectPropertyAssertion"/>
     </xsd:sequence>
    </xsd:extension>
   </xsd:complexContent>
  </xsd:complexType>
 </xsd:element>
 
 <xsd:element name="ToldDataPropertyAssertions">
  <xsd:complexType>
   <xsd:complexContent>
    <xsd:extension base="ol:KBResponse">
     <xsd:sequence minOccurs="0" maxOccurs="unbounded">
      <xsd:element ref="owl:DataPropertyAssertion"/>
     </xsd:sequence>
    </xsd:extension>
   </xsd:complexContent>
  </xsd:complexType>
 </xsd:element>
 
 <xsd:element name="ToldDeclarationAxioms">
  <xsd:complexType>
   <xsd:complexContent>
    <xsd:extension base="ol:KBResponse">
     <xsd:sequence minOccurs="0" maxOccurs="unbounded">
      <xsd:element ref="owl:Declaration"/>
     </xsd:sequence>
    </xsd:extension>
   </xsd:complexContent>
  </xsd:complexType>
 </xsd:element>
 
<!-- <xsd:element name="ToldAnnotationAxioms">
  <xsd:complexType>
   <xsd:complexContent>
    <xsd:extension base="ol:KBResponse">
     <xsd:sequence minOccurs="0" maxOccurs="unbounded">
      <xsd:element ref="owl:EntityAnnotation"/>
     </xsd:sequence>
    </xsd:extension>
   </xsd:complexContent>
  </xsd:complexType>
 </xsd:element>-->
 
 <xsd:element name="ToldKBAxioms">
  <xsd:complexType>
   <xsd:complexContent>
    <xsd:extension base="ol:KBResponse">
     <xsd:sequence minOccurs="0" maxOccurs="unbounded">
      <xsd:group ref="owl:Axiom"/>
     </xsd:sequence>
    </xsd:extension>
   </xsd:complexContent>
  </xsd:complexType>
 </xsd:element>

</xsd:schema>

