使用Protege和SWRL标签,我得到了下面提到的本体。它由Test
类和Shadow
类组成,其中Test
有三个个体t1, t2, t3
。我试图定义一个SWRL规则,为Test
的每个现有个体创建Shadow
类的个体,规则是
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>)))) )
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将被取消绑定,因此您只会得到一个新个体。