我想能够推断出哪些成分结合得很好,考虑到它们的性质,哪些性质是互补的。
我有一个本体论,
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规则…)
*
注意
我宁愿在类与类之间推导三元组,而不是在个体之间,尽管我不知道如何在逻辑上实现这一点。个人感觉就像是我的配料和属性分类法中每一个概念的洗衣单/垃圾堆,没有层次结构——多余而且不可能保持组织。理想情况下,这种分类法将为某人提供一个接口来描述相互补充的成分的特性。