下面是我想做的,但做不到的事情:
我正在实例化属于各种类别(模型)的设备。假设它是汽车。实例化的汽车应该根据模型继承“默认”属性,但每个都应该有自己的属性。类层次结构示例:
Car
Tesla
Honda
Property"Property“可以是一个属性对,例如,<"top_speed", "100">,<"seats", 5>。例如,我可以为创建实例的Tesla定义默认属性:
teslaPropertySpeed = <"top_speed", 100>
teslaPropertySeats = <"seats", 5>然后让所有的特斯拉都有这样的属性:
Tesla SubClassOf ((hasProperty value teslaPropertySpeed) and (hasProperty value teslaPropertySeats))...however,如果我买了一辆特斯拉,我可能会“黑”它,让它开得更快或更慢,或者移走座椅。因为我说过所有的特斯拉都有这个特性,它就不再是特斯拉了。
一种更好的方式是说,所有特斯拉都有自己的速度和座位属性,我想将其设置为默认值,可修改的值。
简而言之,我想为每个实例化的Tesla创建新的属性。我能以声明的方式做到这一点吗?至于默认值,我可以在特斯拉的子类(比如FactoryTesla)中定义默认值,这样修改后的特斯拉就会从该子类中去掉,但会保留上面的“特斯拉”类。
发布于 2019-09-18 23:55:46
你将不能做你想做的事情。也就是说,能够推断出类型为Tesla的汽车不再属于Tesla类型,因为它已被修改。正如AKSW指出的那样,由于推断是单调的,这不可能发生。这大致意味着,在添加进一步的公理之前已经推断出的任何东西,在添加了进一步的公理之后仍然会被推断出来。“松散”推理的唯一方法是修改或删除本体中的现有公理。
你能做的就是定义你的Tesla类的属性,并允许推理器推断出一个人是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属性关联了两次:一次用于hasTopSpeed 100,一次用于hasTopSpeed 200。这是因为hasTopSpeed 200 不会覆盖 Tesla类中的属性。
从你的问题看,你似乎是从面向对象的角度来处理这个问题的。它们之间有一些相似之处,但在很大程度上,面向对象和本体是完全不同的。在这方面,我已经写了一些关于here的陷阱。
https://stackoverflow.com/questions/57989427
复制相似问题