あなたの例は、閉ざされた世界の原則の利用に依存していません。の検証ルールの導入に依存し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.rules
inを見てみると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 の場合) です。ビルトインに委任して、プロパティに存在するバインディングの数を識別します。max
validationMaxN
CountLiteralValues
CountQualifiedValues
Builtinを導入したい場合は、次のような一連のルールを定義して、新しい公理を導入できます。
[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