我正在尝试构建一个表示属性(资产)的本体,该属性应具有别墅或公寓等类型。

我的问题是,我不知道别墅和公寓应该是类还是实例。我怎么知道 ?

我正在考虑拥有一个名为Property的类和一个名为isTypeOf的关系以及一个名为PropertyType的类,该类具有两个实例apartmentvilla。请问对吗?还是应该将ApartmentVilla设为PropertyType类的子类?

最佳答案

我认为,您在这里结合了两个区别,您可能需要分别主张:


什么时候应该使用子类化,什么时候应该使用属性引用?
什么时候应该在TBox级别(子类)表示歧视,何时在ABox级别(属性值,实例)表示歧视?


(1)与旧的inheritance or delegation问题大致相同。答案也大致相同:当歧视是所表示对象的固有属性时,当歧视属性对您的知识模型至关重要时,并且当歧视属性没有独立的存在理由时,请使用继承。

另一方面,当判别属性仅向您的类/对象添加附加信息或有足够的理由自行“存在”时(即不完全与引用对象完全绑定),请使用委托。在您的情况下:检查是否有多少信息取决于PropertyType本身,而该信息取决于PropertyType本身,而不取决于各个Property。如果存在“带有游泳池和圆形车道的别墅”之类的东西,并且这种区别很重要并且可以重复使用,则可以考虑委派。

(2)遵循相同的功能依赖关系。

我个人的经验法则是


如果您希望根据细分来制定其他公理,则将其设为一类,例如,如果您需要引用细分集,需要附加数据或对象属性,或者希望进一步完善(请考虑LuxuryApartment或只能附加到Garden等的Villa)。
如果您希望本体是确定的,并且新的子分类很少出现,则将其设为一类。但请注意,您的期望可能是错误的。
如果属性值未引入任何功能或功能依赖关系非常有限,并且期望该区别本身不具有任何其他属性,则将其设置为属性。


但是,通常不一定存在正确或错误。

专业班

如果ApartmentVilla是类,则可以根据这些类轻松地制定其他公理。假设,例如,只有PropertyVilla允许有花园:

(∃ hasPropertyFeature . Garden) ⊑ Villa


如果尝试使用hasPropertyType数据属性来表述,那么最终会得到类似

(∃ hasPropertyFeature . Garden) ⊑ (∃ hasPropertyType . "villa"^^xsd:string)


这不仅很难掌握,而且推理起来也较慢。而且,可以将类细分为子类,即可以直接进行其他细分。

对比类

但是,具有hasPropertyType属性而没有其他限制,则使您可以纯粹在实例级别添加其他属性值,而无需接触原始本体。

如果townHouse是新的属性类型,则基于类的版本需要更改原始本体的TBox并添加新的TownHouse类。尽管这通常没有问题(多数情况下是保守的扩展),但它仍然是TBox的更改,您基本上需要为此类更改创建新版本的本体。

当该属性引入功能依赖性时,此版本变得不可行。往上看。

09-11 18:32