我希望能够推断出哪些成分在给定的条件下可以很好地结合在一起……它们的特性以及哪些特性可以互补。
我有一个本体,
owl:Thing
Ingredient
Kale
Pear
Taste
Bitter
Sweet
owl:topObjectProperty
hasTaste
tasteComplements
goesWellWith
Individuals: (*would rather work with just classes)
kale a Kale
pear a Pear
bitter a Bitter
sweet a Sweet
我已经断言
Kale subClassOf hasTaste some Bitter
Pear subClassOf hasTaste some Sweet
Bitter subClassOf tasteComplements some Sweet
tasteComplements a owl:SymmetricProperty
goesWellWith a owl:SymmetricProperty
还有一个公理:
(hasTaste some Bitter) SubClassOf: goesWellWith some (hasTaste some Sweet)
首先,我希望Protege能够推断出Sweet tasteComplements some Bitter
。尽管我理解为什么存在性限制中的对称属性不能那样工作。所以我会解决
sweet tasteComplements bitter
bitter tasteComplements sweet
但是令人惊讶的是,这些都没有被推断出来。我必须先手动指定其中一个,然后再推断另一个。
更重要的是我想推断:
Kale goesWellWith some Pear
Pear goesWellWith some Kale
在失败的同时,我至少希望:
kale goesWellWith pear
但这也不可以推断。根据我的一般公理,应该是从kale a Kale
开始,至少必须有一个三元组:
kale hasTaste [b] <!-- where [b] is of type Bitter -->
因此,我们也应该再增加三倍:
kale goesWellWith [y]
其中
[y] hasTaste [s] <!-- and [s] is of type Sweet -->
[y] is pear <!-- the only available option in this case -->
kale goesWellWith pear
如何使这些推断在预期的人与人之间发生?类之间的东西会更好。*
更笼统地说,我想断言:
if XXX tasteComplements YYY then:
(hasTaste some XXX) SubClassOf: goesWellWith some (hasTaste some YYY)
是否有像this answer那样通过偷偷摸摸的方法来实现这一目标? (我宁愿避免使用SWRL规则...)
* 注意
尽管我不知道如何在逻辑上做到这一点,但我宁愿推断类之间的三元组而不是个人。个人感觉像是我的成分和特性分类法中每个概念的洗衣单/清单,没有层次结构-多余且无法保持组织。理想情况下,该分类法将为某个人提供一个界面,以描述彼此互补的成分的特征。