假设我们有这些类,男人和女人,父亲和母亲分别作为子类。男人与女人脱节。
有一个名为 hasDaughter 的对象属性,其中父亲和母亲为域,子女为范围。
现在当我尝试运行推理器时,我得到了一个不一致的错误:
Man DisjointWith Woman
John hasDaughter Annie
Father SubClassOf Man
hasDaughter Domain Mother
Mother SubClassOf Woman
hasDaughter Domain Father
现在我知道这是因为父亲和母亲都有一个女儿,推理者认为,因为X有一个女儿X可以是父亲或母亲,或两者兼而有之,因为他们是不相交的,所以一定是错的。
我该怎么做才能解决这个问题?我的想法是同时拥有父级和母级课程,而不仅仅是一个家长课程,我知道这会让事情变得更容易。
答案 0 :(得分:2)
您需要将您的课程分开,以便man
,woman
和father
,mother
分开。所以你需要在你的本体中有两个分支:
Person
Man
Woman
Role
Mother
Father
Daughter
....
您可以Man
和Woman
分开。然后您可以说A Man hasRole Father
和A Woman hasRole Mother
以及其他建模决策。
或者你可以采取其他方式,你可以保留你的建模,只需定义hasFather
和hasMother
而不是hasDaughter
,然后对这些新属性进行域名和范围限制。< / p>
答案 1 :(得分:2)
现在我知道这是因为父亲和母亲都可以有一个女儿,推理者认为,因为X有一个女儿X可以是一个 父亲或母亲,或两者兼而有之,因为他们是脱节的东西 一定是错的。
当您在属性上声明多个域时,解释不是分离(例如,“父亲或母亲”),而是连接(即“既是父亲又是母亲”)。如果你说
p domain A
p domain B
然后断言
x p y
推理者会推断x既是A又是B.如果你想要析取,那么你需要将union类作为域。即,你需要这样做:
hasDaugher domain (Father or Mother)
然后当你有一个断言
John hasDaughter Annie
理由推断
John is a (Father or Mother)
这与你的其他断言一致。