The OWL Web Ontology Language Semantics and Abstract Syntax [OWL S&AS] document includes a presentation of an abstract syntax for OWL. The use of the term abstract syntax is somewhat of a misnomer, however, as the presentation is rather concrete. Not quite concrete enough, however, to fully describe a format that one can easily parse. In this document, we extend the grammar to provide a description of text-based concrete serialization for OWL ontologies.
This is a draft produced 10 December, 2003. Note that although this document relates to the OWL Web Ontology Language, it does not form part of the W3C WebOnt document set.
The OWL Web Ontology Language Semantics and Abstract Syntax [OWL S&AS] document includes a presentation of an abstract syntax for OWL. This is intended primarily as a mechanism to enable the definition of the formal semantics of the language along with the mapping into the normative concrete serialization in terms of RDF triples.
The use of the term abstract syntax is somewhat of a misnomer, however, as the actual presentation given is rather concrete. It is not quite concrete enough, however, to fully describe a format that one can easily parse. A standardised plain text ASCII format for serialization of OWL ontologies is likely to prove useful — for example for presenting small example ontologies in tutorial material. A similar approach has been taken with RDF, where N-Triples [N-Triples] provides a plain text format for encoding RDF graphs. In this document, we extend the grammar to provide a description of text-based concrete serialization for OWL ontologies. We follow the conventions adopted in N-Triples to cover URI references and literal values.An OWL Concrete Abstract Syntax document is a sequence of Unicode
characters encoded in UTF-8 defined by the grammar below. This
grammar is based on that given in [OWL
S&AS] with a number of extensions and a precise
definition for literals and URI references. We include a new
Namespace construct that relates a prefix to a
URI. Namespace constructs have document scope. The following
namespace prefixes are assumed to be predefined and can be used
without definition:
rdf = http://www.w3.org/1999/02/22-rdf-syntax-ns# xsd = http://www.w3.org/2001/XMLSchema# rdfs = http://www.w3.org/2000/01/rdf-schema# owl = http://www.w3.org/2002/07/owl#
Note that (unlike N3 grammars), we do not allow
the use of
_ as a prefix name.
ontology ::= namespace* 'Ontology(' ontologyID? directive* ')'
directive ::= 'Annotation('
( ontologyPropertyID ontologyID
| annotationPropertyID URIreference
| annotationPropertyID dataLiteral
| annotationPropertyID individual )
')'
| fact
| axiom
fact ::= individual
| 'SameIndividual(' individualID individualID+ ')'
| 'DifferentIndividuals(' individualID individualID+ ')'
individual ::= 'Individual(' individualID? annotation*
('type(' type ')')* value* ')'
value ::= 'value('
( individualvaluedPropertyID individualID
| individualvaluedPropertyID individual
| datavaluedPropertyID dataLiteral )
')'
type ::= description
axiom ::= 'Class(' classID 'Deprecated'? modality annotation* description* ')'
| 'EnumeratedClass(' classID 'Deprecated'? annotation* individualID* ')'
| 'DisjointClasses(' description description+ ')'
| 'EquivalentClasses(' description description* ')'
| 'SubClassOf(' description description ')'
| 'Datatype(' datatypeID 'Deprecated'? annotation* )'
| 'DatatypeProperty(' datavaluedPropertyID 'Deprecated'? annotation*
('super(' datavaluedPropertyID ')' )* 'Functional'?
('domain(' description ')')* ('range(' dataRange ')')* ')'
| 'ObjectProperty(' individualvaluedPropertyID 'Deprecated'? annotation*
( 'super(' individualvaluedPropertyID ')')*
( 'inverseOf(' individualvaluedPropertyID ')' )? 'Symmetric'?
( 'Functional' | 'InverseFunctional' | 'Transitive' )?
( 'domain(' description ')' )*
( 'range(' description ')' )*
')'
| 'AnnotationProperty(' annotationPropertyID annotation* ')'
| 'OntologyProperty(' ontologyPropertyID annotation* ')'
| 'EquivalentProperties(' datavaluedPropertyID datavaluedPropertyID
datavaluedPropertyID* ')'
| 'EquivalentProperties(' individualvaluedPropertyID individualvaluedPropertyID
individualvaluedPropertyID* ')'
| 'SubPropertyOf(' datavaluedPropertyID datavaluedPropertyID ')'
| 'SubPropertyOf(' individualvaluedPropertyID individualvaluedPropertyID ')'
annotation ::= 'annotation('
( annotationPropertyID URIreference
| annotationPropertyID dataLiteral
| annotationPropertyID individual )
')'
modality ::= 'complete' | 'partial'
description ::= classID
| restriction
| 'unionOf(' description* ')'
| 'intersectionOf(' description* ')'
| 'complementOf(' description ')'
| 'oneOf(' individualID* ')'
restriction ::= 'restriction('
( datavaluedPropertyID dataRestrictionComponent dataRestrictionComponent*
| individualvaluedPropertyID individualRestrictionComponent individualRestrictionComponent*
)
')'
dataRestrictionComponent ::= 'allValuesFrom(' dataRange ')'
| 'someValuesFrom(' dataRange ')'
| 'value(' dataLiteral ')'
| cardinality
individualRestrictionComponent ::= 'allValuesFrom(' description ')'
| 'someValuesFrom(' description ')'
| 'value(' individualID ')'
| cardinality
cardinality ::= 'minCardinality(' non-negative-integer ')'
| 'maxCardinality(' non-negative-integer ')'
| 'cardinality(' non-negative-integer ')'
dataRange ::= datatypeID
| 'rdfs:Literal'
| 'oneOf(' dataLiteral* ')'
datatypeID ::= URIreference
classID ::= URIreference
individualID ::= URIreference
ontologyID ::= URIreference
datavaluedPropertyID ::= URIreference
individualvaluedPropertyID ::= URIreference
annotationPropertyID ::= URIreference
ontologyPropertyID ::= URIreference
/****************************************************************
* The following rules are extensions to the original grammar
* provided in the OWL S&AS document.
*
* They extend the grammar with a Namespace declaration and give
* a specification for URIreferences and dataLiterals.
****************************************************************/
namespace ::= 'Namespace(' prefix '=' '<' absoluteURI '>' ')'
URIreference ::= '<' absoluteURI '>' | qname
qname ::= prefix ':' localname
prefix ::= letter+
localname ::= letter (letter | number | '_')*
letter ::= Any Unicode Letter
number ::= Any Unicode Number
dataLiteral ::= langString | datatypeString
langString ::= '"' string '"' ( '@' language )?
datatypeString ::= '"' string '"' '^^' URIreference
language ::= [a-z]+ ('-' [a-z0-9]+ )* encoding a language tag.
string ::= character* /* with escapes as defined below */
absoluteURI ::= character+ /* being a valid URI Reference */
/* Comments follow standard Java/C conventions, and can appear anywhere */
comment ::= '/*' character* '*/' |
'//' (character-'\n')*
character ::= Any Unicode character
/* string escapes:
#x0022 '"' represented as \"
#x005C '\' represented as \\
*/
The grammar is also available as a plain text file.
Below we present a simple example using the proposed syntax
Namespace(pp = <http://cohse.semanticweb.org/ontologies/people#>)
/* An example ontology. */
Ontology(
Class(pp:bone partial)
Class(pp:brain partial)
Class(pp:whiteThing partial)
Class(pp:plant partial)
Class(pp:grass partial pp:plant)
Class(pp:tree partial pp:plant)
Class(pp:leaf partial restriction(pp:part_of someValuesFrom(pp:tree)))
Class(pp:vehicle partial)
Class(pp:bicycle partial pp:vehicle)
Class(pp:bus partial pp:vehicle)
Class(pp:car partial pp:vehicle)
Class(pp:lorry partial pp:vehicle)
Class(pp:truck partial pp:vehicle)
Class(pp:van partial pp:vehicle)
Class(pp:company partial)
Class(pp:busCompany partial pp:company)
Class(pp:haulageCompany partial pp:company)
Class(pp:publication partial)
Class(pp:magazine partial pp:publication)
Class(pp:broadsheet partial pp:newspaper)
Class(pp:qualityBroadsheet partial pp:broadsheet)
Class(pp:tabloid partial pp:newspaper)
Class(pp:redTop partial pp:tabloid)
Class(pp:newspaper partial unionOf(pp:broadsheet pp:tabloid) pp:publication)
Class(pp:male partial)
Class(pp:female partial)
Class(pp:young partial)
Class(pp:adult partial)
Class(pp:elderly partial pp:adult)
Class(pp:pet complete restriction(pp:is_pet_of someValuesFrom(owl:Thing)))
Class(pp:animal partial restriction(pp:eats someValuesFrom(owl:Thing)))
/* Vegetarians do not eat animals or parts of animals */
Class(pp:vegetarian complete
intersectionOf(pp:animal
restriction(pp:eats allValuesFrom(complementOf(pp:animal)))
restriction(pp:eats
allValuesFrom(complementOf(restriction(pp:part_of
someValuesFrom(pp:animal)))))))
Class(pp:duck partial pp:animal)
Class(pp:cat partial pp:animal)
Class(pp:tiger partial pp:animal)
Class(pp:dog partial restriction(pp:eats someValuesFrom(pp:bone)))
Class(pp:sheep partial pp:animal restriction(pp:eats allValuesFrom (pp:grass)))
Class(pp:giraffe partial pp:animal restriction(pp:eats allValuesFrom (pp:leaf)))
Class(pp:cow partial pp:vegetarian)
Class(pp:madCow complete
intersectionOf(pp:cow restriction(pp:eats
someValuesFrom(intersectionOf(pp:brain
restriction(pp:part_of someValuesFrom (pp:sheep)))))))
Class(pp:person partial pp:animal)
Class(pp:kid complete intersectionOf(pp:young pp:person))
Class(pp:man complete intersectionOf(pp:person pp:male pp:adult))
Class(pp:woman complete intersectionOf(pp:female pp:person pp:adult))
Class(pp:oldLady complete intersectionOf(pp:elderly pp:female pp:person))
Class(pp:oldLady partial
intersectionOf(restriction(pp:has_pet allValuesFrom(pp:cat))
restriction(pp:has_pet someValuesFrom(pp:animal))))
Class(pp:grownup complete intersectionOf(pp:person pp:adult))
Class(pp:animalLover complete // Someone who really likes animals
intersectionOf(pp:person restriction(pp:has_pet minCardinality(3))))
Class(pp:petOwner complete
intersectionOf(restriction(pp:has_pet someValuesFrom(pp:animal)) pp:person))
Class(pp:catLiker complete
intersectionOf(restriction(pp:likes someValuesFrom(pp:cat)) pp:person))
Class(pp:catOwner complete
intersectionOf(pp:person restriction(pp:has_pet someValuesFrom(pp:cat))))
Class(pp:dogLiker complete
intersectionOf(restriction(pp:likes someValuesFrom(pp:dog)) pp:person))
Class(pp:dogOwner complete
intersectionOf(restriction(pp:has_pet someValuesFrom(pp:dog)) pp:person))
Class(pp:driver partial pp:adult)
Class(pp:driver complete
intersectionOf(restriction(pp:drives someValuesFrom(pp:vehicle)) pp:person))
Class(pp:lorryDriver complete
intersectionOf(restriction(pp:drives someValuesFrom(pp:lorry)) pp:person))
Class(pp:haulageWorker complete
restriction(pp:works_for
someValuesFrom(unionOf(restriction(pp:part_of someValuesFrom(pp:haulageCompany))
pp:haulageCompany))))
Class(pp:haulageTruckDriver complete
intersectionOf(pp:person
restriction(pp:drives someValuesFrom(pp:truck))
restriction(pp:works_for
someValuesFrom(
restriction(pp:part_of someValuesFrom(pp:haulageCompany))))))
Class(pp:vanDriver complete
intersectionOf(pp:person restriction(pp:drives someValuesFrom(pp:van))))
Class(pp:busDriver complete
intersectionOf(pp:person restriction(pp:drives someValuesFrom(pp:bus))))
Class(pp:whiteVanMan complete
intersectionOf(pp:man
restriction(pp:drives
someValuesFrom(intersectionOf(pp:whiteThing pp:van)))))
Class(pp:whiteVanMan partial
restriction(pp:reads allValuesFrom (pp:tabloid)))
DisjointClasses(pp:broadsheet pp:tabloid)
DisjointClasses(pp:dog pp:cat)
DisjointClasses(pp:young pp:adult)
DisjointClasses(unionOf(pp:animal restriction(pp:part_of
someValuesFrom (pp:animal)))
unionOf(pp:plant restriction(pp:part_of
someValuesFrom (pp:plant))))
ObjectProperty(pp:likes)
ObjectProperty(pp:drives)
ObjectProperty(pp:eaten_by)
ObjectProperty(pp:eats inverseOf(pp:eaten_by) domain(pp:animal))
ObjectProperty(pp:works_for)
ObjectProperty(pp:reads range(pp:publication))
ObjectProperty(pp:has_parent)
ObjectProperty(pp:has_father range(pp:man))
ObjectProperty(pp:has_mother range(pp:woman))
ObjectProperty(pp:has_child)
ObjectProperty(pp:has_pet domain(pp:person) range(pp:animal))
ObjectProperty(pp:is_pet_of inverseOf(pp:has_pet))
ObjectProperty(pp:part_of)
ObjectProperty(pp:has_part inverseOf(pp:part_of))
DatatypeProperty(pp:service_number range(xsd:integer))
SubPropertyOf(pp:has_mother pp:has_parent)
SubPropertyOf(pp:has_pet pp:likes)
SubPropertyOf(pp:has_father pp:has_parent)
Individual(pp:Tom type(owl:Thing))
Individual(pp:Dewey type(pp:duck))
Individual(pp:Huey type(pp:duck))
Individual(pp:Louie type(pp:duck))
Individual(pp:Fido type(pp:dog))
Individual(pp:Flossie type(pp:cow))
Individual(pp:Fluffy type(pp:tiger))
Individual(pp:Rex type(pp:dog) value(pp:is_pet_of pp:Mick))
Individual(pp:Q123ABC type(pp:whiteThing) type(pp:van))
Individual(pp:Tibbs type(pp:cat))
Individual(pp:DailyMirror type(owl:Thing))
Individual(pp:TheGuardian type(pp:broadsheet))
Individual(pp:TheSun type(pp:tabloid))
Individual(pp:TheTimes type(pp:broadsheet))
Individual(pp:The42 type(pp:bus)
value(pp:service_number "42"^^xsd:integer))
Individual(pp:Kevin type(pp:person))
Individual(pp:Fred type(pp:person) value(pp:has_pet pp:Tibbs))
Individual(pp:Joe type(pp:person)
type(restriction(pp:has_pet maxCardinality(1)))
value(pp:has_pet pp:Fido))
Individual(pp:Mick type(pp:male)
value(pp:reads pp:DailyMirror)
value(pp:drives pp:Q123ABC))
Individual(pp:Minnie type(pp:elderly) type(pp:female)
value(pp:has_pet pp:Tom))
Individual(pp:Walt type(pp:person)
value(pp:has_pet pp:Huey)
value(pp:has_pet pp:Louie)
value(pp:has_pet pp:Dewey))
)