swrlx:makeOWLThing只创建一个个体



使用Protege和SWRL标签,我得到了下面提到的本体。它由Test类和Shadow类组成,其中Test有三个个体t1, t2, t3。我试图定义一个SWRL规则,为Test的每个现有个体创建Shadow类的个体,规则是

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

问题:

  1. 只创建一个Shadow个体,命名为fred,而不是三个(对应于t1, t2, t3)。
  2. 如何控制生成的个体总是命名为fred ?

    Prefix(:=<http://www.semanticweb.org/hilal/ontologies/2016/5/untitled-    ontology-58#>)
    Prefix(owl:=<http://www.w3.org/2002/07/owl#>)
    Prefix(rdf:=<http://www.w3.org/1999/02/22-rdf-syntax-ns#>)
    Prefix(xml:=<http://www.w3.org/XML/1998/namespace>)
    Prefix(xsd:=<http://www.w3.org/2001/XMLSchema#>)
    Prefix(rdfs:=<http://www.w3.org/2000/01/rdf-schema#>)                
    Ontology(<http://www.semanticweb.org/hilal/ontologies/2016/5/untitled- ontology-58>
    Declaration(Class(:Shadow))
    Declaration(Class(:Test))
    Declaration(NamedIndividual(:t1))
    Declaration(NamedIndividual(:t2))
    Declaration(NamedIndividual(:t3))
    Declaration(AnnotationProperty(<http://swrl.stanford.edu/ontologies/3.3/swrla.owl#isRuleEnabled>))
    
    ############################
    #   Named Individuals
    ############################
    # Individual: :t1 (:t1)
    ClassAssertion(:Test :t1)
    # Individual: :t2 (:t2)
    ClassAssertion(:Test :t2)
    # Individual: :t3 (:t3)
    ClassAssertion(:Test :t3)
    
    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>))))
    )
    

SWRL规则不能创建新的个体,据我了解DL Safe条件

在评论中,您链接到一篇描述该扩展语义的文章:

我实现的第一个内置组件之一提供了以受控方式创建新个体的能力。[2]中有详细的解释,但基本上是内置的swrlx:makeOWLThing创建了一个新的个体,并将其绑定到它的第一个未绑定参数;为剩余参数的每个唯一模式创建一个新的个体。

现在,让我们看看你的规则写在问题中:

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

如果原子从左到右处理,那么当遇到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)首先出现,在这种情况下,当创建新个体时?x将被取消绑定,因此您只会得到一个新个体。

相关内容

  • 没有找到相关文章

最新更新