我有几个关于 OWL + SWRL 的问题。请注意,我是逻辑和本体论背后所有科学的新手。还有 protégé 的新手。我目前正在使用 Protégé 5.6.1。我有一个本体,我在其中对由零件组成的组件进行建模。因此,我有一种树结构,使用称为
hasPart
的传递对象属性。逆属性是isPartOf
.
我附上一个简约的本体来解释我的问题。你可以在这里下载它
我已经创建了个人并声明了属性,例如:
assembly_1 hasPart part_01.
part_01 hasPart part_02.
还有一个更复杂的例子:
assembly_2 hasPart part_10.
assembly_2 hasPart part_20.
assembly_2 hasPart part_30.
part_10 hasPart part_11.
part_30 hasPart part_31.
part_31 hasPart part_32.
每个部分都有一个数据属性
massKg
。除了part_31
启动 Pellet reasonner,传递属性的行为正确恕我直言。例如,通过断言和推理,assembly_2 的所有部分 >= part_10。 part_32 是 part_31、part_30 和 assembly_2 的一部分。
但是现在,这就是我被困的地方......
我想通过 SWRL(根据我的理解)知道零件是装配树的一片叶子。 我很想编写类似的代码:
isPartOf(?object, ?parent) ^ not( hasPart(?object, ?noSubPart)) -> isLeaf(?object, true)
也就是说:“一个对象是父对象的一部分,但没有子部分,是一片叶子”。 遗憾的是,对象属性似乎不支持否定(查看此FAQ)。
我该怎么办?
类似的问题是关于数据属性。例如,如何在个人没有数据属性的情况下创建 SWRL 规则
massKg
?
最后,我想创建一个规则/方法(也许是 SQWRL ?)来获得程序集的总
massKg
。要么因为这是树的最顶层元素。或者(因为我以后会有这种情况),因为个人属于给定的类别,我想要属于它的所有部分的总和。
我愿意接受建议。并敞开心扉。因为我是OWL和SWRL的新手,目前还没有大写。因此,如果您向我建议其他方法来计算规则(前向和后向)以及关于本体或知识库/三元组/其他任何东西的数学,我什至可以接受(我很乐意了解您的想法)。
不要犹豫向我推荐网站/文章/书籍来提升自己。
提前致谢。 鲍里斯