<?xml version="1.0"?>
<?xml-stylesheet href="http://www.w3.org/2002/06/rdfs2html.xsl" type="application/xml"?>
<!DOCTYPE rdf:RDF [
     <!ENTITY rdf  "http://www.w3.org/1999/02/22-rdf-syntax-ns#" >
     <!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" >
     <!ENTITY xsd  "http://www.w3.org/2001/XMLSchema#" >
     <!ENTITY owl  "http://www.w3.org/2002/07/owl#" >
     <!ENTITY obowl  "http://www.xspan.org/obo.owl#" >
   ]>

<rdf:RDF
  xmlns     ="&obowl;"
  xmlns:owl ="&owl;"
  xml:base  ="http://www.xspan.org/obo.owl#" 
  xmlns:rdf ="&rdf;"
  xmlns:rdfs="&rdfs;"
  xmlns:obowl="&obowl;"
>

<owl:Ontology rdf:about=""> 
  <rdfs:comment>An OWL Ontology for OBO</rdfs:comment>
</owl:Ontology>

<!--  A proposal for a OWL Full Ontology for OBO and the Gene Ontology.
      This file defines a very simple ontology of Objects, Events and
      part-of relations, and axiomatises their semantics. 
      See the paper at http://www-smi.stanford.edu/projects/helix/psb04/aitken.pdf

      This OWL format is used by the COBrA tool, see: http://www.xspan.org/

      Author: Stuart Aitken  stuart@aiai.ed.ac.uk 
      AIAI, University of Edinburgh Thu Nov 20 12:25:00 GMT 2003 
      -->

  <owl:Class rdf:ID="term">
    <rdfs:label>term</rdfs:label>
    <rdfs:subClassOf rdf:resource="&owl;Class"/>
    <rdfs:comment> term: the class of all GO terms, a subclass of owl:Class
    </rdfs:comment>    
  </owl:Class>

<!-- For the formal semantics of the relations, see the rdfs comments -->

<!-- the Object and Event classes - these are disjoint subclasses of owl:Thing -->
  <owl:Class rdf:ID="Object">
    <rdfs:label>Object</rdfs:label>
    <rdfs:subClassOf rdf:resource="&owl;Thing"/>
    <owl:disjointWith rdf:resource="&obowl;Event"/>
    <rdfs:comment> Object:  subclass of owl:Thing disjoint with Event
    </rdfs:comment>    
  </owl:Class>

  <owl:Class rdf:ID="Event">
    <rdfs:label>Event</rdfs:label>
    <rdfs:subClassOf rdf:resource="&owl;Thing"/>
    <owl:disjointWith rdf:resource="&obowl;Object"/>
    <rdfs:comment> Event:  subclass of owl:Thing disjoint with Object
    </rdfs:comment>    
  </owl:Class>

<!-- ObjectClass: a class of classes which are subclasses of Object -->
  <owl:Class rdf:ID="ObjectClass">
    <rdfs:label>ObjectClass</rdfs:label>
    <rdfs:subClassOf rdf:resource="&obowl;term"/>
    <owl:disjointWith rdf:resource="&obowl;EventClass"/>
    <rdfs:comment> ObjectClass: a class of classes which are subclasses of Object 
    </rdfs:comment>    
  </owl:Class>

<!-- EventClass: a class of classes which are subclasses of Event -->
  <owl:Class rdf:ID="EventClass">
    <rdfs:label>EventClass</rdfs:label>
    <rdfs:subClassOf rdf:resource="&obowl;term"/>
    <owl:disjointWith rdf:resource="&obowl;ObjectClass"/>
    <rdfs:comment> EventClass: a class of classes which are subclasses of Event 
    </rdfs:comment>    
  </owl:Class>

<!-- PartOfProperty: a class of properties which are part-of relations and qualifiers-->
  <owl:Class rdf:ID="PartOfProperty">
    <rdfs:label>PartOfProperty</rdfs:label>
    <rdfs:subClassOf rdf:resource="&owl;ObjectProperty"/>
    <rdfs:comment> PartOfProperty: a class of properties which are part-of relations,
or restrictions applying to part-of
    </rdfs:comment>    
  </owl:Class>


<!-- parts: the most general part-of relation -->

  <obowl:PartOfProperty rdf:ID="parts"> 
    <rdfs:label>parts</rdfs:label>
    <rdfs:comment> (parts Part Whole) no interpretation is specified at this level
    </rdfs:comment>    
  </obowl:PartOfProperty>

<!-- isPartOf: the conventional instance-level part-of relation -->
<!-- (isPartOf Part Whole) where Part and Whole are Objects and not Classes-->
  <PartOfProperty rdf:ID="isPartOf">
    <rdfs:label>isPartOf</rdfs:label>
    <rdfs:domain rdf:resource="&obowl;Object"/>
    <rdfs:range rdf:resource="&obowl;Object"/>
    <rdfs:subPropertyOf rdf:resource="&obowl;parts"/>
    <rdfs:comment> isPartOf: the conventional instance-level part-of relation
(isPartOf Part Whole) where Part and Whole are not Classes
Otter axioms:
(all x y z ((isPart0f(x,y) AND isPart0f(y,z)) -> isPart0f(x,z))).
(all x isPart0f(x,x)).
(all x y ((isPart0f(x,y) AND isPart0f(y,x)) -> =(x,y))).
    </rdfs:comment>    
  </PartOfProperty>

<!-- isProperPartOf: the conventional instance-level 'proper' part-of relation 
     i.e. the whole is not considered to be a part -->
<!-- (isProperPartOf Part Whole) where Part and Whole are Objects and not Classes-->
  <PartOfProperty rdf:ID="isProperPartOf">
    <rdfs:label>isProperPartOf</rdfs:label>
    <rdfs:domain rdf:resource="&obowl;Object"/>
    <rdfs:range rdf:resource="&obowl;Object"/>
    <rdfs:subPropertyOf rdf:resource="&obowl;isPartOf"/>
    <rdfs:comment> isProperPartOf: the conventional instance-level part-of relation
(isProperPartOf Part Whole) where Part and Whole are Objects and not Classes
Otter axiom:
(all x y (isProperPartOf(x,y) IFF  (isPart0f(x,y) AND -(isPart0f(y,x))))).

Note: AND and IFF should be replaced appropriately.
    </rdfs:comment>    
  </PartOfProperty>

<!-- isSubEventOf: the conventional instance-level sub-event (part-of event) relation -->
<!-- (isSubEventOf Part Whole) where Part and Whole are Events and are not Classes -->
  <PartOfProperty rdf:ID="isSubEventOf">
    <rdfs:label>isSubEventOf</rdfs:label>
    <rdfs:domain rdf:resource="&obowl;Event"/>
    <rdfs:range rdf:resource="&obowl;Event"/>
    <rdfs:subPropertyOf rdf:resource="&obowl;parts"/>
    <rdfs:comment>  isSubEventOf: the conventional instance-level sub-event (part-of event) relation 
(isSubEventOf Part Whole) where Part and Whole are Events and not Classes. The axiomatisation of
subEvent relations follows that of parts - see the corresponding part relation for details.
    </rdfs:comment>    
  </PartOfProperty>

<!-- isProperSubEventOf: the conventional instance-level 'proper' sub-event (part-of event) 
     relation i.e. the whole is not considered to be a part -->
<!-- (isProperSubEventOf Part Whole) where Part and Whole are Events and are not Classes -->
  <PartOfProperty rdf:ID="isProperSubEventOf">
    <rdfs:label>isProperSubEventOf</rdfs:label>
    <rdfs:domain rdf:resource="&obowl;Event"/>
    <rdfs:range rdf:resource="&obowl;Event"/>
    <rdfs:subPropertyOf rdf:resource="&obowl;isSubEventOf"/>
    <rdfs:comment> isSubEventOf: the conventional instance-level sub-event (part-of event) relation 
defined as (isProperSubEventOf x y) := (and (isSubEventOf x y) (not (isSubEventOf y x))
(isSubEventOf Part Whole) where Part and Whole are Events not Classes.
    </rdfs:comment>    
  </PartOfProperty>

<!-- partOf: the restriction of parts to Object classes -->
<!-- (partOf Part-Class Whole-Class) -->
  <PartOfProperty rdf:ID="partOf">
    <rdfs:label>partOf</rdfs:label>
    <rdfs:domain rdf:resource="&obowl;ObjectClass"/>
    <rdfs:range rdf:resource="&obowl;ObjectClass"/>
    <rdfs:subPropertyOf rdf:resource="&obowl;parts"/>
      <rdfs:comment>  partOf: the restriction of parts to Object classes.
partOf is transitive and inherits to subclasses of the Whole-Class when qualified
by classDefinition, axiom in Otter syntax:
(all P W  ((partOf(P,W) AND classDefinition(P,W))
  IFF
  (all w (exists p (type(w,W) -> (type(p,P) AND isProperPartOf(p,w))))))). 

partOf is transitive and does not inherit to subclasses of the Whole-Class when qualified
by termDefinition, axiom in Otter syntax:
(all P W
  ((partOf(P,W) AND termDefinition(P,W))
  IFF
  (all w (exists p
      ((-(exists C ((subClassOf(C,W) AND type(w,C)))) and
       type(w,W))
        IMPLIES ( -(exists D ((subClassOf(D,P) AND type(p,D)))) AND type(p,P) AND isProperPartOf(p,w))))))). 
    </rdfs:comment>  
  </PartOfProperty>

<!-- subEventOf: the restriction of parts to Event classes -->
<!-- (subEventOf Part-Class Whole-Class) -->
  <PartOfProperty rdf:ID="subEventOf">
    <rdfs:label>subEventOf</rdfs:label>
    <rdfs:domain rdf:resource="&obowl;EventClass"/>
    <rdfs:range rdf:resource="&obowl;EventClass"/>
    <rdfs:subPropertyOf rdf:resource="&obowl;parts"/>
    <rdfs:comment> subEventOf: the restriction of parts to Event classes.
This relation can be qualified in the same way as partOf (see the comment for partOf).
    </rdfs:comment>    
  </PartOfProperty>


<!-- descends: the most general lineage relation -->
<!-- (descends Earlier Later) no interpretation is specified at this level -->
  <owl:ObjectProperty rdf:ID="descends"> 
    <rdfs:label>descends</rdfs:label>
    <rdfs:domain rdf:resource="&obowl;term"/>
    <rdfs:range rdf:resource="&obowl;term"/>
    <rdfs:comment> descends: the most general lineage relation 
(descends Earlier Later) no interpretation is specified at this level.
    </rdfs:comment>    
  </owl:ObjectProperty>


<!-- vocabulary for stating restrictions on part-of relations -->
<!-- these relations must be used in addition to, not instead of, the
     class-level parts relations -->


<!-- classDefinition: the assertion that part hold of all subclasses of the  whole -->
<!-- (classDefinition Part-Class Whole-Class) -->
  <PartOfProperty rdf:ID="classDefinition">
    <rdfs:label>classDefinition</rdfs:label>
    <rdfs:domain rdf:resource="&obowl;term"/>
    <rdfs:range rdf:resource="&obowl;term"/>
    <rdfs:comment>  This relation is used in conjunction with partOf or subEventOf 
to state that the part-whole relation holds of the whole-class and all subclasses of it.
    </rdfs:comment>    
  </PartOfProperty>
 

<!-- termDefinition: the restriction of parts to direct 
     instances of the Part and Whole classes -->
<!-- (termDefinition Part-Class Whole-Class) -->
  <PartOfProperty rdf:ID="termDefinition">
    <rdfs:label>termDefinition</rdfs:label>
    <rdfs:domain rdf:resource="&obowl;term"/>
    <rdfs:range rdf:resource="&obowl;term"/>
    <rdfs:comment> This relation is used in conjunction with partOf or subEventOf
to state that the part-whole relation holds of the whole-class but not of subclasses of it.
    </rdfs:comment>    
  </PartOfProperty>
 

<!-- directPartDefinition: the restriction of parts to direct parts 
     of the Whole -->
<!-- (directPartDefinition Part-Class Whole-Class) -->
  <PartOfProperty rdf:ID="directPartDefinition">
    <rdfs:label>directPartDefinition</rdfs:label>
    <rdfs:domain rdf:resource="&obowl;term"/>
    <rdfs:range rdf:resource="&obowl;term"/>
    <rdfs:comment> This relation is used conjunction with partOf or subEventOf
to state that there are no parts between the part and the whole.
Otter axiom for directPartDefinition + partOf/subEventOf
  (all P W
  ((partOf(P,W) AND directPartDefinition(P,W))
  IFF
  (all w p ((type(w,W) AND type(p,P) AND isProperPartOf(p,w))
   IMPLIES
   -(exists z (isProperPartOf(p,z) AND isProperPartOf(z,w))))))).
    </rdfs:comment>    
  </PartOfProperty>


<!-- partDefinition: the restriction of parts to direct parts 
     of the Whole -->
<!-- (partDefinition Part-Class Whole-Class) -->
  <PartOfProperty rdf:ID="partDefinition">
    <rdfs:label>partDefinition</rdfs:label>
    <rdfs:domain rdf:resource="&obowl;term"/>
    <rdfs:range rdf:resource="&obowl;term"/>
    <rdfs:comment>  This relation is used conjunction with partOf or subEventOf
to state that the part is defined by being part of the whole.
    </rdfs:comment>    
  </PartOfProperty>


<!-- axioms for type and subClassOf
(all x y z ((type(x,y) AND  subClassOff(y,z)) IMPLIES type(x,z))).

-->


<!-- the GO relationships for properties of terms and database entries--> 
<!-- see the GO XML DTD for the original definitions -->
  <rdf:Description rdf:ID="accession">
    <rdfs:label>accession</rdfs:label>
    <rdf:type rdf:resource="&rdf;Property"/>
    <rdfs:domain rdf:resource="&obowl;term"/> 
    <rdfs:range rdf:resource="&rdfs;Literal"/>
    <rdfs:comment> accession is (#PCDATA) in the dtd
    </rdfs:comment>  
  </rdf:Description>

  <rdf:Description rdf:ID="name">
    <rdfs:label>name</rdfs:label>
    <rdf:type rdf:resource="&rdf;Property"/>
    <rdfs:domain rdf:resource="&obowl;term"/>
    <rdfs:range rdf:resource="&rdfs;Literal"/>
    <rdfs:comment> name is (#PCDATA) in the dtd
    </rdfs:comment>  
  </rdf:Description>

  <rdf:Description rdf:ID="synonym">
    <rdfs:label>synonym</rdfs:label>
    <rdf:type rdf:resource="&rdf;Property"/>
    <rdfs:domain rdf:resource="&obowl;term"/>
    <rdfs:range rdf:resource="&rdfs;Literal"/>
    <rdfs:comment> synonym is (#PCDATA) in the dtd
    </rdfs:comment>  
  </rdf:Description>

  <rdf:Description rdf:ID="definition">
    <rdfs:label>definition</rdfs:label>
    <rdf:type rdf:resource="&rdf;Property"/>
    <rdfs:domain rdf:resource="&obowl;term"/>
    <rdfs:range rdf:resource="&obowl;term"/>
    <rdfs:comment> definition is (#PCDATA) in the dtd
    </rdfs:comment>  
  </rdf:Description>

  <rdf:Description rdf:ID="n_associations">
    <rdfs:label>n_associations</rdfs:label>
    <rdf:type rdf:resource="&rdf;Property"/>
    <rdfs:domain rdf:resource="&obowl;term"/>
    <rdfs:range rdf:resource="&rdfs;Literal"/>
    <rdfs:comment>  n_associations is (wrongly) in !ATTLIST of term in the dtd
    </rdfs:comment>  
  </rdf:Description>

  <rdf:Description rdf:ID="association">
    <rdfs:label>association</rdfs:label>
    <rdf:type rdf:resource="&rdf;Property"/>
    <rdfs:domain rdf:resource="&obowl;term"/>
    <rdfs:comment>  association has two components   go:evidence go:gene_product
    </rdfs:comment>  
  </rdf:Description>

  <rdf:Description rdf:ID="dbxref">
    <rdfs:label>dbxref</rdfs:label>
    <rdf:type rdf:resource="&rdf;Property"/>
    <rdfs:domain rdf:resource="&obowl;term"/>
    <rdfs:comment>  dbxref has two components   go:database_symbol, go:reference
    </rdfs:comment>  
  </rdf:Description>

  <rdf:Description rdf:ID="evidence">
    <rdfs:label>evidence</rdfs:label>
    <rdf:type rdf:resource="&rdf;Property"/>
    <rdfs:range rdf:resource="&rdfs;Literal"/>
    <rdfs:comment>  evidence is linked via a blank node from association
    </rdfs:comment>  
  </rdf:Description>

  <rdf:Description rdf:ID="gene_product">
    <rdfs:label>gene_product</rdfs:label>
    <rdf:type rdf:resource="&rdf;Property"/>
    <rdfs:range rdf:resource="&rdfs;Literal"/>
    <rdfs:comment>  gene_product is linked via a blank node from association
    </rdfs:comment>  
  </rdf:Description>

  <rdf:Description rdf:ID="database_symbol">
    <rdfs:label>database_symbol</rdfs:label>
    <rdf:type rdf:resource="&rdf;Property"/>
    <rdfs:range rdf:resource="&rdfs;Literal"/>
    <rdfs:comment>  database_symbol is linked via a blank node from dbxref
    </rdfs:comment>   
  </rdf:Description>

  <rdf:Description rdf:ID="reference">
    <rdfs:label>reference</rdfs:label>
    <rdf:type rdf:resource="&rdf;Property"/>
    <rdfs:range rdf:resource="&rdfs;Literal"/>
    <rdfs:comment>  reference is linked via a blank node from dbxref
    </rdfs:comment>  
  </rdf:Description>

</rdf:RDF>

