There seems to be a bit of angst about when it’s appropriate to use typeof declarations as opposed to properties in OWL. It’s one version of the old class-as-property dilemma. But all this angst is completely unnecessary, as you can combine both.
Let’s say we have an owl class
Vehicle. A vehicle can have a number of wheels, but of particular interest are two-wheeled and four-wheeled vehicles. Should we use a type or an attribute to indicate the number of wheels?
The problems with using types are:
- we would have to create a type for every possible number of wheels that a vehicle might have, meaning that we would have to edit our ontology to handle strange data values
- we could not compute, for instance, the total number of wheels for a set of vehicle instances – there are no integers to add, just names
But the great advantage of using types is that they are ontologically rich. Properties that are only relevant to two-wheeled vehicles (say:
ForkGeometry) can be declared as being so. When you pull down a record for a truck, you are not left wondering if the “fork geometry” property has gone missing.
Luckily, OWL specifically accommodates this.
In most places where you use a class in OWL, you can use a class expression. A class in OWL is simply a subset of all possible OWL individuals, and there’s many ways to define such a subset. One way is with a
DataHasValue assertion. Thus
DataHasValue('NumWheels', '2') defines a class, every bit as much as
TwoWheeledVehicle defines a class. This means that we can use it as the domain of a property – such as<code ForkGeometry. And we can give it a name with
See: Ontology Sample Code
From here, one can easily go further. You can specify that the property
RakeAngle applies to bikes with a raked fork geometry and is a real number between 0 and 90. You can give “bike with raked forks” a class name or not, depending on how often you need to use the idea.
More importantly, simply by saying
ObjectPropertyAssertion(MyBike ForkType RakedFork),
A reasoner can infer that my
MyBikehas two wheels. That’s the point: we have effectively defined a constant property value for a named class, which logically applies to all individuals of the class.