RE: Mustangs vs myMustang

Hi Dick, Valentin, Jos, Geoff and Benjamin,

 

I have collected the essence of this thread, just to find where the
unanswered questions keep lingering. These unanswered questions are listed
below. Please address these and try to bring these to a solution.

 

Unanswered questions:

1.Dick <> :  Then  OWL allows using a subClass (Mustangs) of Car or an
instance (myMustang) of Car as an object ???

2.Hans <> : For the latter I don't know what the object of that rdf:type is,
the owl:Class or the RDF extension of it.

3.Hans <> : So, we create an owl:Thing "Mustangs" that is typed with the
owl:Class "Mustangs", and is the "extension" of that Class. Right?

4.Benjamin <> : So, whenever a reasoner encounters a #Mustangs individual,
shouldn't it be able to deduce the manufacturer to be #FordCompany?

 

The final solution seems to gravitate to that suggested by Geoff and
Benjamin, although I must say that I do't really like it because to me it
looks like a work-around.

 

>From the beginning I have struggled with chapter 3.1.3 of the OWL Guide. So
let me ask this question: If I have:

 

    <owl:Thing rdf:ID="Mustang"/> 

    <owl:Thing rdf:about="#Mustang">

        <rdf:type rdf:resource="http://www.example.org/library#Mustang"/> 

    </owl:Thing>

 

then does this mean that I have here the class extension? (see OWL Web
Ontology Language Reference chapter 3: "Classes provide an abstraction
mechanism for grouping resources with similar characteristics. Like RDF
classes, every OWL class is associated with a set of individuals, called the
class extension."

If so, and if myMustang is typed with this c lass extension, then I'd think
that the OWL logic could assess that Ford also is the manufacturer of
myMustang:

 

=====================

 

RESUMING:

 

Please shoot at what I have concluded from the thread below. Please tell me
where my code is incorrect, redundant, unwieldy, or whatever. I need some
quality benchmark before I use such code a thousand times and then find out
that it does not do the job:

 

In an assumed ontology http://www.example.org/library:

--------------------------------------------------------------------

...

 

    <owl:Property rdf:ID="isManufacturerOf">

        <rdf:domain rdf:resource="#Manufacturer"/>

        <rdf:range rdf:resource="#Artifact"/>

    </owl:Property>

                

    <owl:Property rdf:ID="hasAsManufacturer">

        <owl:inverseOf rdf:resource="#isManufacturerOf"/> 

    </owl:Property>

 

...

 

    <owl:Class rdf:ID="Organization"/>

 

    <owl:Class rdf:ID="Company">

        <rdfs:subClassOf rdf:resource="#Organization"/>

    </owl:Class>

 

    <owl:Class rdf:ID="Manufacturer">

        <rdfs:subClassOf rdf:resource="#Company"/>

    </owl:Class> 

 

    <owl:Class rdf:ID="CarManufacturer">

        <rdfs:subClassOf rdf:resource="#Manufacturer"/>

        <owl:Restriction> 

            <owl:onProperty rdf:resource="#isManufacturerOf"/> 

            <owl:hasValue rdf:resource="#Car"/> 

        </owl:Restriction>

    </owl:Class>

 

...

 

    <owl:Class rdf:ID="Artifact"/>

    

    <owl:Class rdf:ID="Vehicle">

        <rdfs:subClassOf rdf:resource="#Artifact"/>

    </owl:Class>

 

    <owl:Class rdf:ID="Car">

        <rdfs:subClassOf rdf:resource="#Vehicle"/>

    </owl:Class>

 

    <owl:Class rdf:ID="Mustang">

        <rdfs:subClassOf rdf:resource="#Car"/>

    </owl:Class> 

 

    <owl:Class rdf:ID="Scorpio">

        <rdfs:subClassOf rdf:resource="#Car"/>

    </owl:Class> 

 

...

 

 

In an assumed ontology http://www.example.org/projectA :

----------------------------------------------------------------------

...

 

    <owl:Thing rdf:ID="Mustang"/> 

    <owl:Thing rdf:about="#Mustang">

        <rdf:type rdf:resource="http://www.example.org/library#Mustang"/>

        <owl:Restriction> 

                <owl:onProperty rdf:resource="
http://www.example.org/library#hasAsManufacturer"/> 

                <owl:hasValue rdf:resource="#FordCompany"/> 

                </owl:Restriction>

    </owl:Thing>

 

    <owl:Thing rdf:ID="Scorpio"/> 

    <owl:Thing rdf:about="#Scorpio">

        <rdf:type rdf:resource="http://www.example.org/library#Scorpio"/>

        <owl:Restriction> 

                <owl:onProperty rdf:resource="
http://www.example.org/library#hasAsManufacturer"/> 

                <owl:hasValue rdf:resource="#FordCompany"/> 

                </owl:Restriction>

    </owl:Thing>

 

    <owl:Thing rdf:ID="FordCompany"/> 

    <owl:Thing rdf:about="#FordCompany">

        <rdf:type
rdf:resource="http://www.example.org/library#CarManufacturer"/> 

        <isManufacturerOf rdf:resource="#Mustang"/>

        <isManufacturerOf rdf:resource="#Scorpio"/>

    </owl:Thing>

 

    <owl:Thing rdf:ID="myMustang"/> 

    <owl:Thing rdf:about="#myMustang">

        <rdf:type rdf:resource="#Mustang"/>   <!-- or is it allowed to type
this directly with http://www.example.org/library#Mustang ? -->

        <hasAsManufacturer rdf:resource="#FordCompany"/> 

    </owl:Thing>

 

...

 

####################################################

The thread went as follows:

####################################################

 

Hans Teijgeler:

-----------------

I am still not 100% certain how to model the following:

- Ford Company isManufacturerOf Mustangs

- Ford Company isManufacturerOf myMustang

It seems that in both cases the same code is used, but I may be totally
wrong.

 

Dick McCullough:

--------------------

    FordCompany  isManufacturerOf  Mustangs

    myMustang  rdf:type  Mustangs

 

Hans Teijgeler:

-----------------

No, that is not what I want. I need to see how the code for both triples
looks like.

 

Dick McCullough:

--------------------

#       Ford Company   isManufacturerOf   Mustangs

#       Ford Company   isManufacturerOf   myMustang

 

<owl:Property rdf:ID="isManufacturerOf">

        <rdf:domain rdf:resource="#Company"/>

        <rdf:range rdf:resource="#CarBrand"/>

        <rdf:range rdf:resource="#Car"/>

</owl:Property>

 

<Company rdf:ID="FordCompany"/>

 

<CarBrand rdf:ID="Mustangs">

        <rdfs:subClassOf rdf:resource="#Car">

</CarBrand>

 

<Car rdf:ID="myMustang"/>

        <rdf:type rdf:resource="#Mustangs"/>

</Car>

 

<FordCompany> <isManufacturerOf> <Mustangs/>

<FordCompany> <isManufacturerOf> <myMustang/>

 

Dick McCullough:

--------------------

common super class (lub) is Car.  The hierarchy is Car /  Mustangs
(CarBrand)

//   myMustang

 

So property should be declared as

<owl:Property rdf:ID="isManufacturerOf">

    <rdf:domain rdf:resource="#Company"/>

    <rdf:range rdf:resource="#Car"/>

</owl:Property>

 

Then  OWL allows using a subClass (Mustangs) of Car or an instance
(myMustang) of Car as an object ???

 

Valentin Sauerkraut:

------------------------

"Multiple domains mean that the domain of the property is the intersection
of the identified classes (and similarly for range)."[1]

So imho you created a property whose range consists of things that are of
type CarBrand AND of type Car. 

. . .

This implies

that both Mustangs and myMustang are of type Car and of type CarBrand. 

The easiest solution in this case is propably to specifiy the range of
isManufacturerOf as some common superclass of both car and carBrand. 

 

Hans Teijgeler:

-----------------

To me it seems that:

-         both triples can only exist in the RDF world

-         Mustangs is the extent (in RDF) of an owl:Class Mustangs

-         Mustang is typed with Mustangs

For the latter I don't know what the object of that rdf:type is, the
owl:Class or the RDF extent of it.

 

Jos DeRoo:

-----------

:isManufacturerOf rdfs:domain :Manufacturer; rdfs:range :Car.

:Mustangs rdfs:subClassOf :Car.

 

:FordCompany :isManufacturerOf :myMustang.

:myMustang rdf:type :Mustangs.

 

Hans Teijgeler:

-----------------

I came with this question because in our ISO 15926 modelling team we have
been puzzled by this for some time. Ford Company and myMustang are
individuals in space-time, the Class "Mustangs" isn't. 

 

If I have understood RDF and OWL well, Ford Company and myMustang are in
defined in RDF, and the Class "Mustangs" is defined in OWL (as a subClassOf
Car). That creates a kind of "cross-over" Property isManufacturerOf  between
the RDF domain (Ford) and the OWL domain (Mustangs) that is not allowed.

 

So, we create an owl:Thing "Mustangs" that is typed with the owl:Class
"Mustangs", and is the "extent" of that Class. Right? Now we need to create
the owl:Property isManufacturerOf, as Dick has illustrated below. However,
defining an intersection in RDF is not allowed.  myMustang isn't a Class.

 

PS to Dick: CarBrand is different from what I meant with Mustangs.

 

Hans Teijgeler:

-----------------

The question is: how do I represent the information that FordCompany
isManufacturerOf Mustangs i.e. how do I define that Property?

 

Jos DeRoo:

-----------

My take would be to use a rule:

 

{?M :isManufacturerOf ?C.

 ?C rdf:type ?B}

 => {?M :yourProperty ?B}.

 

so that from

 

:FordCompany :isManufacturerOf :myMustang.

:myMustang rdf:type :Mustangs.

 

it follows that

 

:FordCompany :yourProperty :Mustangs.

 

Geoff Chappell:

------------------

:Mustangs rdfs:subClassOf 

                [

                                a owl:Restriction;

                                owl:hasValue :FordCompany; 

                                owl:onProperty [owl:inverseOf
:isManufacturerOf]

                ]

 

Benjamin Nowack:

----------------------

>The question is: how do I represent the information that FordCompany 

>isManufacturerOf Mustangs i.e. how do I define that Property?

hm, I'm probably stating the obvious, but I think it comes down to the
attempt to mix instance data with onto data, which is not so easy with the
basic OWL/RDFS axioms (of course, every subject/object in a triple can be
considered an instance, but I hope it's clear what I'm trying to say). So,
the basic means to specify a property are domain and range which expect
ontological constructs such as property or class as subject or object
respectively. That's why it's to intuitive to use them to say something
about #FordCompany, an individual.

 

One OWL construct I can think of atm which links ontological things to
individuals are "hasValue" property restrictions, but they require the class
to be the subject (in your example above #Mustangs is the object). What you
could perhaps describe is an inverse of isManufacturerOf, which could then
be used in such a property restriction (sorry for probaly broken syntax):

[[

   #hasManufacturer owl:inverseOf #isManufacturerOf .

   #Mustangs rdfs:subClassOf [

      rdf:type owl:Rescriction ;       

      owl:onProperty #hasManufacturer ;

      owl:hasValue #FordCompany ].

   #Mustangs rdfs:subClassOf [

      rdf:type owl:Rescriction ;       

      owl:onProperty #hasManufacturer ;

      owl:cardinality 1 ].

]]

 

So, whenever a reasoner encounters a #Mustangs individual, shouldn't it be
able to deduce the manufacturer to be #FordCompany?

Not really thought through, may well be that #hasManufacturer has to be
functional or that it doesn't work at all. But "hasValue"

restrictions could be a way to get closer to what you are trying to model
without the need for custom rules.

 

just an idea,

 

Jos DeRoo (response to Geoff):

----------------------------------

True, that should do it and I was too much thinking about chained
properties, such as :uncle :-)

 

Geoff Chappell:

------------------

Or more directly (though not as strong):

 

:FordCompany rdf:type [a owl:Restriction;

                owl:onProperty :isManufacturerOf;

                owl:someValuesFrom :Mustangs]

 

####################################################

 

 

 

 

  _____  

ORIGINAL QUESTION

  _____  

From: semantic-web-request@w3.org [mailto:semantic-web-request@w3.org] On
Behalf Of Hans Teijgeler
Sent: Friday, October 14, 2005 7:11 PM
To: semantic-web@w3c.org
Subject: Mustangs vs myMustang

 

Hi,

 

I am still not 100% certain how to model the following:

 

-         Ford Company   isManufacturerOf   Mustangs

-         Ford Company   isManufacturerOf   myMustang

 

It seems that in both cases the same code is used, but I may be totally
wrong.

 

I'd appreciate some enlightment.

 

Regards,

Hans

_______________________ 

Hans Teijgeler

ISO 15926 specialist

 <http://www.InfowebML.ws> www.InfowebML.ws

 <mailto:hans.teijgeler@quicknet.nl> hans.teijgeler@quicknet.nl

phone +31-72-509 2005      

 

Received on Sunday, 16 October 2005 11:20:10 UTC