事实上,除了类分类法成员之间的限制继承之外,当存在子分类时,我会对域和范围语义感到困惑。请参阅以下案例。
让我们考虑
(1) hasCar Domain driver
(2) driver subClassOf human
那么,我们可以推断
hasCar Domain human
让我们有hasCar (x, y)
,不管x是
来自(1):driver(x)
来自(2):human(x)
那么:无论x
是什么,如果hasCar(x, y)
=>driver (x)
=>
(3) hasCar Domain human
第一个问题:这个结论正确吗?为什么Protege 5和Hermit(佩莱和耶娜都没有)没有推断出这一点?
让我们考虑
(1) hasAudiCar Range AudiCar
(2) AudiCar subClassOf Car
以类似的方式,我们可以推断
(3) hasAudiCar Range Car
第二个问题:这个结论正确吗?为什么Protege 5和Hermit(佩莱和耶娜都没有)没有推断出这一点?
让我们考虑
(1) hasAudiCar Domain driver
(2) hasAudiCar Range audiCar
(3) driver hasAudiCar min 1 audiCar
(4) audiCar subClassOf car
然后,我们可以推断
driver hasAudiCar min 1 car
第三个问题:这个结论正确吗?为什么Protege 5和Hermit(佩莱和耶娜都没有)没有推断出这一点?
更新
将Jena与规范OntModelSpec.OWL_DL_MEM_RULE_INF
一起使用,得到了我预期的结果!然而,将耶拿与佩莱一起使用并没有,无论是将普罗泰格与隐士还是佩莱都没有!
第一个答案:是的,它没有在Protege中显式显示。(来源:在protege中运行此示例,在Apache Jena中运行类似的颗粒实验)
第二个答案:不,我们无法推断。您可以将子类视为类似于子集。因此,超类的属性适用于子类,而不是相反。你已经非常明确地定义了
(1) hasAudiCar Range AudiCar
(2) AudiCar subClassOf Car
因此,我们知道AudiCar
是Car的子集,并且性质hasAudiCar
仅适用于该子集。因此我们不能说hasAudiCar Range Car
。
第三个答案:不,这也是和以前一样的逻辑谬误。如果要指定driver hasAudiCar min 1 car
,则必须在相应的超类(即human
和car
)上将属性定义为hasAudiCar Domain Human
hasAudiCar Range Car
附加信息:很少想要推断类限制,实际上更有利的是直接指定它们,这样它们就可以驱动推断。例如,您可以将类别AudiCarDriver
定义为等效于Driver and hasAudiCar min 1 AudiCar
,从而将所有拥有至少1辆奥迪的驾驶员分类为AudiCarDrivers
请参阅此处的猫头鹰语言参考http://www.w3.org/TR/owl-ref/
如果这仍然让您感到困惑。希望我能帮上忙:)