This paper is based very heavily on the OWL Abstract Syntax and Semantics. It reworks the details of both the abstract syntax and the mapping rules in order that OWL Lite and OWL DL should both be straight forward to specify in terms of which triples are permitted in such graphs. Moreover, the approach taken involves machine processing of the grammar rules so that the correspondence between the two different formulations of the syntax can be verified with mechanical assistance, and maintained.
The design goals are clearly articulated so that design tradeoffs can be discussed and made appropriately.
As well as showing how the OWL DL Design might be improved; this paper also explores the issues to do with annotations and use of rdf:XMLLiteral and xml:lang by taking a significantly different position from AS&S on these points. The discussion is intended to show which parts of the design have been impacted by those different choices. The design goals can be met in the same way, while preserving the choices of Patel-Schneider in AS&S.
These are dropped if they conflict with requirements.
iID
becomes my
individualID
(uriref). Perhaps more
significantly this fixes the
semantics wrinkle concerning the empty transitive property
as a subproperty of every functional property. The cost is that
there are more mapping rules in this version than AS&S.
The items listed here, while desirable, are only permitted in as much as they do not conflict with either the requirements or the desiderata.
Overall, I think there is little change. The abstract syntax is nearly identical, the changes are all fairly subtle; all but one for the worse from the point of view of an abstract syntax. The one that is not for the worse is to do with resolving the transitive property bug. It is fairly ugly, but less ugly than an error.
The main planks of the architecture are still in place: the abstract syntax, the direct semantics, the mapping rules.
The direct expression of OWL Lite and OWL DL graphs is very different; and moreover should be viewed as on the same status as the definition as being the range of the mapping rules. Potential conflict should be addressed by saying that in the event of conflict applications should write to the intersection of the two definitions, and read documents in the range of the mapping rules.
There is one significant change in the semantics, in order to resolve the problem about the meaning of annotations. The change makes annotations have their RDFS meaning, by a direct kludge.
The most visible changes are:
<owl:Ontology rdf:about=""> <owl:priorVersion> <owl:Ontology rdf:about="old" /> </owl:priorVersion> <owl:Ontology>This follows the every node must have a class rule. This is also needed on an imports if the imported ontology does not include an ontology header.
In this abstract syntax properties are classified as of five types:
Having these five categories allows the following advantages over AS&S:
The following disadvantages are apparent:
There is still a lot of mechanical checking to do on this grammar.
The following table was generated by a program working from a machine readable version of the mapping rules. (all done in Prolog).
ontology [O1] ::= 'Ontology(' { directive } ')'
Rationale: When dealing with imports, the resulting ontology may many header blocks, with many different ontologyID URI references. Hence, the change from the published AS&S.
directive [V1] ::= header [V2] | axiom [V3] | fact
header [H1] ::= 'Header(' ontologyID { metaProperty } { annotation } ')'
The only metaproperties are: owl:imports, owl:backwardsCompatibleWith, etc. There is no facility for user-defined metaproperties.
metaProperty[M1] ::= 'MetaProperty(' metapropertyID ontologyID ')'
annotation [A1] ::= 'Annotation(' simpleDataPropID dataLiteral ')'
Wherever in an abstract syntax document the following rule is used, the individual is also treated as a top-level fact .
annotation [A2] ::= 'Annotation(' simpleObjectPropID individual ')'
fact [F1] ::= individual
individual [I1] ::= 'Individual(' [ individualID ] { 'Type(' type ')' } { propertyValue } { individualComparison } ')'
propertyValue[P1] ::= 'PropertyValue(' simpleObjectPropID individual ')' [P2] | 'PropertyValue(' complexObjectPropID individual ')' [P3] | 'PropertyValue(' transitivePropID individual ')' [P4] | 'PropertyValue(' simpleDataPropID dataLiteral ')' [P5] | 'PropertyValue(' complexDataPropID dataLiteral ')'
type [T1] ::= classID
[T2] | restriction
This maps directly onto RDF literals and has the same constraints and definitions. See [RDF Concepts]. Note, specifically that there the lexicalForm is in Unicode Normal Form C, and that the language identifier is an RFC 3066 language tag normalized to lower case.
The formatting of the symbols lexicalForm
and
language
is in error.
dataLiteral [L1] ::= 'DataLiteral(' lexicalForm [ language ] [ datatypeID ] ')'
individualComparison[I1] ::= 'SameIndividual(' individual ')' [I2] | 'DifferentIndividuals(' individual ')'
{comparison} is in this rule, primarily for use in OWL DL. In the OWL Lite context, it is clearer to have an EquivalentClasses axiom (as in the published abstract syntax.
axiom [X1] ::= 'Class(' classID modality { annotation } { 'Super(' type ')' } { classComparison } ')'
modality [M1] ::= partial
classComparison[C1] ::= 'SameClassAs(' classID ')'
Rationale: This differs from the published AS&S in that each restriction may only contain one condition, not an arbitrary number. The expressive power is unchanged, since every use may be repeated arbitrarily. This makes it easier to express the mapping to RDF in which each condition becomes a separate blank node.
restriction [R1] ::= 'Restriction(' complexDataPropID 'AllValuesFrom(' dataRange ')' ')' [R2] | 'Restriction(' complexDataPropID 'SomeValuesFrom(' dataRange ')' ')' [R3] | 'Restriction(' complexDataPropID 'Cardinality(' smallInt ')' ')' [R4] | 'Restriction(' complexDataPropID 'MinCardinality(' smallInt ')' ')' [R5] | 'Restriction(' complexDataPropID 'MaxCardinality(' smallInt ')' ')' [R6] | 'Restriction(' complexObjectPropID 'AllValuesFrom(' classInRestriction ')' ')' [R7] | 'Restriction(' complexObjectPropID 'SomeValuesFrom(' classInRestriction ')' ')' [R8] | 'Restriction(' complexObjectPropID 'Cardinality(' smallInt ')' ')' [R9] | 'Restriction(' complexObjectPropID 'MinCardinality(' smallInt ')' ')' [R10] | 'Restriction(' complexObjectPropID 'MaxCardinality(' smallInt ')' ')' [R11] | 'Restriction(' transitivePropID 'AllValuesFrom(' classInRestriction ')' ')' [R12] | 'Restriction(' transitivePropID 'SomeValuesFrom(' classInRestriction ')' ')'
axiom [X2] ::= restriction
Rationale: The extra level here is used for an extension in OWL DL.
classInRestriction[S1] ::= classID
smallInt [S1] ::= 0 [S2] | 1
dataRange [G1] ::= datatypeID [G2] | dataRangeID
axiom [X3] ::= 'DatatypeProperty(' simpleDataPropID { annotation }
{ 'Super(' simpleDataPropID ')' } ')'
Rationale: For ease of writing the document, I have made the property axioms identical in OWL Lite and OWL DL, but kept the same semantics by having the additional rules for dataRange and classInRestriction in OWL DL
axiom [X4] ::= 'DatatypeProperty(' complexDataPropID { annotation } { 'Super(' simpleDataPropID ')' } { 'Super(' complexDataPropID ')' } { 'Domain(' classInRestriction ')' } { 'Range(' dataRange ')' } [ functional ] ')' [X5] | 'IndividualProperty(' simpleObjectPropID { annotation } { 'Super(' simpleObjectPropID ')' } ')' [X6] | 'IndividualProperty(' complexObjectPropID { annotation } { 'Super(' simpleObjectPropID ')' } { 'Super(' complexObjectPropID ')' } { 'Super(' transitivePropID ')' } { 'Domain(' classInRestriction ')' } { 'Range(' classInRestriction ')' } { 'Inverse(' complexObjectPropID ')' } [ functional ] [ inverseFunctional ] [ symmetric ] ')' [X7] | 'IndividualProperty(' transitivePropID { annotation } { 'Super(' simpleObjectPropID ')' } { 'Super(' transitivePropID ')' } { 'Domain(' classInRestriction ')' } { 'Range(' classInRestriction ')' } { 'Inverse(' transitivePropID ')' } [ transitive ] ')' [X8] | 'EquivalentProperties(' simpleObjectPropID simpleObjectPropID { simpleObjectPropID } ')' [X9] | 'EquivalentProperties(' transitivePropID transitivePropID { transitivePropID } ')' [X10] | 'EquivalentProperties(' complexObjectPropID complexObjectPropID { complexObjectPropID } ')' [X11] | 'EquivalentProperties(' simpleDataPropID simpleDataPropID { simpleDataPropID } ')' [X12] | 'EquivalentProperties(' complexDataPropID complexDataPropID { complexDataPropID } ')' [X13] | 'DatatypeDeclaration(' datatypeID ')'
type [T3] ::= description
modality [M2] ::= complete
axiom [X14] ::= 'EnumeratedClass(' classID { annotation }
{ individualID } ')'
classComparison[C2] ::= 'SameClassAs(' description ')' [C3] | 'DisjointWith(' description ')' [C4] | 'SubClassOf(' description ')'
description [D1] ::= classID [D2] | restriction [D3] | 'UnionOf(' { description } { classComparison } ')' [D4] | 'IntersectionOf(' { description } { classComparison } ')' [D5] | 'ComplementOf(' description { classComparison } ')' [D6] | 'OneOf(' { individualID } { classComparison } ')'
axiom [X15] ::= description
restriction [R13] ::= 'Restriction(' complexDataPropID 'Value(' dataLiteral ')' ')'
[R14] | 'Restriction(' complexObjectPropID 'Value(' individualID ')' ')'
[R15] | 'Restriction(' transitivePropID 'Value(' individualID ')' ')'
smallInt [S3] ::= naturalNumber
These rules broadens the scope of restrictions, domain and range conditions.
classInRestriction[S2] ::= description
dataRange [G3] ::= 'OneOf(' { dataLiteral } ')'
Rationale: Using the same dataRange in multiple range constraints of restrictions requires too much repetition without allowing dataRangeID .
axiom [X16] ::= 'DataRange(' dataRangeID { annotation } { dataLiteral } ')'
Rationale: A datarange declaraion which does not identify the individuals is not useful, except perhaps to document the intended range of a datatype property. However, it does make the proofs easier, and the special cases fewer.
axiom [X17] ::= 'DataRange(' dataRangeID declaration { annotation } ')'
ontology [O1] ::= 'Ontology(' { directive } ')'
directive [V1] ::= header [V2] | axiom [V3] | fact
header [H1] ::= 'Header(' ontologyID { metaProperty } { annotation } ')'
metaProperty[M1] ::= 'MetaProperty(' metapropertyID ontologyID ')'
annotation [A1] ::= 'Annotation(' simpleDataPropID dataLiteral ')' [A2] | 'Annotation(' simpleObjectPropID individual ')'
fact [F1] ::= individual
individual [I1] ::= 'Individual(' [ individualID ] { 'Type(' type ')' } { propertyValue } { individualComparison } ')'
propertyValue[P1] ::= 'PropertyValue(' simpleObjectPropID individual ')' [P2] | 'PropertyValue(' complexObjectPropID individual ')' [P3] | 'PropertyValue(' transitivePropID individual ')' [P4] | 'PropertyValue(' simpleDataPropID dataLiteral ')' [P5] | 'PropertyValue(' complexDataPropID dataLiteral ')'
type [T1] ::= classID [T2] | restriction [T3] | description
dataLiteral [L1] ::= 'DataLiteral(' lexicalForm [ language ] [ datatypeID ] ')'
individualComparison[I1] ::= 'SameIndividual(' individual ')' [I2] | 'DifferentIndividuals(' individual ')'
axiom [X1] ::= 'Class(' classID modality { annotation } { 'Super(' type ')' } { classComparison } ')' [X2] | restriction [X3] | 'DatatypeProperty(' simpleDataPropID { annotation } { 'Super(' simpleDataPropID ')' } ')' [X4] | 'DatatypeProperty(' complexDataPropID { annotation } { 'Super(' simpleDataPropID ')' } { 'Super(' complexDataPropID ')' } { 'Domain(' classInRestriction ')' } { 'Range(' dataRange ')' } [ functional ] ')' [X5] | 'IndividualProperty(' simpleObjectPropID { annotation } { 'Super(' simpleObjectPropID ')' } ')' [X6] | 'IndividualProperty(' complexObjectPropID { annotation } { 'Super(' simpleObjectPropID ')' } { 'Super(' complexObjectPropID ')' } { 'Super(' transitivePropID ')' } { 'Domain(' classInRestriction ')' } { 'Range(' classInRestriction ')' } { 'Inverse(' complexObjectPropID ')' } [ functional ] [ inverseFunctional ] [ symmetric ] ')' [X7] | 'IndividualProperty(' transitivePropID { annotation } { 'Super(' simpleObjectPropID ')' } { 'Super(' transitivePropID ')' } { 'Domain(' classInRestriction ')' } { 'Range(' classInRestriction ')' } { 'Inverse(' transitivePropID ')' } [ transitive ] ')' [X8] | 'EquivalentProperties(' simpleObjectPropID simpleObjectPropID { simpleObjectPropID } ')' [X9] | 'EquivalentProperties(' transitivePropID transitivePropID { transitivePropID } ')' [X10] | 'EquivalentProperties(' complexObjectPropID complexObjectPropID { complexObjectPropID } ')' [X11] | 'EquivalentProperties(' simpleDataPropID simpleDataPropID { simpleDataPropID } ')' [X12] | 'EquivalentProperties(' complexDataPropID complexDataPropID { complexDataPropID } ')' [X13] | 'DatatypeDeclaration(' datatypeID ')' [X14] | 'EnumeratedClass(' classID { annotation } { individualID } ')' [X15] | description [X16] | 'DataRange(' dataRangeID { annotation } { dataLiteral } ')' [X17] | 'DataRange(' dataRangeID declaration { annotation } ')'
modality [M1] ::= partial [M2] | complete
classComparison[C1] ::= 'SameClassAs(' classID ')' [C2] | 'SameClassAs(' description ')' [C3] | 'DisjointWith(' description ')' [C4] | 'SubClassOf(' description ')'
restriction [R1] ::= 'Restriction(' complexDataPropID 'AllValuesFrom(' dataRange ')' ')' [R2] | 'Restriction(' complexDataPropID 'SomeValuesFrom(' dataRange ')' ')' [R3] | 'Restriction(' complexDataPropID 'Cardinality(' smallInt ')' ')' [R4] | 'Restriction(' complexDataPropID 'MinCardinality(' smallInt ')' ')' [R5] | 'Restriction(' complexDataPropID 'MaxCardinality(' smallInt ')' ')' [R6] | 'Restriction(' complexObjectPropID 'AllValuesFrom(' classInRestriction ')' ')' [R7] | 'Restriction(' complexObjectPropID 'SomeValuesFrom(' classInRestriction ')' ')' [R8] | 'Restriction(' complexObjectPropID 'Cardinality(' smallInt ')' ')' [R9] | 'Restriction(' complexObjectPropID 'MinCardinality(' smallInt ')' ')' [R10] | 'Restriction(' complexObjectPropID 'MaxCardinality(' smallInt ')' ')' [R11] | 'Restriction(' transitivePropID 'AllValuesFrom(' classInRestriction ')' ')' [R12] | 'Restriction(' transitivePropID 'SomeValuesFrom(' classInRestriction ')' ')' [R13] | 'Restriction(' complexDataPropID 'Value(' dataLiteral ')' ')' [R14] | 'Restriction(' complexObjectPropID 'Value(' individualID ')' ')' [R15] | 'Restriction(' transitivePropID 'Value(' individualID ')' ')'
classInRestriction[S1] ::= classID
[S2] | description
smallInt [S1] ::= 0 [S2] | 1 [S3] | naturalNumber
dataRange [G1] ::= datatypeID
[G2] | dataRangeID
[G3] | 'OneOf(' { dataLiteral } ')'
description [D1] ::= classID [D2] | restriction [D3] | 'UnionOf(' { description } { classComparison } ')' [D4] | 'IntersectionOf(' { description } { classComparison } ')' [D5] | 'ComplementOf(' description { classComparison } ')' [D6] | 'OneOf(' { individualID } { classComparison } ')'
Still to do:
The following table was generated by a program working from a machine readable version of the mapping rules. (all done in Prolog).
Input | Triples | Return | Notes | |
---|---|---|---|---|
URI References | ||||
1 | ontologyID ( uriref ) |
uriref rdf:type owl:Ontology . |
||
2 | datatypeID ( uriref ) |
uriref rdf:type rdfs:Datatype . |
||
3 | datatypeID ( rdf:XMLLiteral ) |
rdf:XMLLiteral |
||
4 | datatypeID ( xsd: built-in ) |
xsd: built-in |
datatype | |
5 | datatypeID ( uriref ) |
uriref rdf:type rdfs:Datatype . |
||
6 | classID ( owl:Thing ) |
owl:Thing |
||
7 | classID ( owl:Nothing ) |
owl:Nothing |
||
8 | classID ( uriref ) |
uriref rdf:type owl:Class .[ uriref rdf:type rdfs:Class . ] (opt) |
||
9 | individualID ( uriref ) |
|||
10 | metapropertyID ( owl: built-in ) |
owl: built-in |
metaproperty | |
11 | metapropertyID ( rdfs:seeAlso ) |
rdfs:seeAlso |
||
12 | metapropertyID ( rdfs:isDefinedBy ) |
rdfs:isDefinedBy |
||
13 | dataRangeID ( rdfs:Literal ) |
rdfs:Literal |
||
14 | dataRangeID ( uriref ) |
uriref rdf:type owl:DataRange . |
||
15 | simpleDataPropID ( uriref ) |
uriref rdf:type owl:DatatypeProperty .[ uriref rdf:type rdf:Property . ] (opt) |
||
16 | simpleDataPropID ( rdfs:comment ) |
rdfs:comment |
||
17 | simpleDataPropID ( rdfs:label ) |
rdfs:label |
||
18 | complexDataPropID ( uriref ) |
uriref rdf:type owl:DatatypeProperty .[ uriref rdf:type rdf:Property . ] (opt) |
||
19 | simpleObjectPropID ( uriref ) |
uriref rdf:type owl:ObjectProperty .[ uriref rdf:type rdf:Property . ] (opt) |
||
20 | simpleObjectPropID ( rdfs:seeAlso ) |
rdfs:seeAlso |
||
21 | simpleObjectPropID ( rdfs:isDefinedBy ) |
rdfs:isDefinedBy |
||
22 | complexObjectPropID ( uriref ) |
[ uriref rdf:type owl:ObjectProperty . ] (opt)[ uriref rdf:type rdf:Property . ] (opt) |
||
23 | transitivePropID ( uriref ) |
[ uriref rdf:type owl:ObjectProperty . ] (opt)[ uriref rdf:type rdf:Property . ] (opt) |
||
Literals | ||||
25.1 | DataLiteral( lexicalForm language datatypeID ( dt ) ) |
lexicalForm@language^^ x( datatypeID ( dt ) ) |
||
26.1 | DataLiteral( lexicalForm datatypeID ( dt ) ) |
lexicalForm^^ x( datatypeID ( dt ) ) |
||
27.1 | DataLiteral( lexicalForm language ) |
lexicalForm@language |
||
28.1 | DataLiteral( lexicalForm ) |
lexicalForm |
||
Ontologies | ||||
29 | Ontology( |
|||
29.1 | { directive } |
{ x( directive ) } |
directive | |
) |
||||
30.1 | Header( ontologyID ( o ) |
x( ontologyID ( o ) ) rdf:type owl:Ontology . |
||
30.2 | { metaproperty } |
{ y( x( ontologyID ( o ) ), metaproperty ) } |
||
30.3 | { annotation } |
{ y( x( ontologyID ( o ) ), annotation ) } |
||
) |
||||
individuals | ||||
Named Individuals | ||||
The interaction between these two individual rules make it obligatory
to declare at least one type for a named individual.
The default is owl:thing |
||||
31.1 | Individual( individualID ( i ) Type( type 1 ) |
x( individualID ( i ) ) rdf:type x( type1 ) . |
x( individualID ( i ) ) |
|
31.2 | { Type ( type i ) } |
{ x( individualID ( i ) ) rdf:type x( typei ) . } |
||
31.3 | { propertyValue } |
{ y( x( individualID ( i ) ), propertyValue ) } |
||
31.4 | { individualComparision } |
{ y( x( individualID ( i ) ), individualComparison ) } |
||
) |
||||
32.1 | Individual( individualID ( i ) |
x( individualID ( i ) ) rdf:type owl:Thing . |
x( individualID ( i ) ) |
|
32.2 | { Type ( type ) } |
{ x( individualID ( i ) ) rdf:type x( type ) . } |
||
32.3 | { propertyValue } |
{ y( x( individualID ( i ) ), propertyValue ) } |
||
32.4 | { individualComparision } |
{ y( x( individualID ( i ) ), individualComparison ) } |
||
) |
||||
Unnamed Individuals | ||||
33.1 | Individual( Type( type 1 ) |
_:b rdf:type x( type1 ) . |
_:b | |
33.2 | { Type ( type i ) } |
{ _:b rdf:type x( typei ) . } |
||
33.3 | { propertyValue } |
{ y( _:b, propertyValue ) } |
||
33.4 | { individualComparision } |
{ y( x( individualID ( i ) ), individualComparison ) } |
||
) |
||||
34.1 | Individual( |
_:b rdf:type owl:Thing . |
_:b | |
34.2 | { Type ( type ) } |
{ _:b rdf:type x( type ) . } |
||
34.3 | { propertyValue } |
{ y( _:b, propertyValue ) } |
||
34.4 | { individualComparision } |
{ y( x( individualID ( i ) ), individualComparison ) } |
||
) |
||||
Classes | ||||
35.1 | Class( classID ( c ) Partial |
x( classID ( c ) ) rdf:type owl:Class .[ x( classID ( c ) ) rdf:type rdfs:Class . ] (opt) |
x( classID ( c ) ) |
|
35.2 | { annotation } |
{ y( x( classID ( c ) ), annotation ) } |
||
35.3 | { Super ( type ) } |
{ x( classID ( c ) ) rdfs:subClassOf x( type ) . } |
||
35.4 | { classComparison } |
{ y( x( classID ( c ) ), classComparison ) } |
||
) |
||||
36.1 | Class( classID ( c ) Complete |
x( classID ( c ) ) rdf:type owl:Class .[ x( classID ( c ) ) rdf:type rdfs:Class . ] (opt) |
x( classID ( c ) ) |
|
36.2 | { annotation } |
{ y( x( classID ( c ) ), annotation ) } |
||
36.3 | { Super ( type ) } |
x( classID ( c ) ) owl:intersectionOf x( Seq ( { Super ( type ) } ) ) . |
||
36.4 | { classComparison } |
{ y( x( classID ( c ) ), classComparison ) } |
||
) |
||||
37.1 | Class( classID ( c ) Complete |
x( classID ( c ) ) rdf:type owl:Class .[ x( classID ( c ) ) rdf:type rdfs:Class . ] (opt) |
x( classID ( c ) ) |
|
37.2 | { annotation } |
{ y( x( classID ( c ) ), annotation ) } |
||
Super( UnionOf( |
||||
37.3 | { description } |
x( classID ( c ) ) owl:unionOf x( Seq ( { description } ) ) . |
||
37.4 | { classComparison 2 } |
{ y( x( classID ( c ) ), classComparison2 ) } |
||
) ) |
||||
37.5 | { classComparison 1 } |
{ y( x( classID ( c ) ), classComparison1 ) } |
||
) |
||||
38.1 | Class( classID ( c ) Complete |
x( classID ( c ) ) rdf:type owl:Class .[ x( classID ( c ) ) rdf:type rdfs:Class . ] (opt) |
x( classID ( c ) ) |
|
38.2 | { annotation } |
{ y( x( classID ( c ) ), annotation ) } |
||
38.3 | Super( ComplementOf( description |
x( classID ( c ) ) owl:complementOf T ( description ) . |
||
38.4 | { classComparison 2 } |
{ y( x( classID ( c ) ), classComparison2 ) } |
||
) ) |
||||
38.5 | { classComparison 1 } |
{ y( x( classID ( c ) ), classComparison1 ) } |
||
) |
||||
Enumerated Classes | ||||
39.1 | EnumeratedClass( classID ( c ) |
x( classID ( c ) ) rdf:type owl:Class .[ x( classID ( c ) ) rdf:type rdfs:Class . ] (opt) |
x( classID ( c ) ) |
|
39.2 | { annotation } |
{ y( x( classID ( c ) ), annotation ) } |
||
39.3 | { individualID ( i ) } |
x( classID ( c ) ) owl:oneOf x( Seq ( { individualID ( i ) } ) ) . |
||
39.4 | { classComparison } |
{ y( x( classID ( c ) ), classComparison ) } |
||
) |
||||
Restrctions | ||||
Restrictions on Datatype Properties | ||||
40.1 | Restriction( complexDataPropID ( cdp ) AllValuesFrom( dataRange ) ) |
_:b rdf:type owl:Restriction ._:b owl:onProperty x( complexDataPropID ( cdp ) ) ._:b owl:allValuesFrom x( dataRange ) . |
_:b | |
41.1 | Restriction( complexDataPropID ( cdp ) SomeValuesFrom( dataRange ) ) |
_:b rdf:type owl:Restriction ._:b owl:onProperty x( complexDataPropID ( cdp ) ) ._:b owl:someValuesFrom x( dataRange ) . |
_:b | |
42.1 | Restriction( complexDataPropID ( cdp ) Cardinality( smallInt ) ) |
_:b rdf:type owl:Restriction ._:b owl:onProperty x( complexDataPropID ( cdp ) ) ._:b owl:cardinality x( smallInt ) . |
_:b | |
43.1 | Restriction( complexDataPropID ( cdp ) MinCardinality( smallInt ) ) |
_:b rdf:type owl:Restriction ._:b owl:onProperty x( complexDataPropID ( cdp ) ) ._:b owl:minCardinality x( smallInt ) . |
_:b | |
44.1 | Restriction( complexDataPropID ( cdp ) MaxCardinality( smallInt ) ) |
_:b rdf:type owl:Restriction ._:b owl:onProperty x( complexDataPropID ( cdp ) ) ._:b owl:maxCardinality x( smallInt ) . |
_:b | |
45.1 | Restriction( complexDataPropID ( cdp ) Value( dataLiteral ) ) |
_:b rdf:type owl:Restriction ._:b owl:onProperty x( complexDataPropID ( cdp ) ) ._:b owl:hasValue x( dataLiteral ) . |
_:b | |
Restrictions on Object Properties | ||||
46.1 | Restriction( complexObjectPropID ( cop ) AllValuesFrom( classInRestriction ) ) |
_:b rdf:type owl:Restriction ._:b owl:onProperty x( complexObjectPropID ( cop ) ) ._:b owl:allValuesFrom x( classInRestriction ) . |
_:b | |
47.1 | Restriction( complexObjectPropID ( cop ) SomeValuesFrom( classInRestriction ) ) |
_:b rdf:type owl:Restriction ._:b owl:onProperty x( complexObjectPropID ( cop ) ) ._:b owl:someValuesFrom x( classInRestriction ) . |
_:b | |
48.1 | Restriction( complexObjectPropID ( cop ) Cardinality( smallInt ) ) |
_:b rdf:type owl:Restriction ._:b owl:onProperty x( complexObjectPropID ( cop ) ) ._:b owl:cardinality x( smallInt ) . |
_:b | |
49.1 | Restriction( complexObjectPropID ( cop ) MinCardinality( smallInt ) ) |
_:b rdf:type owl:Restriction ._:b owl:onProperty x( complexObjectPropID ( cop ) ) ._:b owl:minCardinality x( smallInt ) . |
_:b | |
50.1 | Restriction( complexObjectPropID ( cop ) MaxCardinality( smallInt ) ) |
_:b rdf:type owl:Restriction ._:b owl:onProperty x( complexObjectPropID ( cop ) ) ._:b owl:maxCardinality x( smallInt ) . |
_:b | |
51.1 | Restriction( complexObjectPropID ( cop ) Value( individualID ( i ) ) ) |
_:b rdf:type owl:Restriction ._:b owl:onProperty x( complexObjectPropID ( cop ) ) ._:b owl:hasValue x( individualID ( i ) ) . |
_:b | |
Restrictions on Transitive Properties | ||||
52.1 | Restriction( transitivePropID ( tp ) AllValuesFrom( classInRestriction ) ) |
_:b rdf:type owl:Restriction ._:b owl:onProperty x( transitivePropID ( tp ) ) ._:b owl:allValuesFrom x( classInRestriction ) . |
_:b | |
53.1 | Restriction( transitivePropID ( tp ) SomeValuesFrom( classInRestriction ) ) |
_:b rdf:type owl:Restriction ._:b owl:onProperty x( transitivePropID ( tp ) ) ._:b owl:someValuesFrom x( classInRestriction ) . |
_:b | |
54.1 | Restriction( transitivePropID ( tp ) Value( individualID ( i ) ) ) |
_:b rdf:type owl:Restriction ._:b owl:onProperty x( transitivePropID ( tp ) ) ._:b owl:hasValue x( individualID ( i ) ) . |
_:b | |
Numbers in Cardinalities | ||||
54 | 0 |
"0"^^ xsd:nonNegativeInteger |
||
55 | 1 |
"1"^^ xsd:nonNegativeInteger |
||
56 | naturalNumber |
naturalNumber^^ xsd:nonNegativeInteger |
||
Property Axioms | ||||
58.1 | DatatypeProperty( simpleDataPropID ( sdp1 ) |
x( simpleDataPropID ( sdp1 ) ) rdf:type owl:DatatypeProperty .[ x( simpleDataPropID ( sdp1 ) ) rdf:type rdf:Property . ] (opt) |
||
58.2 | { annotation } |
{ y( x( simpleDataPropID ( sdp1 ) ), annotation ) } |
||
58.3 | { Super ( simpleDataPropID ( sdp2 ) ) } |
{ x( simpleDataPropID ( sdp1 ) ) rdfs:subPropertyOf x( simpleDataPropID ( sdp2 ) ) . } |
||
) |
||||
59.1 | DatatypeProperty( complexDataPropID ( cdp1 ) |
x( complexDataPropID ( cdp1 ) ) rdf:type owl:DatatypeProperty .[ x( complexDataPropID ( cdp1 ) ) rdf:type rdf:Property . ] (opt) |
||
59.2 | { annotation } |
{ y( x( complexDataPropID ( cdp1 ) ), annotation ) } |
||
59.3 | { Super ( simpleDataPropID ( sdp ) ) } |
{ x( complexDataPropID ( cdp1 ) ) rdfs:subPropertyOf x( simpleDataPropID ( sdp ) ) . } |
||
59.4 | { Super ( complexDataPropID ( cdp2 ) ) } |
{ x( complexDataPropID ( cdp1 ) ) rdfs:subPropertyOf x( complexDataPropID ( cdp2 ) ) . } |
||
59.5 | { Domain ( classInRestriction ) } |
{ x( complexDataPropID ( cdp1 ) ) rdfs:domain x( classInRestriction ) . } |
||
59.6 | { Range ( dataRange ) } |
{ x( complexDataPropID ( cdp1 ) ) rdfs:range x( dataRange ) . } |
||
59.7 | [ Functional ] | [ x( complexDataPropID ( cdp1 ) ) rdf:type owl:FunctionalProperty . ] |
||
) |
||||
60.1 | IndividualProperty( simpleObjectPropID ( sop1 ) |
x( simpleObjectPropID ( sop1 ) ) rdf:type owl:ObjectProperty .[ x( simpleObjectPropID ( sop1 ) ) rdf:type rdf:Property . ] (opt) |
||
60.2 | { annotation } |
{ y( x( simpleObjectPropID ( sop1 ) ), annotation ) } |
||
60.3 | { Super ( simpleObjectPropID ( sop2 ) ) } |
{ x( simpleObjectPropID ( sop1 ) ) rdfs:subPropertyOf x( simpleObjectPropID ( sop2 ) ) . } |
||
) |
||||
61.1 | IndividualProperty( complexObjectPropID ( cop1 ) |
[ x( complexObjectPropID ( cop1 ) ) rdf:type owl:ObjectProperty . ] (opt)[ x( complexObjectPropID ( cop1 ) ) rdf:type rdf:Property . ] (opt) |
prop | |
61.2 | { annotation } |
{ y( x( complexObjectPropID ( cop1 ) ), annotation ) } |
||
61.3 | { Super ( simpleObjectPropID ( sop ) ) } |
{ x( complexObjectPropID ( cop1 ) ) rdfs:subPropertyOf x( simpleObjectPropID ( sop ) ) . } |
||
61.4 | { Super ( complexObjectPropID ( cop2 ) ) } |
{ x( complexObjectPropID ( cop1 ) ) rdfs:subPropertyOf x( complexObjectPropID ( cop2 ) ) . } |
||
61.5 | { Super ( transitivePropID ( tp ) ) } |
{ x( complexObjectPropID ( cop1 ) ) rdfs:subPropertyOf x( transitivePropID ( tp ) ) . } |
||
61.6 | { Domain ( classInRestriction 1 ) } |
{ x( complexObjectPropID ( cop1 ) ) rdfs:domain x( classInRestriction1 ) . } |
||
61.7 | { Range ( classInRestriction 2 ) } |
{ x( complexObjectPropID ( cop1 ) ) rdfs:range x( classInRestriction2 ) . } |
||
61.8 | { Inverse ( complexObjectPropID ( cop3 ) ) } |
{ x( complexObjectPropID ( cop1 ) ) owl:inverseOf x( complexObjectPropID ( cop3 ) ) . } |
||
61.9 | [ Functional ] | [ x( complexObjectPropID ( cop1 ) ) rdf:type owl:FunctionalProperty . ] |
||
61.10 | [ InverseFunctional ] | [ x( complexObjectPropID ( cop1 ) ) rdf:type owl:InverseFunctionalProperty . ] |
||
61.11 | [ Symmetric ] | [ x( complexObjectPropID ( cop1 ) ) rdf:type owl:SymmetricProperty . ] |
||
) |
||||
62.1 | IndividualProperty( transitivePropID ( tp1 ) |
[ x( transitivePropID ( tp1 ) ) rdf:type owl:ObjectProperty . ] (opt)[ x( transitivePropID ( tp1 ) ) rdf:type rdf:Property . ] (opt) |
prop | |
62.2 | { annotation } |
{ y( x( transitivePropID ( tp1 ) ), annotation ) } |
||
62.3 | { Super ( simpleObjectPropID ( sop ) ) } |
{ x( transitivePropID ( tp1 ) ) rdfs:subPropertyOf x( simpleObjectPropID ( sop ) ) . } |
||
62.4 | { Super ( transitivePropID ( tp2 ) ) } |
{ x( transitivePropID ( tp1 ) ) rdfs:subPropertyOf x( transitivePropID ( tp2 ) ) . } |
||
62.5 | { Domain ( classInRestriction 1 ) } |
{ x( transitivePropID ( tp1 ) ) rdfs:domain x( classInRestriction1 ) . } |
||
62.6 | { Range ( classInRestriction 2 ) } |
{ x( transitivePropID ( tp1 ) ) rdfs:range x( classInRestriction2 ) . } |
||
62.7 | { Inverse ( transitivePropID ( tp3 ) ) } |
{ x( transitivePropID ( tp1 ) ) owl:inverseOf x( transitivePropID ( tp3 ) ) . } |
||
62.8 | [ Transitive ] | [ x( complexObjectPropID ( cop1 ) ) rdf:type owl:TransitiveProperty . ] |
||
) |
||||
Equivalent Properties | ||||
63.1 | EquivalentProperties( simpleObjectPropID ( sop1 ) simpleObjectPropID ( sop2 ) |
x( simpleObjectPropID ( sop1 ) ) owl:samePropertyAs x( simpleObjectPropID ( sop2 ) ) . |
||
63.2 | { simpleObjectPropID ( sop3 ) } |
{ x( simpleObjectPropID ( sop1 ) ) owl:samePropertyAs x( simpleObjectPropID ( sop3 ) ) . } |
||
) |
||||
64.1 | EquivalentProperties( transitivePropID ( tp1 ) transitivePropID ( tp2 ) |
x( transitivePropID ( tp1 ) ) owl:samePropertyAs x( transitivePropID ( tp2 ) ) . |
||
64.2 | { transitivePropID ( tp3 ) } |
{ x( transitivePropID ( tp1 ) ) owl:samePropertyAs x( transitivePropID ( tp3 ) ) . } |
||
) |
||||
65.1 | EquivalentProperties( complexObjectPropID ( cop1 ) complexObjectPropID ( cop2 ) |
x( complexObjectPropID ( cop1 ) ) owl:samePropertyAs x( complexObjectPropID ( cop2 ) ) . |
||
65.2 | { complexObjectPropID ( cop3 ) } |
{ x( complexObjectPropID ( cop1 ) ) owl:samePropertyAs x( complexObjectPropID ( cop3 ) ) . } |
||
) |
||||
66.1 | EquivalentProperties( simpleDataPropID ( sdp1 ) simpleDataPropID ( sdp2 ) |
x( simpleDataPropID ( sdp1 ) ) owl:samePropertyAs x( simpleDataPropID ( sdp2 ) ) . |
||
66.2 | { simpleDataPropID ( sdp3 ) } |
{ x( simpleDataPropID ( sdp1 ) ) owl:samePropertyAs x( simpleDataPropID ( sdp3 ) ) . } |
||
) |
||||
67.1 | EquivalentProperties( complexDataPropID ( cdp1 ) complexDataPropID ( cdp2 ) |
x( complexDataPropID ( cdp1 ) ) owl:samePropertyAs x( complexDataPropID ( cdp2 ) ) . |
||
67.2 | { complexDataPropID ( cdp3 ) } |
{ x( complexDataPropID ( cdp1 ) ) owl:samePropertyAs x( complexDataPropID ( cdp3 ) ) . } |
||
) |
||||
68.1 | DatatypeDeclaration( datatypeID ( dt ) ) |
x( datatypeID ( dt ) ) |
||
Descriptions | ||||
69.1 | IntersectionOf( |
_:b rdf:type owl:Class . |
_:b | |
69.2 | { description } |
_:b owl:intersectionOf x( Seq ( { description } ) ) . |
||
69.3 | { classComparison } |
{ y( _:b, classComparison ) } |
||
) |
||||
70.1 | UnionOf( |
_:b rdf:type owl:Class . |
_:b | |
70.2 | { description } |
_:b owl:unionOf x( Seq ( { description } ) ) . |
||
70.3 | { classComparison } |
{ y( _:b, classComparison ) } |
||
) |
||||
71.1 | ComplementOf( description |
_:b rdf:type owl:Class ._:b owl:complementOf x( description ) . |
_:b | |
71.2 | { classComparison } |
{ y( _:b, classComparison ) } |
||
) |
||||
72.1 | OneOf( |
_:b rdf:type owl:Class . |
_:b | |
72.2 | { individualID ( i ) } |
_:b owl:oneOf x( Seq ( { individualID ( i ) } ) ) . |
||
72.3 | { classComparison } |
{ y( _:b, classComparison ) } |
||
) |
||||
DataRanges | ||||
73.1 | OneOf( |
_:b rdf:type owl:DataRange . |
_:b | |
73.2 | { dataLiteral } |
_:b owl:oneOf x( Seq ( { dataLiteral } ) ) . |
||
) |
||||
74.1 | DataRange( dataRangeID ( dr ) |
x( dataRangeID ( dr ) ) rdf:type owl:DataRange . |
x( dataRangeID ( dr ) ) |
|
74.2 | { annotation } |
{ y( x( dataRangeID ( dr ) ), annotation ) } |
||
74.3 | { dataLiteral } |
x( dataRangeID ( dr ) ) owl:oneOf x( Seq ( { dataLiteral } ) ) . |
||
) |
||||
75.1 | DataRange( dataRangeID ( dr ) Declaration |
x( dataRangeID ( dr ) ) rdf:type owl:DataRange . |
x( dataRangeID ( dr ) ) |
|
75.2 | { annotation } |
{ y( x( dataRangeID ( dr ) ), annotation ) } |
||
) |
||||
The following rules are ones that use a node provided from higher
in the abstract syntax tree. This node is shown as @ .
It is always the subject of the triples. |
||||
Header and Annotations | ||||
76.1 | Metaproperty( metapropertyID ( m ) ontologyID ( o ) ) |
@ x( metapropertyID ( m ) ) x( ontologyID ( o ) ) . |
||
77.1 | Annotation( simpleDataPropID ( sdp ) dataLiteral ) |
@ x( simpleDataPropID ( sdp ) ) x( dataLiteral ) . |
||
78.1 | Annotation( simpleObjectPropID ( sop ) individual ) |
@ x( simpleObjectPropID ( sop ) ) x( individual ) . |
||
Property Values | ||||
79.1 | PropertyValue( simpleObjectPropID ( sop ) individual ) |
@ x( simpleObjectPropID ( sop ) ) x( individual ) . |
||
80.1 | PropertyValue( complexObjectPropID ( cop ) individual ) |
@ x( complexObjectPropID ( cop ) ) x( individual ) . |
||
81.1 | PropertyValue( transitivePropID ( tp ) individual ) |
@ x( transitivePropID ( tp ) ) x( individual ) . |
||
82.1 | PropertyValue( simpleDataPropID ( sdp ) dataLiteral ) |
@ x( simpleDataPropID ( sdp ) ) x( dataLiteral ) . |
||
83.1 | PropertyValue( complexDataPropID ( cdp ) dataLiteral ) |
@ x( complexDataPropID ( cdp ) ) x( dataLiteral ) . |
||
Comparison of Individuals | ||||
84.1 | SameIndividual( individual ) |
@ owl:sameIndividualAs x( individual ) . |
||
85.1 | DifferentIndividuals( individual ) |
@ owl:differentFrom x( individual ) . |
||
Comparison of Classes | ||||
86.1 | SameClassAs( description ) |
@ owl:sameClassAs x( description ) . |
||
87.1 | DisjointWith( description ) |
@ owl:disjointWith x( description ) . |
||
88.1 | SubClassOf( description ) |
@ rdfs:subClassOf x( description ) . |
This section is still to be started.
The basic format will be like in the message I sent with an early draft.
The conditions on the types have been simplified. The new tables will be generated automatically from the mapping rules.
To fix the problem of annotations and entailments, the definition of entailment between RDF/XML files is changed to approximately:
Given an RDF file X with abstract syntax representation X' and an RDF file Y with abstract syntax representation Y', then X X DL-entails Y if and only if both X' direct-entails Y' and X rdfs-entails the subset of Y consisting of the annotation triples.
RDFS compatible semantics are clarified to say that:
Just at the beginning stages - all things needing mechanical verification have not been verified.
This version doesn't distinguish between DL and Lite.
An A-graph is an RDF graph that is the result of mapping an abstract syntax ontology using the mapping rules. (An A-graph is finite).
A T-graph is a finite RDF graph that obeys the rules (no blank loops, no bnode as the object of two or more triples, every node either builtin or with an explicit type, excluding rdfs:Class, rdf:Property, owl:FunctionalProperty, owl:DeprecatedClass, owl:DeprecatedProperty), and for which there exists some classification of nodes into categories that arise in the abstract syntax, such that every triple is in the long list of triples (not yet ) in the previous section. All bnodes of type rdf:List must be the object of some triple. Moreover in a T-graph the blank nodes are tightly constrained, as described in the previous section.
Every A-graph is a T-graph.
the proof is wholly straightforward and mechanical and reflects the way the triple table is generated. It is probably quite tedious.
Every ground T-graph all of whose triples have predicate rdf:type is an A-graph.
Proof, from a mechanical generated list table given for any such type triple, a directive from the abstract syntax that corresponds to just that one triple.
If a ground T-graph contains a bnode then it contains either a bnode that is not the object of any triple, or a bnode which is the object of a triple with a uriref subject.
The empty graph is both a T-graph and an A-graph
Given any ground non-type triple in a T-graph you can construct an abstract syntax directive that corresponds to exactly that triple and some type triples that are necessarily in the T-graph
Proof again is a mechanically generated list
Lemma 1 is half the problem done.
We proceed by induction from lemma 4
Suppose t is a T-graph and for all smaller T-graph are A-graphs (and that the node classifications match - need to expand this bit), then, one of the following holds: