首页 > 解决方案 > 为类的每个成员创建新的实例值

问题描述

这是我想做但不能做的事情:

我正在实例化属于各种类(模型)的设备。假设是汽车。实例化的汽车应该根据模型继承“默认”属性,但应该有自己的属性。类层次结构示例:

Car
  Tesla
  Honda
Property

“属性”将是一<key, value>对,例如<"top_speed", "100">, <"seats", 5>。我可以为特斯拉定义默认属性,创建实例:

teslaPropertySpeed = <"top_speed", 100>
teslaPropertySeats = <"seats", 5>

然后让所有特斯拉都拥有这个属性:

Tesla SubClassOf ((hasProperty value teslaPropertySpeed) and (hasProperty value teslaPropertySeats))

...但是,如果我购买了特斯拉,我可能会“破解”它以使其更快或更慢,或者移除座椅。因为我说所有特斯拉都有这个属性,它就不再是特斯拉了。

更好的方法是说所有特斯拉都有自己的速度和座椅属性,我想将其设置为默认的、可修改的值。

简而言之,我想为每个实例化的特斯拉创建新的属性。我可以声明式地这样做吗?至于默认值,我可以在 Tesla 的子类(例如 FactoryTesla)中定义默认值,这样修改后的 Tesla 就会从该子类中剔除,但会保留上层的“Tesla”类。

标签: rdfowlprotege

解决方案


你将无法做你打算做的事情。那就是能够推断出具有类型的汽车Tesla不再具有类型Tesla,因为它已被修改。正如 AKSW 指出的那样,由于推理是单调的,这不会发生。这大致意味着在添加更多公理之前已经推断出的任何内容在添加更多公理之后仍然会被推断出来。“松散”推论的唯一方法是修改或删除本体中的现有公理。

将能够做的是定义您的Tesla类的属性并允许推理器推断个人属于 type Tesla。以下本体将做到这一点。

DataProperty: hasSeats
    Range: xsd:integer


DataProperty: hasTopSpeed
    Range: xsd:integer


Class: Car
    EquivalentTo: 
        (hasSeats exactly 1 xsd:integer)
         and (hasTopSpeed exactly 1 xsd:integer)


Class: Tesla
    EquivalentTo: 
        (hasSeats value 5)
         and (hasTopSpeed value 100)
    SubClassOf: 
        Car


Individual: aTesla
    Facts:  
     hasSeats  5,
     hasTopSpeed  100

Individual: notATesla
    Facts:  
     hasSeats  2,
     hasTopSpeed  80

这将推断出aTesla个体是类型Tesla,而不会为个体做出这样的推断notATesla。但是,如果您创建如下个人modifiedTesla,这将导致推理器给出不一致。

Individual: modifiedTesla
    Type: Tesla
    Facts: hasTopSpeed  200 

不一致的原因(对于上面的本体)是因为modifiedTesla通过hasTopSpeed属性关联了两次:一次 forhasTopSpeed 100和一次 for hasTopSpeed 200。这是因为hasTopSpeed 200 不会覆盖类中的属性Tesla

从您的问题来看,您似乎是从面向对象的角度来解决这个问题的。有一些相似之处,但在大多数情况下,面向对象和本体是天壤之别。我在这里写了一些在这方面绊倒人们的陷阱。


推荐阅读