如何在 OWL class 中添加 2 个子class?

How do you add 2 subclassof's in an OWL class?

我正在尝试为佳能相机做一个 class 声明。但我不知道在佳能相机 class 中是否允许 2 subclassOf 语句指向 "Camera" 和 "Canon Product".

这是我目前拥有的:

<owl:Class rdf:ID=”product”>
    <rdfs:comment>Products form a class. </rdfs:comment>
</owl:Class>

<owl:Class rdf:ID=”Camera”>
    <rdfs:comment>Photography device</rdfs:comment>
    <rdfs:label>Device</rdfs:label>
    <rdfs:subClassOf rdf:resource=”#product”/>
</owl:Class>

<owl:Class rdf:ID=”Canon Product”>
    <rdfs:comment>A canon device</rdfs:comment>
    <rdfs:label>Device</rdfs:label>
    <rdfs:subClassOf rdf:resource=”#product”/>
</owl:Class>

我需要知道这是否可行且正确:

<owl:Class rdf:ID="Canon Camera">
    <rdfs:comment>A canon camera</rdfs:comment>
    <rdfs:subClassOf rdf:resource="#Canon Product"/>
    <rdfs:subClassOf rdf:resource="#Camera"/>
</owl:Class>

谢谢:)

除了空格在 IRI 中不是合法字符这一事实(因此 #Canon ProductCanon Camera 在句法上不是合法的标识符),你的例子很好。您表达了一个 ontology,其中 Canon Camera 的每个实例都被推断为 Canon ProductCamera 的实例。

但是请注意,您所捕获的 而不是 是反向推理:您的模型并未表达既是 "Camera" 又是 "Canon Product" 始终是 "Canon Camera"。

如果您也想捕捉这种反向关系,您需要使用特定于 OWL 的结构,而不是仅仅添加 rdfs:subClassOf 关系。一种简单的表达方式是使用 owl:intersectionOf,像这样:

<owl:Class rdf:ID="CanonCamera">
    <rdfs:comment>A canon camera</rdfs:comment>
    <owl:intersectionOf rdf:parseType="Collection">
      <owl:Class rdf:about="#CanonProduct"/>
      <owl:Class rdf:about="#Camera"/>
    </owl:intersectionOf>
</owl:Class>

或使用 Turtle 语法(比 RDF/XML 更易读):

  :CanonCamera a owl:Class ;
      owl:intersectionOf ( :CanonProduct :Camera ) .

这表示 :CanonCamera 的 class 扩展 完全等于 [=20= 的 class 扩展的交集] 和 :Camera。换句话说:

  1. 所有同时一个:CanonProduct和一个:Camera的东西被推断为一个:CanonCamera
  2. 所有属于 :CanonCamera 的事物都被推断为同时属于 :CanonProduct:Camera