如果使用 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 推理器仅将规则应用于已知个人)。