3

我需要在 Protégé 中实现一个 OWL 本体,它包含两个类:s1s2,它们都是System类的实例。这两个类是由连接类连接起来的,连接类s1_s2包含属性omega。该属性必须根据以下法律取值:

欧米茄 = 1 * s1.complete

我如何在 Protégé 中实现它,这样我将来可以在 SWRL 规则中使用它?

具有类之间连接的类图片段

4

1 回答 1

9

通常,您首先要定义所需的类和属性:

班级

对象属性

数据类型属性

此时,您可以添加一些公理来管理系统必须如何交互、属性如何工作等。例如,您可以在属性上声明域和范围。这是hasS2属性的域和范围:

hasS2 域和范围

您可能还想说每个InterSystem都只有一个关联S1S2

hasS1 正好 1 S1 …"></p> <p>要加入数学约束,您实际上需要 SWRL;您将无法使用其他类型的 OWL 公理强制执行约束。您需要的规则want 大致如下。如果您在谓词上声明域和范围,那么您将不需要出现在此规则中的所有类型谓词,因为它们可以从属性使用中推断出来。</p> < blockquote> <p>S1(?s1) ∧ InterSystem(?i) ∧ hasS1(?i,?s1) ∧ hasComplete(?s1,?complete) multiply(?omega,1,?complete) → hasOmega(?i, ?omega)</p> </blockquote> <p>这里的乘法实际上似乎是多余的,因为你要乘以 1,所以 omega = alpha,在这种情况下,该规则的头部可能只是 <em>hasOmega( ?i,?alpha)</em>。在 Protégé 中,规则如下所示:</p> <p><img src=

(在我使用的 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的完整值。

系统间

s1

您需要从 Reasoner 菜单中选择 Pellet reasoner,然后选择 Reasoner > Start Reasoner。此时,您可以对“hasOmega value 42”运行 DL 查询以确认个人具有所需的属性(确保选中右侧的“个人”复选框):

在此处输入图像描述

如果您导航到系统间个体,您可能不会看到推断的值。要显示它,请转到 Reasoner > Configure... 并检查 Data Property Assertions 选项:

在此处输入图像描述

之后,您可能需要重新启动推理器(推理器 > 无;推理器 > Pellet;推理器 > 启动推理器),但之后您将能够看到推断值:

推断数据属性断言

于 2014-02-01T14:57:51.763 回答