W3C home > Mailing lists > Public > public-semweb-lifesci@w3.org > October 2006

using OBO in owl format to describe data

From: Mary Montoya <mhm@ncgr.org>
Date: Tue, 10 Oct 2006 23:08:52 -0600
Message-ID: <452C7C64.30908@ncgr.org>
To: semantic-web@w3.org, public-semweb-lifesci@w3.org

I have a question about using the OpenBiomedicalOntologies such as the 
SequenceOntology in owl format to describe data resident in my local 
biological database. 

It seems desirable to leverage subclass relationships of terms in the 
hierarchy of the SequenceOntology and to have all the terms there rooted 
in a common parent obo:Term class.  OBO defines certain information to 
be provided for all OBO terms such as name, id, definition, etc.  These 
provide descriptive information of the class itself not properties of 
members of the class.  So it seems all obo:Terms would have "class 
values" for a name, id, def, etc.  I would then expect to find classes 
in SequenceOntology  that are defined as subClassOf obo:Term and reflect 
the hierachical structure of those SequenceOntology terms, for example, 
so:Gene as a subClassOf so:Region which is a subClassOf 
so:Located_sequence_feature which is a subClassOf obo:Term.  The 
problem  is that the owl class definitions I've seen for OBO terms don't 
also include property definitions for individuals of the class.  So an 
individual of so:Gene doesn't have a property for name, id, def, etc 
that I can provide values for from my database.  There are only these 
class description properties often defined using rdfs:label, 
rdfs:comment or as annotation type properties. 
My question is:  How can I use these publicly available ontologies to 
hold values for my data? They seem poised for interoperability if these 
properties were available to individuals of these classes.

Here is one sequence ontology definition I found for gene in owl format 
( others I've seen look similar )

 <owl:Class rdf:ID="SO_0000704">
       <rdfs:label xml:lang="en">gene</rdfs:label>
       <rdfs:comment 
rdf:datatype="http://www.w3.org/2001/XMLSchema#string">A locatable 
region of genomic sequence, corresponding to a unit of inheritance, 
which is associated with regulatory regions, transcribed regions and/or 
other functional sequence regions</rdfs:comment>
       <rdfs:subClassOf rdf:resource="#SO_0000001"/>
</owl:Class>

I thought something like this would be more useful:

   <owl:Class rdf:about="&so;SO_0000704">
        <obo:classId>SO:0000704</obo:classId>
        <obo:className>gene</obo:className>
        <obo:classDef>
            "A locatable region of genomic sequence, corresponding to a unit of 
            inheritance, which is associated with regulatory regions, 
            transcribed regions and/or other functional sequence regions" 
            [SO:rd] 
        </obo:classDef>
        <rdfs:subClassOf rdf:resource="&so;SO_0000001"/>
    </owl:Class>

with the root parent Term defined within an obo namespace as 
    <owl:Class rdf:about="&obo;Term">
        <obo:classId>OBO:Term</obo:classId>
        <obo:className>term</obo:className>
        <obo:classDef>
            Term is a blah, blah
        </obo:classDef>
        <rdfs:subClassOf>
            <owl:Restriction>
                <owl:onProperty rdf:resource="&obo;name"/>
                <owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">
                    1
                </owl:minCardinality>
                <owl:maxCardinality rdf:datatype="&xsd;nonNegativeInteger">
                    1
                </owl:maxCardinality>
            </owl:Restriction>
        </rdfs:subClassOf>
        <rdfs:subClassOf>
            <owl:Restriction>
                <owl:onProperty rdf:resource="&obo;id"/>
                <owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">
                    1
                </owl:minCardinality>
                <owl:maxCardinality rdf:datatype="&xsd;nonNegativeInteger">
                    1
                </owl:maxCardinality>
            </owl:Restriction>
        </rdfs:subClassOf>
        <rdfs:subClassOf>
            <owl:Restriction>
                <owl:onProperty rdf:resource="&obo;def"/>
                <owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">
                    0
                </owl:minCardinality>
                <owl:maxCardinality rdf:datatype="&xsd;nonNegativeInteger">
                    1
                </owl:maxCardinality>
            </owl:Restriction>
        </rdfs:subClassOf>
    </owl:Class>

Then I could do something like this:

    <owl:Class rdf:about="&mystuff;MyGene">
	<rdfs:subClassOf rdf:resource="&so;SO_0000704"/>
        <rdfs:subClassOf>
            <owl:Restriction>
                <owl:onProperty rdf:resource="&mystuff;chromosomeNumber"/>
                <owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">
                    1
                </owl:minCardinality>
                <owl:maxCardinality rdf:datatype="&xsd;nonNegativeInteger">
                    1
                </owl:maxCardinality>
            </owl:Restriction>
        </rdfs:subClassOf>
         <rdfs:subClassOf>
            <owl:Restriction>
                <owl:onProperty rdf:resource="&mystuff;startCoordinate"/>
                <owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">
                    1
                </owl:minCardinality>
                <owl:maxCardinality rdf:datatype="&xsd;nonNegativeInteger">
                    1
                </owl:maxCardinality>
            </owl:Restriction>
        </rdfs:subClassOf>
         <rdfs:subClassOf>
            <owl:Restriction>
                <owl:onProperty rdf:resource="&mystuff;endCoordinate"/>
                <owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">
                    1
                </owl:minCardinality>
                <owl:maxCardinality rdf:datatype="&xsd;nonNegativeInteger">
                    1
                </owl:maxCardinality>
            </owl:Restriction>
        </rdfs:subClassOf>
        <rdfs:subClassOf>
            <owl:Restriction>
                <owl:onProperty rdf:resource="&mystuff;sequence"/>
                <owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">
                    1
                </owl:minCardinality>
                <owl:maxCardinality rdf:datatype="&xsd;nonNegativeInteger">
                    1
                </owl:maxCardinality>
            </owl:Restriction>
        </rdfs:subClassOf>
    </owl:Class>

so now I have defined a class MyGene that extends from obo to sequence 
ontology and I can define individuals with property values for the 
following from my database:
obo:name
obo:id
obo:def
mystuff:sequence
mystuff:endCoordinate
mystuff:startCoordinate
mystuff:chromosomeNumber

It seems presumptuous to define properties for individuals ( name, id, 
etc ) as well as class properties ( className, classID, etc ) for public 
ontologies such as obo ontologies but possibly quite useful for 
interoperability sake.  Any comments would be welcome.

Mary Montoya

VPIN project team
NCGR
Received on Wednesday, 11 October 2006 11:28:24 GMT

This archive was generated by hypermail 2.3.1 : Tuesday, 26 March 2013 18:00:45 GMT