swrlx:makeOWLThing создает только одного человека
Используя вкладку Protege и SWRL, у меня есть онтология, упомянутая ниже. Он состоит из класса Test
и класс Shadow
, где Test
имеет трех человек t1, t2, t3
, Я пытался определить правило SWRL, которое создает человека Shadow
класс для каждого существующего человека Test
правило
Test(?x) ^ swrlx:makeOWLThing(?new, ?x) -> Shadow(?new)
ВОПРОСЫ:
- Только один человек
Shadow
по имениfred
создается вместо трех (соответствующихt1, t2, t3
). Как контролировать именование результирующего человека, который всегда называется
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 будет не привязан при создании нового человека, так что вы получите только один новый человек.