Search code examples
rdfsemanticsowlontologyreification

Can OWL punning help in defining data properties on object property?


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?


Solution

  • 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.