owl:Nothing rdf:type owl:Class .
owl:Nothing owl:oneOf rdf:nil .
owl:Class rdf:subClassOf rdfs:Class .
owl:Restriction rdf:subClassOf owl:Class .
owl:Property rdf:subClassOf rdf:Property .
owl:DataTypeProperty rdf:subClassOf owl:Property .
owl:ObjectProperty rdf:subClassOf owl:Property .
owl:FunctionalProperty rdf:subClassOf owl:Property .
owl:SymmetricProperty rdf:subClassOf owl:Property .
owl:InverseFunctionalProperty rdf:subClassOf owl:Property .
owl:TransitiveProperty rdf:subClassOf owl:Property .
owl:sameClassAs rdfs:domain owl:Class .
owl:sameClassAs rdfs:range owl:Class .
owl:samePropertyAs rdfs:domain owl:Property .
owl:samePropertyAs rdfs:range owl:Property .
owl:DisjointWith rdfs:domain owl:Class .
owl:DisjointWith rdfs:range owl:Class .
owl:complementOf rdfs:domain owl:Class .
owl:complementOf rdfs:range owl:Class .
owl:inverseOf rdfs:domain owl:Property .
owl:inverseOf rdfs:range owl:Property .
owl:oneOf rdfs:domain owl:Class .
owl:oneOf rdfs:range rdf:List .
owl:unionOf rdfs:domain owl:Class .
owl:unionOf rdfs:range rdf:List .
owl:intersectionOf rdfs:domain owl:Class .
owl:intersectionOf rdfs:range rdf:List .
owl:onProperty rdfs:domain owl:Restriction .
owl:onProperty rdfs:range owl:Property .
owl:allValuesFrom rdfs:domain owl:Restriction .
owl:allValuesFrom rdfs:range rdfs:Class .
owl:someValuesFrom rdfs:domain owl:Restriction .
owl:someValuesFrom rdfs:range rdfs:Class .
owl:hasValue rdfs:domain owl:Restriction .
owl:minCardinality rdfs:domain owl:Restriction .
owl:minCardinality rdfs:range xsd:NonNegativeInteger .
owl:maxCardinality rdfs:domain owl:Restriction .
owl:maxCardinality rdfs:range xsd:NonNegativeInteger .
owl:cardinality rdfs:domain owl:Restriction .
owl:cardinality rdfs:range xsd:NonNegativeInteger .
There are also several patterns of entailment (ie, inference rules) which can be used to draw conclusions which are valid under this semantics. (We do not claim that this set is complete.)
this: | entails this: |
AAA rdf:type owl:Property . |
AAA rdfs:domain owl:Thing |
AAA rdf:type CCC . |
BBB rdf:type CCC . |
|
AAA owl:sameClassAs BBB . |
|
AAA owl:samePropertyAs BBB . |
With the semantic conditions stated so far, the OWL vocabulary can be used within an arbitrary RDF graph, but it only makes meaningful assertions about things in the OWL universe, and only draws a limited range of conclusions, since there are no built-in assumptions about which RDF entities are in the OWL universe.
For example,
JohnClass owl:oneOf _:1 .
_:1 rdf:first John .
_:1 rdf:rest rdf:nil .
weak-OWL entails
John rdf:type JohnClass .
as one might expect, but there is a subtlety in the reasoning: the antecedent's
use of owl:oneOf
implicitly asserts that John is an owl:Thing and
JohnClass is an owl:Class. However, the following graph could be false in a
weak-OWL interpretation:
John rdf:type _:x .
_:x owl:oneOf _:1 .
_:1 rdf:first John .
_:1 rdf:rest rdf:nil .
since the relevant OWL class might not exist; for example, if John is not an owl:Thing. (The list would exist, but that is not in itself enough to establish that what it contains is in the OWL universe.) Similarly,
John rdf:type Student .
John rdf:type Employee .
does not weak-OWL entail
John rdf:type _:x .
_:x owl:intersectionOf _:l1 .
_:l1 rdfl:first Student .
_:l1 rdf:rest _:l2 .
_:l2 rdfl:first Employee .
_:l2 rdf:rest rdf:nil .
in spite of the weak closure conditions, since Student may not be an owl:Class. In order to obtain the intuitive conclusions, we must add 'localizing' assertions of the form
.... rdf:type owl:Thing/Class/Property .
which ensure that the user urirefs refer to things in the appropriate parts of the OWL universe, in order to ensure that the required conclusions follow. Sometimes, as in the first example above, these can be inferred from the domain and range conditions on the OWL vocabulary, but in general, care is needed. When localizing assertions are added, the weak semantic conditions suffice to establish the intuitive conclusions: the above graph is weak-OWL entailed by
John rdf:type owl:Thing .
John rdf:type Student .
John rdf:type Employee .
Student rdf:type owl:Class .
Employee rdf:type owl:Class .
When it comes to restrictions, the OWL vocabulary only conveys part of the full OWL meaning, so that many 'natural' entailments do not go through. For example, one might expect that
John friend Susan .
John rdf:type owl:Thing .
Susan rdf:type owl:Thing .
friend rdf:type owl:Property.
would entail
John rdf:type _:x .
_:x owl:onProperty friend .
_:x owl:minCardinality 1 .
since it seems obvious that Susan's friendship is enough to conclude that John is in the class of people with at least one friend, and all the vocabulary is properly located; but this inference is not valid (with the semantic conditions so far) since the antecedent does not guarantee that there is a restriction class of John's friends, i.e. that this class actually exists. In general, this semantics provides no guarantee that any restriction classes exist other than those that are actually named in some way in the antecedents: it has no built-in assumptions about restrictions on properties actually existing. Note that if we had actually given the restriction a name, thereby establishing that it does exist, then we could make the analogous inference:
John friend Susan .
John rdf:type owl:Thing .
Susan rdf:type owl:Thing .
friend rdf:type owl:Property.
HasFriend owl:onProperty friend .
HasFriend owl:minCardinality 1 .
weak-OWL entails
John rdf:type HasFriend .
The next two sections discuss two different strategies for extending OWL entailment to encompass the full range of intuitively valid conclusions from an OWL/RDF graph.
One possible way to use the OWL vocabulary is to assume that the OWL and RDFS universes are identical. The resulting language can express some surprising contradictions, and the general task of detecting inconsistencies is probably undecideable in general, and even when it can be decided it is of unknown complexity (but almost certainly NP-complete.) This might be called the dangerous option. Users who are willing to take the computational risks inherent in this freewheeling use of the OWL vocabulary gain some flexibility in composing and using it.
Using the OWL vocabulary without restrictions in this way means that many of the distinctions which motivate the use of the OWL classifications become meaningless, so that much of the 'basic' vocabulary becomes redundant. For example, owl:Thing and rdf:Resource have the same extension, as do owl:Class and rdfs:Class. The basic semantic assumptions are trivial to state:
IOT = IR |
One can obtain this option by adding enough extra assertions to force these identities to hold. This can be done in various ways, but the following, which we will refer to as the large-OWL knowledge base, is sufficient.
|
Any OWL/RDFgraph which entails the large OWL knowledge base is said to be a large-OWL graph. Obviously, the localization assertions now follow trivally, so we will omit them when discussing large-OWL graphs.
The appropriate closure conditions to add for the large-OWL semantics are also straightforward to state: any combination of class and property should define an appropriate restriction class. We will call these the large closure conditions. These guarantee that the the universe contains classes corresponding to the restriction operations. (Note that the existence of the relevant class does not imply that its extension is nonempty: many restrictions, eg a restriction on a property to a class disjoint from its range, will simply define a class with an empty extension.)
for any x which is | and p in | there is a y in IOR with IRP(y)=p and <y, x> in: |
in IC | IOP | IEXT(I(owl:allValuesFrom)) |
in IC | IOP | IEXT(I(owl:someValuesFrom)) |
in IR | IOP | IEXT(I(owl:hasValue)) |
a non-negative integer | IOP | IEXT(I(owl:minCardinality)) |
a non-negative integer | IOP | IEXT(I(owl:maxCardinality)) |
a non-negative integer | IOP | IEXT(I(owl:cardinality)) |
We will say that a weak OWL interpretation of a graph G is a large-OWL interpretation of G if it satisfies the large closure conditions. Usually this is of interest only when G is a large-OWL graph.
Obviously, one could simplify large OWL by identifying the OWL and RDFS universes, abandoning the redundant distinctions, and simply using rdf:Resource instead of owl:Thing and so on. The basic OWL classes could then be eliminated from the language, and the ranges and domains of the rest of the OWL vocabulary could be relaxed to the analogous RDFS domains and ranges. However, that strategy would result in a genuinely different language, and would require reasoners to be aware of the re-naming conventions used. We therefore recommend that users who prefer to use OWL reasoning in the large make this explicit by importing or adding the large-OWL KB into their graphs. Once that is done, of course, it follows for example that
owl:Class owl:sameClassAs rdf:Resource .
owl:Property owl:SameClassAs rdf:Property .
so that the RDFS class names may be freely used instead of the OWL class names elsewhere in the graph.
Large OWL retains the distinction between owl:ObjectProperty and owl:DataTypeProperty, but makes no assertions about them other than being subclasses of owl:Property.
Since owl:complementOf is essentially negation (it takes the complement with respect to IOT, which is the entire universe IR in large OWL), it is easy to write OWL graphs which are contradictory, i.e. have no satisfying interpretations. Perhaps the simplest way to do this is by saying that a class exists which is identical with its own complement:
_:y owl:complementOf _:y .
The semantic conditions provide no way to satisfy this, since in order to satisfy the owl: complementOf conditions IOT would have to be empty, in which case there is nothing for _:y to denote.
One particularly famous kind of contradiction arises when one says that some class contains only those classes that do not contain themselves, and asks whether it contains itself. This non-existent class is named for Bertrand Russell, who used it to show that Frege's original set theory was inconsistent. In large-OWL/RDF the 'circularity' of this definition poses no problem, and it might for example be expressed by the following graph:
ex:Russell owl:complementOf _:z .
_:z rdf:type owl:Restriction .
_:z owl:onProperty rdf:type .
_:z owl:hasValue _:z .
This is often called 'Russell's paradox', but in fact it has a non-paradoxical conclusion, which is that there is no such class (of things that do not contain themselves), i.e. that the above graph is unsatisfiable. (Frege regarded this as 'paradoxical' because his set theory incorporated the assumption that any description defined a class, an idea which is now recognized as hopelessly optimistic.) Large OWL does not make any such assumptions about its class-defining vocabulary. The strong closure conditions guarantee that if _:y is a class then it has a complement, but they do not of course guarantee that this complement can possibly be _:y itself. The situation is analogous to using arithmetic terms to write equations. We know that given any integers, their sums, products and negatives exist; but that does not guarantee that all equations have integer solutions. The first contradiction above is like saying that an integer y exists which satisfies y = 1 – y, which is of course simply false. What the second example illustrates, however, is that detecting contradictions in large OWL is likely to be a very complex task in general, since they can arise from very subtle chains of reasoning. Most contradictions are not so overtly clear as they are in the first example. In general, users of large OWL need to be aware that they any process which combines or composes OWL graphs runs the risk of generating inconsistency, and that the task of detecting those inconsistencies is, in general, only semi-decideable. This is of course the normal situation for users of such an expressive language: it might be called the first-order existential condition.
Fast OWL, described below, provides an extra layer of protection against such contradictions by imposing syntactic restrictions which make it syntactically impossible to construct 'circular' descriptions like the Russell above graph. It is still possible to construct inconsistencies in fast OWL, but the syntactic restrictions also make it much easier to detect them; in particular, fast-OWL is a decideable language so that contradictions can be detected reliably and even fairly efficiently. [reference? Ian??]
In large OWL, simply using a uriref as the value of rdf:type implicitly asserts that it denotes an OWL class, since every RDFS class is an OWL class. There is therefore no need to make localizing assertions explicit in order to draw the 'intuitive' entailments that one would expect from a straighforward reading of the OWL/RDF vocabulary. These include entailments involving the existence of unnamed restrictions, which are not sanctioned by weak OWL entailment. Moreover, since complementation is defined relative to the entire RDFS class universe, the semantic conditions on union and intersection obey the usual duality conditions (deMorgan's laws) on all RDFS classes:
this: | large-OWL entails this: |
John rdf:type _:y . _:y owl:complementOf _:x . _:x unionOf _:l1 . _:l1 owl:first Student . _:l1 owl:rest _:l2 . _:l2 owl:first Employee . _:l2 owl:rest owl:nil . |
John rdf:type _:z . _:z owl:complementOf Student . |
John friend Susan . |
John rdf:type _:x . _:x owl:onProperty friend . _:x owl:minCardinality 1 . |
John rdf:type owl:Object |
John rdf:type _:x . _:x owl:oneOf _:l . _:l owl:first John . _:l owl:rest owl:nil . |
To illustrate the reasoning for the first example: the weak closure conditions guarantee that the relevant _:z exists provided Student and Employee are OWL classes; the large-OWL graph conditions guarantee that they are OWL classes; and the semantic conditions on complementOf and unionOf guarantee that John is in _:z 's class extension.
The other option takes weak OWL/RDF in a different direction, one which corresponds more closely to the design of the OWL abstract syntax [OWLAS]. This envisions OWL as talking about a much more restricted kind of universe than the rather free-wheeling RDFS universe. In this version of OWL/RDF, the OWL universe is strictly layered into individual 'things' which can have properties and be in classes, classes of things, and properties of things; and the properties are segregated into those which take things as values and those which only take datatypes as values. Classes cannot contain other classes or properties, and properties cannot have classes as values, or be applied to classes. (Classes which contain themselves are right out.)
Under these conditions, of course, the large-OWL knowledge base would be quite unacceptable: it would have consequences that would be considered syntactically illegal. This means that one can say fewer things in fast OWL than in large OWL. On the other hand, many users are quite comfortable with these restrictions, one can get much better performance from inference engines by staying inside the fast OWL framework.
Not every OWL/RDF graph is legal in fast OWL, so before giving the extra semantic conditions we first define the basic syntactic legality conditions. Consider all the bnodes and urirefs in the graph other than those in the RDFS and OWL vocabularies: call this the set of names in the graph. In order to be legal for fast OWL, the names must be separated so that no name refers to more than one of an OWL individual, class, object property, datatype property or datatype value. The fast-OWL semantic conditions make sense only when applied to a vocabulary which is separated in this way. (This notion from Peter.) This separation needs to be consistent through lists, so that any list used in the graph must mention only things from one of the above categories. This means that for each node in the graph, we can classify it according to which part of the OWL universe, or what kind of sequence, it can refer to. We will refer to these names respectively as <individual> (referring to IOT), <class> (to IOC) , <oproperty> (to IOOP) <dtproperty> (to IODP) and <dtv> (to LV) when giving the semantic conditions below. Second, the RDF, RDFS or OWL vocabulary cannot be used to refer to anything in any part of the OWL universe. Examples like the Russell set (which treats rdf:type as an OWL property) are syntactically illegal in fast OWL. What this means is that fast OWL treats the RDF/S/OWL vocabulary as a logical vocabulary whose role is best thought of as part of the syntax of the language itself, and enforces a strict separation between this logical vocabulary and the application vocabulary of individual, class and property names which are used by a particular KB. Seen from this 'layered' perspective, the RDF(S) style of usage, where for example one uses rdfs:range to fix the rdfs:range of itself, and rdfs:Class is itself an rdfs:Class, seems to confuse language and metalanguage.
Any OWL/RDF KB which is obtained by translating from a piece of well-formed OWL abstract syntax [OWLAS] will satisfy these conditions.
The extra semantic conditions for fast OWL all amount to imposing extra conditions on the OWL universe. First, there are restrictions:
IOT, IOC, IOOP, IODP, ICEXT(I(rdf:List)) and LV are
pairwise disjoint (that is, none of them have anything in common with
any of the others), and none of them contain the denotations of anything
in the RDF, RDFS or OWL namespaces.. |
Second, the large closure conditions given above for large OWL need to be re-stated to take into account these restrictions on the OWL universe and ensure that all the entities in the closures are in the appropriate parts of the universe. The following table of fast closure conditions should be thought of as a finer-grained version of the table of large closure restrictions in section 4.They represent the appropriate limitations of the same closure rules to the 'layered' fast-OWL universe.(These are taken from Peter's document.)
for any x which is | and p in | there is a y in IOR with IRP(y)=p and <y, x> in: |
in IOC | IOOP | IEXT(I(owl:allValuesFrom)) |
a datatype or sequence of datatype values | IODP | IEXT(I(owl:allValuesFrom)) |
in IOC | IOOP | IEXT(I(owl:someValuesFrom)) |
a datatype or sequence of datatype values | IODP | IEXT(I(owl:someValuesFrom)) |
in IOT | IOOP | IEXT(I(owl:hasValue)) |
a datatype value | IODP | IEXT(I(owl:hasValue)) |
a non-negativeinteger | IOP | IEXT(I(owl:minCardinality)) |
a non-negativeinteger | IOP | IEXT(I(owl:maxCardinality)) |
a non-negativeinteger | IOP | IEXT(I(owl:cardinality)) |
A weak OWL interpretation of a fast-OWL graph G which satisfies these conditions is a fast-OWL interpretation. Fast-OWL satisfiability, entailment etc. are defined as usual. Note however that these concepts are meaningless when applied to RDF graphs that do not conform to the syntactic form required for fast OWL. This means that a fast-OWL inference rule must preserve fast-OWL syntactic wellformedness, as well as truth, in order to be correct.
Fast OWL makes a larger set of RDF triples universally true in addition to those in the weak knowledge base. They include the following fast knowledge base:
owl:SymmetricProperty
rdf:subClassOf owl:ObjectProperty . owl:InverseFunctionalProperty rdf:subClassOf owl:ObjectProperty . owl:TransitiveProperty rdf:subClassOf owl:ObjectProperty . |
and fast OWL also supports the following additional inference principles:
this: | fast-OWL entails this: |
AAA rdf:type owl:DataTypeProperty |
AAA rdf:range owl:DataTypeValue |
AAA rdf:type owl:ObjectProperty |
AAA rdf:range owl:Thing |
Provided that the expressions involved are fast-OWL legal, fast OWL supports similar basic entailments as large OWL, except that it is now necessary in general to make the locating assumptions explicit, and moreover one can draw more conclusions about the OWL types of inferred classes. For example,
John friend Susan .
does not fast-OWL entail
John rdf:type owl:Thing .
Susan rdf:type owl:Thing .
friend rdf:type owl:ObjectProperty .
and so all this would need to be added explicitly as an antecedent in order to draw the conclusion
John rdf:type _:x .
_:x owl:onProperty friend .
_:x owl:minCardinality 1 .
(compare 5.2). However, one can now also conclude from
_:y rdf:type _:x .
that
_:y rdf:type owl:Thing .
since the fast semantic closure conditions also locate the domain and range of the restriction in the proper parts of the OWL universe. In general, fast-OWL assertions used in an RDF context need to be supported by explicit localizing assertions which ensure that the user urirefs refer to things in the relevant part of the OWL universe, but they also allow one to infer more fine-grained localizing information about the entities that are inferred to exist. In large OWL the required localizing assertions all follow trivially from the large-OWL KB, so can be ignored.
In fast OWL one can repair missing localizations in any separated-syntax KB by adding a particular set of localizing assertions consisting of all triples of the form
<individual> rdf:type owl:Thing .
<class> rdf:type owl:Class .
<oproperty> rdf:type owl:ObjectProperty .
<dtproperty> rdf:type owl:DataTypeProperty .
Call the result of adding all such assertions to a fast-OWL KB the localization of the KB. It should be the case that fast OWL mirrors the OWL abstract-syntax MT in the following sense: given any abstract OWL expressions E, F, then E OWL-entails F iff the localization of the translation of E fast-OWL entails the translation of F; from which it follows that it fast-OWL entails the localization of the translation of F. Thus, localizations of translations provide an accurate RDF 'mirror' for abstract OWL, under the fast-OWL semantic conditions.
The above can all be summed up by saying that one can use the OWL/RDF vocabulary in different modes or styles, which have a great deal in common but differ on what is the proper relationship between the OWL and RDF vocabularies. Here are the options that seems to be clearly viable, with their respective pros and cons.
Large OWL/RDF
This simply uses the OWL vocabulary freely in an RDF(S) context, imposing no extra syntactic restrictions. The OWL and RDFS universes are identified; owl:Thing, owl:Class and owl:Property are treated as synonymous with rdf:Resource, rdfs:Class and rdf:Property respectively.
This obviously gives the most expressive freedom and allows OWL to be used throughout arbitrary RDF KBs, and intermixed with other vocabulary. In particular, large-OWL classes, being all RDFS classes, can contain classes and properties.
The resulting language is essentially a first-order set theory which does not fit into any useful complexity class. Inconsistency is undecideable, and entailment is semi-decideable. There are no useful complexity restrictions on complete inference engines. Particular subcases of the language may be tractable, of course, but there will be no generally efficient complete inference method which is guaranteed to terminate.
Fast OWL/RDF
This restricts the OWL vocabulary to expressions which use only a separated application vocabulary. The OWL universe is a strict subset of the RDFS universe, and OWL entailments will only hold when the appropriate OWL localization conditions are added for user urirefs.
This requires parsers to check OWL/RDF KBs for syntactic conformity, limits the things that can be said using the vocabulary, and restricts useful OWL entailments to limited parts of the RDFS universe. Provided that the localization conditions are made explicit, this allows fast RDF to be merged with other RDF content, but the OWL vocabulary cannot be used freely. Also, there is no general guarantee that an RDF merge of fast OWL graphs is fast-OWL legal, so each case must be checked to ensure that the merged vocabulary is separated.In a fast-OWL universe, OWL classes cannot contain other OWL classes or properties. Comment. It would be possible for an OWL class to contain non-OWL classes and properties, but OWL would be obliged to treat them as individuals. Any triples which mentioned them in a class or property context would violate the fast-OWL syntactic separation conditions, so could not be considered valid fast-OWL conclusions or assumptions.
Fast-OWL/RDF is computationally fairly tractable. Consistency is decideable.(In fact this requires some additional syntactic conditions which forbid the use of transitive properties in restrictions: see [OWLAS]) Inference and satisfiability can be handled by efficient description-logic reasoners.
OWL/RDF as a carrier for abstract OWL
A particular case of fast-OWL is obtained by restricting the language to expressions which result from applying the translation of the OWL abstract syntax into RDF [OWLAS]. This treats OWL/RDF as a 'surface notation' for OWL considered as a non-RDF-based language.
There is no need to check the OWL/RDF for wellformedness since this is guaranteed; and there is no need to include the localizing assertions explicitly, since it is syntactically impossible to refer to which is anything not in the OWL universe, so they can be simply assumed to be universally true. However, it is not in general possible to merge this OWL/RDF with any other piece of RDF without violating these conditions.
This has the same computational properties as the previous option but also provides a syntactic interface route to the reasoners (via an abstract-syntax OWL parser).
Weak OWL
All of the above options have potential negative consequences for freely merging RDF graphs containing OWL vocabulary. For example, the strong OWL option is inconsistent with a fast-OWL graph, and there is no guarantee that an RDF merge of two fast-OWL graphs is fast-OWL legal. Restricting entailments to the weak OWL semantics is the option that preserves the most interoperability, since weak OWL imposes no syntactic constraints of its own and all weak-OWL entailments are also valid under the other OWL use modes.
Weak OWL however does not support many intuitively correct inferences involving restrictions, and does not guarantee that any efficient reasoning strategy will be available. It seems likely that weak OWL has the same inferential complexity as large OWL. The 'safest' strategy would therefore be to conform to the syntactic constraints of fast OWL but only draw weak-OWL conclusions. This might be called the lesser spotted OWL option.
In many ways, large OWL and fast OWL represent two extremes in a range of possibilities. Different versions of the language impose varying syntactic restrictions on the same basic set of meanings. The care needed to keep the options separate is made necessary by the implicit assumptions and simplifications which rely on these incompatible syntactic restrictions.
It might be worth trying to come up with a general-purpose way to state such syntactic restrictions, thereby providing a single framework within which the various versions of the language could coexist without being accidentally injured by the implicit assumptions made by some other version. But there may not be time to do this in the life of the Webont WG.
[RDFMT] RDF MT
[OWLAS] Owl Abstract Syntax
[PFPSOWLMT] Peter's OWL model theory draft
After writing the above an analogy occurred to me. Imagine that we wish to interact only with good people. One way to do this is to simply decide that everyone is good, which is a strategy that is easy to apply but has some risks. Another way to do it is to find a place where all the people are in fact good and stay in that place, but that limits ones ability to make acquaintances. Both of these have the advantage that having made one's decision, one can effectively forget about goodness altogether. Those who are unable or unwilling to adopt either of these strategies are obliged to check everyone they meet in order to see who is good and who is not, and to take care only to associate with the former, which requires constant vigilance and effort. These three options correspond respectively to large OWL/RDF, fast OWL/RDF used solely to convey abstract OWL, and fast OWL/RDF used in an RDF context.