我试图找出一种实现SWRL规则的方法,该规则需要使用OR类型语句。下面是一个场景:本体有一个类"MachineTool“,它有一个对象属性"hasProcess”和许多类的进程。我们希望能够获得MachineTool的个人列表,该列表的hasProcess值为"EndMilling“或”钻孔“。
如果允许使用“或”语句,SWRL规则将类似于:
MachineTool(?mt) ^ hasProcess(?mt, ?p) ^ (EndMilling OR Drilling)(?p) -> MyMachineTools(?mt)
但这条规则不合法。有人知道一条规则(或一套规则)可以完成我们正在寻找的东西吗?我曾想过有一种选择是可以的(但还没有测试过,目前抗议者很奇怪):
EndMilling(?p) -> MyProcesses(?p)
Drilling(?p) -> MyProcesses(?p)
MachineTool(?mt) ^ hasProcess(?mt, ?p) ^ MyProcesses(?p) -> MyMachineTools(?mt)
我欢迎大家对这个问题的看法。
发布于 2011-07-06 18:21:54
如果使用OWL的ObjectUnionOf
表示,在SWRL规则中也是合法的。
我认为问题在于工具对SWRL表面语法的支持,就像代码示例中所提供的那样。Proge3.x在语法上不支持这个或-结构(至少上次我没有检查过),虽然Protege 4.1可以呈现它,但是它不能对它进行修复(刚刚用rc5检查过)。但是,如果您使用的是最近的OWL (v3.2.x),并且使用像XML这样的语法或函数式语法,那么一切都应该工作。(请注意,Protege 3.x和4.x使用非常不同的OWL,我建议您只使用Protege 4.x和OWL 3.x。)
如果无法使OR在SWRL中工作,则可以使用与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推理器更多OWL推理器),并且您得到了更强大的推理(SWRL推理器只对已知的个人应用该规则)。
https://stackoverflow.com/questions/6590406
复制相似问题