我正在尝试找出一种实现 SWRL 规则的方法,该规则需要使用 OR 类型语句。场景如下:本体有一个类“MachineTool”,它有一个对象属性“hasProcess”和许多进程类。我们希望能够获得 hasProcess 值为“EndMilling”或“Drilling”的 MachineTool 个体的列表。
如果允许使用“or”语句,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)
我欢迎对此问题的所有想法。
最佳答案
或者如果使用 OWL 的 ObjectUnionOf
表达,则在 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 中陈述所有内容(如果可能)有一些好处,例如您将获得更好的工具支持(OWL 推理器比 SWRL 推理器更多),并且您将获得更强大的推理(SWRL 推理器仅将规则应用于已知个体)。
关于semantic-web - 使用 OR 语句的 SWRL 规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6590406/