semantic-webowlprotegeobject-property

How to make property of property in Protégé?


I have a following problem to model in OWL using Protégé:

Multiple Songs could be performed in different Performances. Each Song could be arranged by different Arranger in different Performance.

I already know how to relate a Song to a Performance using object property. Now, how to map a Song-Performance pair to an Arranger? (In relational database, I would call this as a "descriptive attribute" of a many-to-many Song-Performance relationship).

I know that I could use an annotation to an object property, but I would like to be able to infer something from this property. (For example: what Song has an Arranger arranged, and in which Performance?) As far as I know, I am not able to do inference from an annotation.


Solution

  • It's not necessary to add properties of properties to model this scenario, although a property is an object (a uri) and therefore can include any property, not just annotation properties. rdfs:subPropertyOf is a good example. Statement reification isn't necessary either. It's a matter of creating an object that holds information about the song and performance.

    Here is a model that represents an Arranger's relationship to a Song-Performance:

    ex:SongPerformance a owl:Class .
    ex:Arranger a owl:Class .
    ex:arranged rdfs:domain ex:Arranger ;
        rdfs:range ex:SongPerformance .
    ex:songPerformed rdfs:domain ex:SongPerformance ;
        rdfs:range ex:Arranger .
    ex:performedIn rdfs:domain ex:SongPerformance ;
        rdfs:range ex:Arranger .
    

    Given this list, an example instance is:

    ex:Arranger-1 ex:arranged ex:SP1 .
    ex:SP1 ex:performedIn ex:Performance_1 ;
        ex:songPerformed ex:Song1 .
    

    Then you can find which songs has an arranger arranged in a given performance through the following SPARQl query:

    SELECT ?arranger ?song ?performance
    WHERE {
       ?arranger a ex:Arranger ;
           ex:arranged ?sp .
       ?sp ex:songPerformed ?song ;
          ex:performedIn ?performance .
    }