如何在 Protégé 中制作 属性 of 属性?

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

我有以下问题要在 OWL 中使用 Protégé 建模:

多个 Song 可以在不同的 Performance 中执行。每个Song可以由不同的Arranger排列在不同的Performance.

我已经知道如何使用对象 属性 将 Song 关联到 Performance。现在,如何将 Song-Performance 对映射到 Arranger? (在关系数据库中,我将其称为多对多 Song-Performance 关系的 "descriptive attribute")。

我知道我可以对对象使用注释 属性,但我希望能够从这个 属性 中推断出一些东西。 (例如:什么 Song 有一个 Arranger 安排,在哪个 Performance ?)据我所知,我无法从注释中进行推断。

虽然 属性 是一个对象(一个 uri)因此可以包含任何 属性,而不仅仅是注释属性,但没有必要添加属性的属性来对这种情况进行建模。 rdfs:subPropertyOf 就是一个很好的例子。声明具体化也不是必需的。这是创建一个包含歌曲和表演信息的对象的问题。

这是一个表示编曲与歌曲表演关系的模型:

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 .

鉴于此列表,示例实例是:

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

然后您可以通过以下SPARQl查询找到在给定演出中哪些歌曲有编曲:

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