Natasha Noy, Stanford
University
Alan
Rector, University of Manchester
Last revised: May 4th, 2004
[Note: This document will be a part of a larger document that will provide an introduction and overview of all ontology design patterns produced by the Semantic Web Best Practices and Deployment Working Group]
In OWL, a property is a binary relation: it links two individuals or an individual and a value. How do we represent relations among more than two individuals? How do we represent properties of a relation, such as our certainty about them, severity or strength of a relation, relevance of a relation, and so on?
Several common use cases fall under the category of n-ary relations. Here are some examples:
Christine
and diagnosis breast_cancer
and there is a qualitative probability value describing this relation (high
).Steve
has two values for two different aspects of a has_temperature
relation: its magnitude
is high
and its trend
is falling
.John
and
Mary
and the book Lenny_the_Lion
participate in.
This relation has other values such as the purpose (birthday_gift
)
and the amount ($15
). In OWL, we have only binary relations (properties) between individuals, such
as a property P
between an individual A
and individual
B
(more precisely, P
is the property of A
with the value B
):
We would like to have another individual or simple value C
to
be part of this relation:
In other words, P
is now a relation among A
, B
,
and C
.
The general solution to representing n-ary relations such as these is to reify the relation among several individuals or values into a separate individual object.
Depending on the relationship between A
, B
, and C
,
we distinguish two patterns to represent n-ary relationships in OWL:
In the first case (pattern 1), one of the individuals
in the relationship (say, A
) is distinguished from others in that
it is the originator of the relationship.Just like in the case of binary
relation, where P
was a property of A
with value B
,
here the reified relation is a property of A
, with the value that
is a complex object in itself, relating several values and individuals. Examples
1 and 2 from the list above fall under this category: Christine
and Steve
in these examples are individuals that the properties
are describing.
In the second case (pattern 2), the n-ary relationship
represents a network of participants that all play different roles in the relation,
but two or more of the participants have equals "importance" in the
relation. Example 3 above would usually fall into this category: At least John
,
Mary
, and the Lenny_The_Lion
book seem to be equally
important in this purchasing relation.
If we need to represent a value describing a relationship (example 1, Christine has breast cancer with high probability) or represent an object of a relationship that has different aspects (example 2, Steve has temperature, which is high, but falling), we can create an individual that includes the relation object itself, as well as the additional information about the object:
For the example 1 above (Christine has breast cancer with high probability),
the individual Christine
has a property has_diagnosis
that has another object (Diagnosis_Relation_1
, an instance of the
reified relation Diagnosis_Relation
) as its value:
The individual Diagnosis_Relation_1
here is the reified relation
representing as a single object both the diagnosis (breast_cancer
)
and the probability of the diagnosis (HIGH
)1:
:Christine
a :Person ;
:has_diagnosis :Diagnosis_Relation_1 . :Diagnosis_Relation_1
a :Diagnosis_Relation ;
:diagnosis_probability :HIGH;
:diagnosis_value :Breast_Cancer .
Here is a definition of the class Diagnosis_Relation
:
:Diagnosis_Relation
a owl:Class ;
rdfs:subClassOf
[ a owl:Restriction ;
owl:allValuesFrom :Disease ;
owl:onProperty :diagnosis_value
] ;
rdfs:subClassOf
[ a owl:Restriction ;
owl:allValuesFrom :Probability_values ;
owl:onProperty :diagnosis_probability
] .
In the definition of the Person
class (of which the individual
Christine
is an instance) we specify a property has_diagnosis with
the range restriction going to the Diagnosis_Relation
class (of
which Diagnosis_Relation_1
is an instance):
:Person
a owl:Class ;
rdfs:subClassOf
[ a owl:Restriction ;
owl:allValuesFrom :Diagnosis_Relation ;
owl:onProperty :has_diagnosis
] .
[N3] [RDF/XML abbrev] [Abstract syntax]
We have a different use case in the example 2 above (Steve has temperature,
which is high, but falling): In the example with the diagnosis, many will
view the relationship we were representing as in a fact still a binary
relation between the individual Christine
and the diagnosis breast_cancer
that has a probability associated with it. The relationship in this example
is between the individual Steve
and the object representing different
aspects of the temperature he has. In most intended interpretations, this relationship
cannot be viewed as a binary relation with additional attributes attached to
it. Rather it is a relation between the individual Steve
and the
complex object representing different facts about his temperature.
The OWL pattern that implements this intuition is however the same as in the
pervious example. A class Person
(of which the individual Steve
is an instance) has a property has_temperature
which has as a range
a reified-relation class Temperature_Relation.
Instances of the
class Temperature_Relation
(such as Temperature_Relation_1
in the figure) in turn have properties for temperature_value
and
temperature_trend
.
[N3] [RDF/XML abbrev] [Abstract syntax]
In some cases, the n-ary relationship represents a network of individuals that
play different roles in a structure without any single individual standing out
as the originator or the owner of the relation, such as Purchase
in the example 3 above (John buys a "Lenny the Lion" book from
Mary for $15 as a birthday gift). Here, the relationship explicitly has
more than one participant, and, in many contexts, none of them can be considered
a primary one. In this case, we create an individual to represent the relation
with links to all participants:
In our specific example, the representation will look as follows:
Purchase_1
is an individual instance of the Purchase
class representing a reified relation:2
:Purchase_1
a :Purchase ;
:has_agent :John ;
:has_object :Lenny_The_Lion ;
:has_purpose :Birthday_Gift ;
:has_recipient :Mary .
where the class Purchase
is defined as follows (we require that
each purchase has at least an agent and an object):
:Purchase
a owl:Class ;
rdfs:subClassOf
[ a owl:Restriction ;
owl:allValuesFrom :Purpose ;
owl:onProperty :has_purpose
] ;
rdfs:subClassOf
[ a owl:Restriction ;
owl:allValuesFrom :Person ;
owl:onProperty :has_agent
] ;
rdfs:subClassOf
[ a owl:Restriction ;
owl:minCardinality "1" ;
owl:onProperty :has_agent
] ;
rdfs:subClassOf
[ a owl:Restriction ;
owl:allValuesFrom :Object ;
owl:onProperty :has_object
] ;
rdfs:subClassOf
[ a owl:Restriction ;
owl:allValuesFrom :Person ;
owl:onProperty :has_recipient
] ;
rdfs:subClassOf
[ a owl:Restriction ;
owl:minCardinality "1" ;
owl:onProperty :has_object
] .
[N3] [RDF/XML abbrev] [Abstract syntax]
is_adjacent_to
property for the head
,
and the value of that property is a reified relation linking it to the neck
and specifying the axis
as an additional attribute in the relation
(pattern 1)adjacency_relation
that
has head
and neck
as its two values for the property
object
and horizontal
as the value for the property
axis
.John
buying the Lenny_The_Lion
book. We may want to have an inverse relation pointing from the Lenny_The_Lion
book to the person who bought it. If we had a simple binary relation John
buys
Lenny_The_Lion
, defining an inverse is simple:
we simply define a property is_bought_by
as an inverse of buys
::is_bought_byWith the purchase relation reified, however, we need to add inverse relations between participants in the relation and the reified relation itself:
a owl:ObjectProperty ;
owl:inverseOf :buys .
agent
and object
of a purchase, look as follows::is_agent_forAnd the definition of the
a owl:ObjectProperty ;
owl:inverseOf :has_agent . :is_object_for
a owl:ObjectProperty ;
owl:inverseOf :has_object .
Person
class (taking into account the
inverse for the recipient
property) is::PersonNote that the value of the inverse property
a owl:Class ;
rdfs:subClassOf
[ a owl:Restriction ;
owl:onProperty :is_recipient_for ;
owl:allValuesFrom :Purchase
] ;
rdfs:subClassOf
[ a owl:Restriction ;
owl:onProperty :is_agent_for ;
owl:allValuesFrom :Purchase
] .
is_agent_for
for
the individual John
, for example, is the individual Purchase_1
rather than the object
or recipient
of the purchase.For simplicity, we represent each disease
as an individual. This decision may not always be appropriate, and we refer
the reader to a different note (ref to be added). Similarly, for
simplicity, we represent probability values as a class that is an enumeration
of three individuals (HIGH
, MEDIUM
, and LOW
):
:Probability_values
a owl:Class ;
owl:equivalentClass
[ a owl:Class ;
owl:oneOf (:HIGH :MEDIUM :LOW)
] .
There are other ways to represent partitions of values. Please refer to a different note (ref to be added)