3

オントロジーを検証し、何かが間違っている場合はエラーをスローしたいと考えています。

私がしなければならないほとんどの検証は次のようになります: 私はこのようなクラスを持っています:

   <owl:Class rdf:about="&schema;ExampleClass">
        <rdfs:subClassOf rdf:resource="&schema;SuperClass"/>
        <rdfs:subClassOf>
            <owl:Restriction>
                <owl:onProperty rdf:resource="&schema;myProperty"/>
                <owl:onClass rdf:resource="&schema;OtherClass"/>
                <owl:qualifiedCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:qualifiedCardinality>
            </owl:Restriction>
        </rdfs:subClassOf>
    </owl:Class>

(興味深い部分は 2 番目の subClassOf です。) Protege では、これは を意味しExampleClass is subClass of myProperty exactly 1 OtherClassます。

したがって、値を持つ myProperty が 1 つだけ存在することを検証したいと思います。タイプが OtherClass の個体です。

このようなルールを検証することは可能ですか? このモデリングを使用してすべてのクラスに対してこれを行うルールがあれば完璧です (また、少なくとも 1 つ、正確に 2 つ、...)

別の質問は次のとおりです。まさに私のためにそれを行っている、すぐに使える閉じた世界の推論者はいますか?

4

2 に答える 2

6

あなたの例は、閉ざされた世界の原則の利用に依存していません。の検証ルールの導入に依存しowl:qualifiedCardinalityます。

たとえば、次のサンプル入力ファイルを見てみましょう。

@prefix xsd:  <http://www.w3.org/2001/XMLSchema#>.
@prefix rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
@prefix owl:  <http://www.w3.org/2002/07/owl#>.
@prefix : <urn:x-so:ex#>.

:OtherClass a owl:Class .
:SuperClass a owl:Class .

:myProperty a rdf:Property
          ; rdfs:range  :OtherClass
          .

:ExampleClass rdfs:subClassOf :SuperClass
            ; rdfs:subClassOf [ a owl:Restriction
                              ; owl:onProperty :myProperty
                              ; owl:cardinality 1
#                             ; owl:onClass :OtherClass
#                             ; owl:qualifiedCardinality 1
                              ]
            .


:o0 a :OtherClass .
:o1 a :OtherClass .

:s0 rdf:type    :ExampleClass
  ; :myProperty :o0
  ; :myProperty :o1
  .

コメントアウトされた行と、その上に導入された公理に注意してください。このオントロジーは owl-1 に準拠しているため、検証規則があります。次のテストでは、検証エラーはありません。なぜですか? :o0 owl:sameAs :o1たとえば、矛盾しないと推測できるからです。

final Model baseModel = ModelFactory.createDefaultModel();
try( final InputStream in = this.getClass().getResourceAsStream("/so.ttl") ){
    baseModel.read(in, null, "TTL");
}
final OntModel model  = ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM_RULE_INF, baseModel);

assertTrue(model.contains(s0, myProperty, o0));
assertTrue(model.contains(s0, myProperty, o1));

final ValidityReport report = model.validate();
assertTrue( report.isValid() );

ただし、次の例では、 を導入:o0 owl:differentFrom :o1すると矛盾が生じることを示しています。

final Model baseModel = ModelFactory.createDefaultModel();
try( final InputStream in = this.getClass().getResourceAsStream("/so.ttl") ){
    baseModel.read(in, null, "TTL");
}
final OntModel model  = ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM_RULE_INF, baseModel);
model.add(o1, OWL.differentFrom, o0); // NOTE!!
assertTrue(model.contains(s0, myProperty, o0));
assertTrue(model.contains(s0, myProperty, o1));

final ValidityReport report = model.validate();
assertFalse( report.isValid() );

実証されたシナリオを考えると、次の解決策を提案します(難易度の高い順に):

ソリューション 1: OWL 1 制約を使用したオープンワールド

可能であれば、owl-1 制約の観点からオントロジーを表現すると、既存のルール セットを検証に利用できます。

解決策 2: OWL 2 の追加機能を備えたオープンワールド

これは簡単なことではありません。etc/owl-fb.rulesinを見てみるとjena-core、いくつかの一般的なフクロウ構造 (特にカーディナリティ) をサポートするには、ルール式を単純にするために Jena Builtin の開発が必要であることがわかります。それがあなたが行くつもりの方向である場合、私は組み込みに関する別の答えにリンクしました。

次の規則は、カーディナリティを記述するためにjena-coreのファイルから取得されます。etc/owl-fb.rulesこれらはカーディナリティ ルールの完全なセットではありません。

[restriction5: (?C owl:onProperty ?P), (?C owl:cardinality ?X)
  -> (?C owl:equivalentClass card(?P, ?X)),
     (?C rdfs:subClassOf min(?P, ?X)),
     (?C rdfs:subClassOf max(?P, ?X)) ]

[restriction4: (?C owl:onProperty ?P), (?C owl:maxCardinality ?X)
  -> (?C owl:equivalentClass max(?P, ?X)) ]

[validationMaxN: (?v rb:validation on()), (?C rdfs:subClassOf max(?P, ?N)) greaterThan(?N, 1) (?P rdf:type owl:DatatypeProperty) ->
    [max2b: (?X rb:violation error('too many values', 'Too many values on max-N property (prop, class)', ?P, ?C))
          <- (?X rdf:type ?C), countLiteralValues(?X, ?P, ?M), lessThan(?N, ?M)  ] ]

restriction5最小および最大カーディナリティの観点からカーディナリティを定義するだけです (この例ではファンクターです) min。は、違反を特定する方法を示す特定の規則 (N > 1 の場合) です。ビルトインに委任して、プロパティに存在するバインディングの数を識別します。maxvalidationMaxNCountLiteralValues

CountQualifiedValuesBuiltinを導入したい場合は、次のような一連のルールを定義して、新しい公理を導入できます。

[restriction4: (?C owl:onProperty ?P), (?C owl:maxQualifiedCardinality ?X), (?C owl:onClass ?Y)
  -> (?C owl:equivalentClass max(?P, ?X, ?Y)) ]

[validationMaxN: (?v rb:validation on()), (?C rdfs:subClassOf max(?P, ?N, ?Y)) greaterThan(?N, 1) (?P rdf:type owl:ObjectProperty) ->
    [max2b: (?X rb:violation error('too many values', 'Too many values on max-QN property (prop, class, qclass)', ?P, ?C, ?Y))
          <- (?X rdf:type ?C), countQualifiedValues(?X, ?P, ?Y, ?M), lessThan(?N, ?M)  ] ]

解決策 3: OWL 2 の追加によるクローズドワールド

これは、実際には解決策 2 とそれほど違いはありません。ただし、 OWL 構造の代替セマンティクスを定義しようとすることになりますが、これは重要な問題です。etc/owl-fb.rules特定の閉じた世界の仮定を捉える検証のためのいくつかのルールを導入できます (例を取得するには、 を読んでください)。の場合にのみ動作するように制限することを強制すると(?v rb:validation on())、検証を実行するときに閉じた世界のみを想定していることを確認できます。

サイドディスカッション

以下は、フクロウ 1 で表現されたカーディナリティ制限の例です。これは、上記の入力ファイルのものと同じです。これはTURTLE構文で表現されRDF/XML、他の有効なRDFシリアル化に変換するのは簡単です。

:ExampleClass rdfs:subClassOf :SuperClass
            ; rdfs:subClassOf [ a owl:Restriction
                              ; owl:onProperty :myProperty
                              ; owl:cardinality 1
                              ]
            .

この 1 組の制限は意味的に と完全に同等ではありませんowl:qualifiedCardinalityが、ドメイン モデルを変更できる場合は、多くの場合回避できます。

たとえば、 のowl:qualifiedCardinalityようなことを言うのは素晴らしいことです:People :haveBodyPart exactly 2 :Eyes。OWL 1 の回避策は、たとえば、 を作成してから(修飾されたカーディナリティ制限なしで):haveEye rdfs:subPropertyOf :haveBodyPart言うことです。:People :haveEye exactly 2

于 2014-08-21T15:22:20.213 に答える