使用OR语句的SWRL规则

时间:2011-07-06 00:35:29

标签: semantic-web ontology owl swrl

我正试图找出一种实现需要使用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)

我欢迎所有关于这个问题的想法。

1 个答案:

答案 0 :(得分:3)

如果使用OWL的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只将规则应用于已知的个人)。