属性 在 ontology 中覆盖
property override in ontology
我一直在四处寻找,但找不到对以下内容进行建模的好方法,我在 owl 中有两个 class,一个是 class 的基数另一个:
:Base rdf:type owl:Class .
:Sub rdf:type owl:Class;
rdfs:subClassOf :Base .
:hasDescription rdf:type owl:DatatypeProperty .
我希望 :Base 的所有实例都具有固定描述 (:hasDescription "BASE"),并且 :Sub 的所有实例都具有不同的固定描述 (:hasDescription "SUB")。但我想避免为每个实例创建一个三元组,例如
:Base1 rdf:type :Base;
:hasDescription "BASE" .
我尝试使用 owl:Restriction :
:Base rdf:type owl:Class .
rdf:subClassOf [ rdf:type owl:Restriction ;
owl:onProperty :hasDescription ;
owl:hasValue "BASE"
] .
:Sub rdf:type owl:Class;
rdfs:subClassOf :Base ,
[ rdf:type owl:Restriction ;
owl:onProperty :hasDescription ;
owl:hasValue "SUB"
] .
但这行不通,因为 :Sub 将同时具有 "BASE" 和 "SUB" 作为描述,因为它是 :Base 的子class,而后者又是子class 的限制值为 "BASE"。有人对如何在 owl 中完成此操作有任何建议吗?谢谢。
我认为这可能是可能的,但它强调了面向对象编程语言与 OWL 中存在的 class 层次结构之间的差异。它们是非常不同的东西,考虑更改您的模型可能是有意义的,因为您可能找不到解决此问题的令人满意的方法。
子class的每个实例都是其所有祖先的实例。这就是为什么如果你断言
基础 SubClassOf(具有描述值 "BASE")
Base 的子classses 的所有实例也将具有该值。 (当然,你已经知道了;你在问题中已经描述过了。)
您可以说 不是 Sub 实例的 Base 实例具有值 "BASE" 并且 Sub 实例具有 "SUB" 值两个公理。一个说 Sub 的实例具有值 "SUB"(您已经知道如何执行此操作):
子 SubClassOf(具有描述值 "SUB")
要说 不是 Sub 实例的 Base 实例具有值 "BASE",您使用一般的 class 公理,例如:
基础和(不是子)子类(hasDescription 值 "BASE")
创建通用 class 公理的过程已在其他问答中讨论过,并不难。参见,例如:
- Inferencing in protege
您可能 运行 遇到的困难是使用这个公理。通常,当您断言某物是 Base 的实例时,您不会明确断言它 不是 子 class 的实例。这是开放世界假设的体现:仅仅因为你不知道某件事是真的并不意味着你不知道它是假的。
当然,您可以通过向个人添加额外的类型断言来做到这一点。例如,如果 x 是一个 Base 而不是 Sub,你只需要说:
x : 基础
x : 不是 Sub
我一直在四处寻找,但找不到对以下内容进行建模的好方法,我在 owl 中有两个 class,一个是 class 的基数另一个:
:Base rdf:type owl:Class .
:Sub rdf:type owl:Class;
rdfs:subClassOf :Base .
:hasDescription rdf:type owl:DatatypeProperty .
我希望 :Base 的所有实例都具有固定描述 (:hasDescription "BASE"),并且 :Sub 的所有实例都具有不同的固定描述 (:hasDescription "SUB")。但我想避免为每个实例创建一个三元组,例如
:Base1 rdf:type :Base;
:hasDescription "BASE" .
我尝试使用 owl:Restriction :
:Base rdf:type owl:Class .
rdf:subClassOf [ rdf:type owl:Restriction ;
owl:onProperty :hasDescription ;
owl:hasValue "BASE"
] .
:Sub rdf:type owl:Class;
rdfs:subClassOf :Base ,
[ rdf:type owl:Restriction ;
owl:onProperty :hasDescription ;
owl:hasValue "SUB"
] .
但这行不通,因为 :Sub 将同时具有 "BASE" 和 "SUB" 作为描述,因为它是 :Base 的子class,而后者又是子class 的限制值为 "BASE"。有人对如何在 owl 中完成此操作有任何建议吗?谢谢。
我认为这可能是可能的,但它强调了面向对象编程语言与 OWL 中存在的 class 层次结构之间的差异。它们是非常不同的东西,考虑更改您的模型可能是有意义的,因为您可能找不到解决此问题的令人满意的方法。
子class的每个实例都是其所有祖先的实例。这就是为什么如果你断言
基础 SubClassOf(具有描述值 "BASE")
Base 的子classses 的所有实例也将具有该值。 (当然,你已经知道了;你在问题中已经描述过了。)
您可以说 不是 Sub 实例的 Base 实例具有值 "BASE" 并且 Sub 实例具有 "SUB" 值两个公理。一个说 Sub 的实例具有值 "SUB"(您已经知道如何执行此操作):
子 SubClassOf(具有描述值 "SUB")
要说 不是 Sub 实例的 Base 实例具有值 "BASE",您使用一般的 class 公理,例如:
基础和(不是子)子类(hasDescription 值 "BASE")
创建通用 class 公理的过程已在其他问答中讨论过,并不难。参见,例如:
- Inferencing in protege
您可能 运行 遇到的困难是使用这个公理。通常,当您断言某物是 Base 的实例时,您不会明确断言它 不是 子 class 的实例。这是开放世界假设的体现:仅仅因为你不知道某件事是真的并不意味着你不知道它是假的。
当然,您可以通过向个人添加额外的类型断言来做到这一点。例如,如果 x 是一个 Base 而不是 Sub,你只需要说:
x : 基础
x : 不是 Sub