swrlx:makeOWLThing只创建一个人

时间:2016-06-24 15:23:42

标签: owl protege swrl

使用Protege和SWRL选项卡,我有下文提到的本体。它由班级Test和班级Shadow组成,其中Test有三个人t1, t2, t3。我试图定义一个SWRL规则,为Shadow的每个现有个体创建一个Test类的个体,规则是

Test(?x) ^ swrlx:makeOWLThing(?new, ?x) -> Shadow(?new)

问题:

  1. 只创建了一个名为Shadow的{​​{1}}个人,而不是三个人(对应fred)。
  2. 如何控制始终命名为t1, t2, t3的结果个人的命名?

    fred

2 个答案:

答案 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将被解除绑定,因此您只能获得一个新个体。