Although the OWL Web Ontology Language adds considerable expressive power to the Semantic Web it does have expressive limitations, particularly with respect to what can be said about properties. We present ORL (OWL Rules Language), a Horn clause rules extension to OWL that overcomes many of these limitations. ORL extends OWL in a syntactically and semantically coherent manner: the basic syntax for ORL rules is an extension of the abstract syntax for OWL DL and OWL Lite; ORL rules are given formal meaning via an extension of the OWL DL model-theoretic semantics; ORL rules are given an XML syntax based on the OWL XML presentation syntax; and a mapping from ORL rules to RDF graphs is given based on the OWL RDF/XML exchange syntax. We discuss the expressive power of ORL, showing that the ontology consistency problem is undecidable, provide several examples of ORL usage, and discuss how reasoning support for ORL might be provided.
parent(?a,?b) ∧ brother(?b,?c) → uncle(?a,?c) Student ≤ Person ∩ (∃ ssn xsd:int)
ssn ≤ Person × xsd:int john ∈ Student ∩ (ssn : "565"^^xsd:int) parent(?a,?b) ∧ brother(?b,?c) → uncle(?a,?c) bodyPart(?a,?b) ∧ disease(?b,?c) → disease(?a,?c) child(?a,?b) ∧ Student(?b) → dependent(?a,?b)
rule ::= 'Implies(' { annotation } antecedent consequent ')'
antecedent ::= 'Antecedent(' { atom } ')'
consequent ::= 'Consequent(' { atom } ')'
atom ::= description '(' i-object ')'
atom ::= individualvaluedPropertyID '(' i-object i-object ')'
atom ::= datavaluedPropertyID '(' i-object d-object ')'
atom ::= sameAs '(' i-object i-object ')'
atom ::= differentFrom '(' i-object i-object ')'
i-object ::= 'I-variable(' URIreference ')' | individualID
d-object ::= 'D-variable(' URIreference ')' | dataLiteral
All variables in a rule must occur (at least) in the antecedent.
parent(?a,?b) ∧ brother(?b,?c) → uncle(?a,?c) John ∈ ≤0 uncle and
John ∈ (father : Jack ) Jack ∈ ≤0 brother.
Transferring style from an artist to his/her paintings
(from Guus Schreiber).
Artist(?x) ∧ Style(?y) ∧ artistStyle(?x, ?y) ∧ creator(?x, ?z)
→
style/period(?z, ?y)
Inheriting trauma from body parts
(often needed in medical ontologies).
Location(?x) ∧ Trauma(?y) ∧ isLocationOf(?x, ?y) ∧ isPartOf(?x,?z)
→
isLocationOf(?z, ?y)
(From a larger example by Mike Dean.)
Location(?maploc) ∧
sameLocation(?loc,?maploc) ∧
latitude(?loc,?lat) ∧
longitude(?loc,?lon)
→
latitude(?maploc,?lat) ∧
latitude(?maploc,?lon)
Airport(?airport) ∧
location(?airport,?loc) ∧
latitude(?loc,?lat) ∧
longitude(?loc,?lon)
→
( ∃ sameLocation ( Location ∩
∃ isLocationOf ( Point ∩
∃ isObjectOf ( { layer } ) ) ) )(?loc)
Airport(?airport) ∧
location(?airport,?loc) ∧
sameLocation(?loc,?maploc) ∧
Location(?point,?maploc) ∧
name(?airport,?name)
→
underlyingObject(?point,?airport) ∧
label(?point,?name)