Xiaoshu,

You raise the issue of open vs closed world, which has been on my mind whenever any translation to OWL comes up. I have ahead of me some databases in OBO that I will be looking to convert to OWL. I intend to build constructs that enable reasoners to tell me
new things about the data.

Having had many surprises in learning how the open world works and how OWL works I'm curious to know how this is handled. I have not yet taken on the task to learn OBO as I hope not have to. I would like to feel confident that I can convert a file into OWL and use it, however I can't see how an automated translator, without some user interaction or settings can know, for example, that a set of subclasses must
be disjoint, for example.  Is the translation primarily syntactic?

What I can't imagine is how an OBO converter would know if that is what I meant when
we didn't even know.  That's my main question.

By the way, I also agree with your suggestion in response to Mary's question and the criticism of BioPAX. Open world and OWL are technologies that require a lot of careful thinking and getting used to. It takes some very different kind of thinking to get it right. We didn't fully appreciate this in the early days of BioPAX and we didn't get it right. In fact, For the first release of Level 1 didn't make the physical entity classes disjoint.
Which is the most common mistake beginners make when going from
closed world to open world modeling.

Now a quick plug for two papers I still think are the most enlightening for anyone
embarking on OWL.  Matthew Horridge's Progege OWL Tutorial
(http://www.co-ode.org/resources/tutorials/ProtegeOWLTutorial.pdf) and
The OWL Pizza - common errors (http://www.co-ode.org/resources/papers/ ekaw2004.pdf).
I just re-read that one yesterday morning.

On BioPAX we are still learning about OWL and how to best use it and reasoning technology. We are working to correct the errors and mistakes we know about and further educating ourselves
to hopefully get it right in future releases.

Sincerely,
Joanne


On Oct 11, 2006, at 2:47 PM, Xiaoshu Wang wrote:


--Mary,

I am not familiar with OBO, but what you are suggesting is actually what should be avoided in RDF. RDF is based on open world assumption. But to have one superclass for the purpose of enforcing certain annotation property
is a closed world thinking in Object Oriented world.

In your case, I wonder if there is any concrete criteria that makes one resource an obo:Term but the other not? If not, why invent another term for it? And doing so will at least make the statement very odd to understand. For instance, assume there is an instance of gene class Y named x. Then, we
can say,

@prefix gene: <http://example.com/genes#> .
gene:Y rdfs:subClassOf obo:Term .

Then it is natural to say,

_:x a gene:Y .

but it would be very odd to say,

_:x a obo:Term .

In addition, it will incur unnecessary computation complexity for RDF
engine.

This kind of pseudo-Superclass pattern is also used. Everything in MGED is an MGED:Ontology and everything in BIO-PAX is a bio-pax:entity. But the main purpose of this super-class is to enforce certain AnnotationProperty or grouping terms. No offense to those groups, but I think the design is wrong
and should be avoided.

To design a superclass is different form designing certain properties, like obo:name, obo:id etc., because it is still natural to say that something is
a gene but has certain name and id etc., like the following,

_:x a gene:Y ;
   obo:name "Some gene" ;
   obo:id   "12345" .

And best of all, you shouldn't invent those properties, because each
resource should have a URI and rdfs:label can be used for name. And there
are other ontology like Dublin Core at your dispense as well.

You probably wondered then, how can interoperability to be ensured if there is no way to constrain it. My take to this is to think it in long term. Overtime, a few commonly used ontology would be shared by people who have the same interest. Take economy as an analogy, controled market have short term stability but destine to collapse big time some time. But free market economy have occassional turmoil, especially at the beginning but is more robust and stable in the long run. So, don't worry about how others will do in the future. Just think about if there is any ontologies that can help
you adequately describe your data.

Xiaoshu


-----Original Message-----
From: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED] On Behalf Of Mary Montoya
Sent: Wednesday, October 11, 2006 1:09 AM
To: [EMAIL PROTECTED]; [email protected]
Subject: using OBO in owl format to describe data


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












Reply via email to