我正试图找出一种实现需要使用OR类型语句的SWRL规则的方法。下面是场景:本体有一个类“MachineTool”,它具有“hasProcess”的对象属性和许多进程类。我们希望能够获得MachineTool的个人列表,其中hasProcess值为“EndMilling”或“Drilling”。
如果允许'或'语句,SWRL规则将类似于:
MachineTool(?mt) ^ hasProcess(?mt, ?p) ^ (EndMilling OR Drilling)(?p) -> MyMachineTools(?mt)
但这条规则不合法。有人知道可以完成我们正在寻找的规则(或一组规则)吗?我曾经想过一个替代方案可能是(但尚未测试过,Protege目前很奇怪):
EndMilling(?p) -> MyProcesses(?p)
Drilling(?p) -> MyProcesses(?p)
MachineTool(?mt) ^ hasProcess(?mt, ?p) ^ MyProcesses(?p) -> MyMachineTools(?mt)
我欢迎所有关于这个问题的想法。
答案 0 :(得分:3)
ObjectUnionOf
表示,OR 在SWRL规则中是合法的。
我认为问题在于SWRL表面语法的工具支持,如代码示例中所示。 Protege 3.x在语法上不支持这个OR构造(至少它不是我上次检查过的),而Protege 4.1可以渲染它,它无法重新解析它(只需用rc5检查)。但是,如果您使用的是最新的OWL-API(v3.2.x),并且正在使用XML或函数式语法等语法,那么一切都应该有效。 (请注意,Protege 3.x和4.x使用完全不同的OWL API,我建议您仅使用Protege 4.x和OWL-API 3.x。)
如果您无法在SWRL中使用OR,那么您可以使用等同于ObjectUnionOf
的命名类,例如
EquivalentClasses(my-processes, ObjectUnionOf(end-milling, drilling))
machine-tool(?mt) ^ has-process(?mt, ?p) ^ my-processes(?p)
-> my-machine-tool(?mt)
请注意,您的解决方法(第二个代码示例)没有提供语义上等效的语句,因为您只是声明:
SubClassOf(end-milling, my-processes)
SubClassOf(drilling, my-processes)
与陈述相同:
SubClassOf(ObjectUnionOf(end-milling, drilling), my-processes)
即。说明一个等价,你还需要另一个含义:
SubClassOf(my-processes, ObjectUnionOf(end-milling, drilling))
另请注意,您的规则可以在OWL中轻松表达,即您根本不需要SWRL:
SubClassOf(
ObjectIntersectionOf(
:machine-tool
ObjectSomeValuesFrom(
:has-process
ObjectUnionOf(
:end-milling
:drilling
)
)
)
:my-machine-tool
)
说明OWL中的所有内容(如果可能)有一些好处,例如:你获得了更好的工具支持(有比SWRL reasoners更多的OWL reasoners),你得到更强大的推理(SWRL reasoners只将规则应用于已知的个人)。