Punning (which was introduced in OWL 2 DL) allows one to give the same name (IRI) to a Class and an Object Property (see Association Example).
Can I use this way of meta-modelling to attach attributes on a relation?
For instance, the relation drives
connects Person
and Vehicle
. I want to specify the velocity
with which the Vehicle
is driven, and this property belongs on drives
. Punning allows me to model drives
as an association class by specifying both a class and an object property named drives
. I'm guessing this would allow me to have object properties that have data properties associated with them somehow.
I would like to know whether this is the correct way of going about it. Am I missing something?
Punning (which was introduced in OWL 2 DL) allows one to give the same
name (IRI) to a Class and an Object Property (see Association
Example).
Can I use this way of meta-modelling to attach attributes on a
relation?
As far as I can tell, you can you use the same IRI for both a class and a property, but I don't think it will really help you in the kind of meta-modelling that you're looking for.
For instance, the relation drives connects Person and Vehicle. I want
to specify the velocity with which the Vehicle is driven, and this
property belongs on drives. Punning allows me to model drives as an
association class by specifying both a class and an object property
named drives. I'm guessing this would allow me to have object
properties that have data properties associated with them somehow.
Having the same IRI denote a class and a property doesn't really help here. It sounds like what you want is a reified relation. You'd want to denote this in a way like:
person42 drives driving74
driving74 hasVehicle vehicle89
driving74 hasVelocity 88.8
That's really the most typical way to do this. If you really want to, you can use drives to name a class, and you can make driving74 an instance of that class, which might suggest to users that there's some connection between them. That is, you could make your schema be:
drives a owl:Class
hasVehicle rdfs:domain drives
hasVehicle rdfs:range Vehicle
hasVelocity rdfs:domain drives
hasVelocity rdfs:range Velocity
drives a owl:ObjectProperty
drives rdfs:domain Person
drives rdfs:range drives
You can do that, and maybe it would make the connection more apparent to some users, though in my opinion, it's not really all that helpful, and might just make things more confusing.