2

我试图找出一种实现需要使用 OR 类型语句的 SWRL 规则的方法。这是场景:本体有一个类“MachineTool”,它有一个对象属性“hasProcess”和一些进程类。我们希望能够获得具有“EndMilling”或“Drilling”的 hasProcess 值的 MachineTool 个体列表。

如果允许使用“或”语句,则 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)

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

4

1 回答 1

4

如果使用 OWL's 表示,则OR在 SWRL 规则中合法的ObjectUnionOf

我认为问题在于对 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 中陈述一切(如果可能的话)有一些好处,例如,您可以获得更好的工具支持(OWL 推理器比 SWRL 推理器更多),并且您获得更强大的推理(SWRL 推理器仅将规则应用于已知个人)。

于 2011-07-06T18:21:54.173 回答