swrlx:makeOWLThing создает только одного человека

Используя вкладку Protege и SWRL, у меня есть онтология, упомянутая ниже. Он состоит из класса Test и класс Shadow, где Test имеет трех человек t1, t2, t3, Я пытался определить правило SWRL, которое создает человека Shadow класс для каждого существующего человека Testправило

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>))))
    )
    

2 ответа

Правила SWRL не могут создавать новых людей, насколько я понимаю, условия DL Safe.

В комментариях вы ссылались на статью, описывающую семантику этого расширения:

Одна из первых встроенных мною встроенных функций дала возможность создавать новых людей контролируемым образом. В [2] есть подробное объяснение, но в основном встроенная функция называется swrlx:makeOWLThing создает нового человека и связывает его с его первым несвязанным аргументом; новый индивидуум создается для каждого уникального шаблона оставшихся аргументов.

Теперь давайте посмотрим на ваше правило, как написано в вопросе:

Test (? X) ^ swrlx:makeOWLThing(? New,? X) -> Shadow(? New)

Если атомы обрабатываются слева направо, тогда? X должен быть связан, когда встречается makeOWLThing, но? 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 будет не привязан при создании нового человека, так что вы получите только один новый человек.

Другие вопросы по тегам