使用Protege和SWRL选项卡,我有下文提到的本体。它由班级Test
和班级Shadow
组成,其中Test
有三个人t1, t2, t3
。我试图定义一个SWRL规则,为Shadow
的每个现有个体创建一个Test
类的个体,规则是
Test(?x) ^ swrlx:makeOWLThing(?new, ?x) -> Shadow(?new)
问题:
Shadow
的{{1}}个人,而不是三个人(对应fred
)。如何控制始终命名为t1, t2, t3
的结果个人的命名?
fred
答案 0 :(得分:0)
据我了解DL安全条件,SWRL规则无法创建新的个人。
答案 1 :(得分:0)
在评论中,您链接到an article,描述了该扩展的语义:
我实施的第一个内置插件之一提供了以受控方式创建新个人的能力。在[2]中有一个详细的解释,但基本上是一个名为swrlx的内置函数:makeOWLThing创建一个新的个体并将其绑定到它的第一个未绑定的参数;为剩余参数的每个唯一模式创建一个新的个体。
现在,让我们看一下你在问题中写的规则:
测试(?x)^ swrlx:makeOWLThing(?new,?x) - >影子(?新)
如果从左到右处理原子,那么遇到makeOWLThing时应绑定?x,但是?new不是。这意味着你应该得到一个绑定到变量new的新个体,并且对于?x的每个值,你应该得到一个不同的值new。这听起来像你想要的。但是,在您发布的代码中,我看到了:
DLSafeRule(
Annotation(<http://swrl.stanford.edu/ontologies/3.3/swrla.owl#isRuleEnabled> "true"^^xsd:boolean)
Annotation(rdfs:comment ""^^xsd:string)
Annotation(rdfs:label "S1"^^xsd:string)
Body(
BuiltInAtom(<http://swrl.stanford.edu/ontologies/built-ins/3.3/swrlx.owl#makeOWLThing>
Variable(<new>)
Variable(<x>))
ClassAtom(:Test Variable(<x>)))
Head(
ClassAtom(:Shadow Variable(<new>))))
)
我不确定,但如果从左到右处理, makeOWLThing(?new,?x)会出现 first ,在这种情况下?当创建新个体时,x将被解除绑定,因此您只能获得一个新个体。