我需要在 Protégé 中实现一个 OWL 本体,它包含两个类:s1
和s2
,它们都是System
类的实例。这两个类是由连接类连接起来的,连接类s1_s2
包含属性omega
。该属性必须根据以下法律取值:
欧米茄 = 1 * s1.complete
我如何在 Protégé 中实现它,这样我将来可以在 SWRL 规则中使用它?
通常,您首先要定义所需的类和属性:
此时,您可以添加一些公理来管理系统必须如何交互、属性如何工作等。例如,您可以在属性上声明域和范围。这是hasS2属性的域和范围:
您可能还想说每个InterSystem都只有一个关联S1和S2:
(在我使用的 Protégé 版本(不是最新版本)中,我必须 Window > Create New Tab 来创建Rules选项卡,然后 Window > Views > Ontology Views > Rules 将规则列表添加到界面。 )
此 OWL 本体的 RDF 表示的 Turtle 序列化(您可以保存并加载到 Protégé)是:
@prefix : <http://stackoverflow.com/q/21499126/1281433/systems#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix swrl: <http://www.w3.org/2003/11/swrl#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix swrlb: <http://www.w3.org/2003/11/swrlb#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
<urn:swrl#s1> a swrl:Variable .
:hasComplete a owl:DatatypeProperty .
[ a swrl:Imp ;
swrl:body [ a swrl:AtomList ;
rdf:first [ a swrl:ClassAtom ;
swrl:argument1 <urn:swrl#i> ;
swrl:classPredicate :InterSystem
] ;
rdf:rest [ a swrl:AtomList ;
rdf:first [ a swrl:ClassAtom ;
swrl:argument1 <urn:swrl#s1> ;
swrl:classPredicate :S1
] ;
rdf:rest [ a swrl:AtomList ;
rdf:first [ a swrl:IndividualPropertyAtom ;
swrl:argument1 <urn:swrl#i> ;
swrl:argument2 <urn:swrl#s1> ;
swrl:propertyPredicate :hasS1
] ;
rdf:rest [ a swrl:AtomList ;
rdf:first [ a swrl:DatavaluedPropertyAtom ;
swrl:argument1 <urn:swrl#s1> ;
swrl:argument2 <urn:swrl#complete> ;
swrl:propertyPredicate :hasComplete
] ;
rdf:rest [ a swrl:AtomList ;
rdf:first [ a swrl:BuiltinAtom ;
swrl:arguments [ a rdf:List ;
rdf:first <urn:swrl#omega> ;
rdf:rest [ a rdf:List ;
rdf:first 1 ;
rdf:rest ( <urn:swrl#complete> )
]
] ;
swrl:builtin swrlb:multiply
] ;
rdf:rest ()
]
]
]
]
] ;
swrl:head [ a swrl:AtomList ;
rdf:first [ a swrl:DatavaluedPropertyAtom ;
swrl:argument1 <urn:swrl#i> ;
swrl:argument2 <urn:swrl#omega> ;
swrl:propertyPredicate :hasOmega
] ;
rdf:rest ()
]
] .
:S2 a owl:Class ;
rdfs:subClassOf :System .
<urn:swrl#omega> a swrl:Variable .
:S1 a owl:Class ;
rdfs:subClassOf :System .
:InterSystem a owl:Class ;
rdfs:subClassOf [ a owl:Restriction ;
owl:onClass :S1 ;
owl:onProperty :hasS1 ;
owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
] ;
rdfs:subClassOf [ a owl:Restriction ;
owl:onClass :S2 ;
owl:onProperty :hasS2 ;
owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger
] .
<urn:swrl#complete> a swrl:Variable .
<http://stackoverflow.com/q/21499126/1281433/systems>
a owl:Ontology .
:hasS2 a owl:ObjectProperty .
:hasOmega a owl:DatatypeProperty .
:System a owl:Class .
:hasS1 a owl:ObjectProperty .
<urn:swrl#i> a swrl:Variable .
这是一个好的开始,但值得看看它是如何运作的。要查看可以应用规则的地方,我们需要一些实例数据和推理器。你提到你可以在 Protégé 中使用 Pellet,所以我们都准备好了。对于一些实例数据,让我们创建和InterSystem,它的S1,并分配S1的完整值。
您需要从 Reasoner 菜单中选择 Pellet reasoner,然后选择 Reasoner > Start Reasoner。此时,您可以对“hasOmega value 42”运行 DL 查询以确认个人具有所需的属性(确保选中右侧的“个人”复选框):
如果您导航到系统间个体,您可能不会看到推断的值。要显示它,请转到 Reasoner > Configure... 并检查 Data Property Assertions 选项:
之后,您可能需要重新启动推理器(推理器 > 无;推理器 > Pellet;推理器 > 启动推理器),但之后您将能够看到推断值: