owl:maxCardinalityとowl:maxQualifiedCardinalityをどのように使い分けたらよいのかが分からなかったのがきっかけ.OWL2のQualified Cardinalityについて日本語で解説した資料が見当たらなかったので,自分で学習した結果をここにまとめる.間違って理解している箇所も多いかと思うので,その場合はぜひ指摘をいただきたい.
Unqualified CardinalityとQualified Cardinalityの違い
端的に言えば,記述回数制約の条件として値のクラスやデータレンジを限定したものがQualified,値のクラス等を限定しない記述回数制約がUnqualifiedである.OWL2でのCardinality制約は以下のように記述するが,第3引数のClassExpressionを指定したものがQualified,指定しないものがUnqualifiedである.
ObjectMaxCardinality := 'ObjectMaxCardinality' '(' nonNegativeInteger ObjectPropertyExpression [ ClassExpression ] ')'
例を挙げると,「研究室は,メンバーが6人以下である」という制約を書けるのがUnqualified,「研究室は,メンバーに1名以下の教授を含みつつ.合計で6人までである」という制約を書けるのがQualifiedである.
(Unqualified)Cardinality
OWL1から定義されている,プロパティの記述回数に関する制約を表現する機能がCardinalityである.例えば,「研究室の必要条件は,メンバーが最大6名であること」という制約は,OWLのCardinalityを用いることで
SubClassOf( _:Lab ObjectMaxCardinality( 6 _:hasMember ) )
と表現できる(参考:Object Property Cardinality Restrictions).これは,_:Labクラスのインスタンス1つにつき,_:hasMemberというプロパティとその値を6つまで記述できることを表している.(注:いずれか複数の値が同一人物を指していると見なすことで7つ以上記述することもできるのだが,話が複雑になるので,本稿ではそのような状況を想定しない)
上記の制約では記述回数の最大値を制限するためにObjectMaxCardinalityを用いており,他にも記述回数の最小値を制限するObjectMinCardinalityと,特定の記述回数であることを求めるObjectExactCardinalityを利用できる.
前述の制約表現はFunctional Style Syntaxと呼ばれる書き方であり,同等の制約をRDF Turtleで表現する場合は以下のようにする.
_:Lab rdf:type owl:Class .
_:Lab rdfs:subClassOf
[
rdf:type owl:Restriction ;
owl:maxCardinality "6"^^xsd:nonNegativeInteger ;
owl:onProperty _:hasMember
].
Functional Style SyntaxとRDF Turtleとの対応付けは,W3CのOWL 2 Web Ontology Language Mapping to RDF Graphsを見るとよい.
OWL2で後述するQualified Cardinalityが定義されたことにより,前述の形式で記述されたCardinality制約はUnqualified Cardinalityと呼ばれることがある.本稿でもUnqualified Cardinalityと呼ぶ.
ここまでObject Property(値がRDFで言うところのリソースとなるプロパティ)の記述回数制約のみを例に挙げているが,Data Property(値がRDFで言うところのリテラルとなるプロパティ)にも記述回数制約は設定できる(参考:Data Property Cardinality Restrictions ).この場合は,ObjectMaxCardinalityではなくDataMaxCardinalityなどの関数で表現する.たとえば,「人の必要条件はニックネームを最大2つ持つことである」という制約は以下のように表現できる.
SubClassOf( _:Person DataMaxCardinality( 2 _:nickname ) )
Qualified Cardinality
プロパティの記述回数の制約をより細かく指定したいことがある.例えば,「研究室の必要条件は,メンバーが最大6名であり,そのうち1名以下が教授であること」などの制約である.OWL2ではこのような制約を以下の2行で表現できる.
SubClassOf( _:Lab ObjectMaxCardinality( 6 _:hasMember ) )
SubClassOf( _:Lab ObjectMaxCardinality( 1 _:hasMember _:Professor) )
OWL2ではObject Cardinalityの第3引数にクラス表現(Class Expression)を指定することができる.この第3引数を指定したものがQualified Cardinality,指定しないものがUnqualified Cardinalityと呼ばれる.1行目はClass Expressionが無いのでUnqualified Cardinality,2行目は_:ProfessorというClass ExpressionがあるのでQualified Cardinalityである.
上記の制約では,「メンバーは6人以下である」という条件と「メンバーに含まれる_:Professorクラスのインスタンスは1人以下である」という条件の両方が,_:Labクラスのインスタンスとなる必要条件であると定義している.この制約の2行目にあるQualified Cardinalityは,あくまで _:hasMemberの値が_:Professorクラスのインスタンスである場合の記述回数上限であり,それ以外のクラスのインスタンスが値であった場合の上限は定めていない (この例では1行目のUnqualified Cardinalityで別途定めている).
上記の制約をRDFで表現すると以下のようになる.
_:Lab rdf:type owl:Class .
_:Lab rdfs:subClassOf
[
rdf:type owl:Restriction ;
owl:maxCardinality "6"^^xsd:nonNegativeInteger ;
owl:onProperty _:hasMember
],
[
rdf:type owl:Restriction ;
owl:maxQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
owl:onProperty _:hasMember ;
owl:onClass _:Professor
].
Unqualified Cardinalityとの違いは,回数をowl:maxQualifiedCardinalityで記述している点と,owl:onClassで値のクラスを条件として追加している点である.Data Propertyの場合は,データレンジを条件とするためにowl:onClassではなくowl:onDataRangeを用いる.
CardinalityとValues From
OWLでは,値のクラスを制限する方法としてAllValuesFromやSomeValuesFromという機能が用意されている.これらの機能をUnqualified Cardinalityと組み合わせることで「メンバーは1名以下かつメンバーは教授(=教授は1名以下)」という制約を以下のように記述できる.
SubClassOf( _:Lab ObjectMaxCardinality( 1 _:hasMember ) )
SubClassOf( _:Lab AllValuesFrom( _:hasMember _:Professor ) )
しかし,この制約に「メンバーは最大6名である」という条件を追加して「メンバーが最大6名であり,そのうち1名以下が教授である」とすることはできない.これは,Unqualified Cardinalityを使ったことで_:hasMemberの合計数が1以下に制限されてしまい,AllValuesFromを使ったことで_:hasMemerの値として_:Professorクラス以外のインスタンスを記述できなくなるためである.
Qualified CardinalityにおけるClassExpressionの役割
OWL2の新機能を解説したいくつかの日本語文書で,Qualified Cardinalityの第3引数であるClass Expression(RDFだとowl:onClass)の役割について私の理解とは異なる説明をしているように感じる.
例えば,RDF/OWLの概要とOSS実装,及び活用イメージについてのスライド12ページ目では,Qualified Cardinality(プロパティの条件付きカーディナリティ宣言)を「タイヤの数はバイクが2でクルマが4」という制約を記述するために用いるとしている.ただ,この制約は
SubClassOf( _:Bike ObjectExactCardinality( 2 _:hasTire ) )
SubClassOf( _:Bike AllValuesFrom( _:hasTire _:Tire ) )
SubClassOf( _:Car ObjectExactCardinality( 4 _:hasTire ) )
SubClassOf( _:Car AllValuesFrom( _:hasTire _:Tire ) )
と書けばよいと思われるので,Qualified Cardinalityを使う必要が無い.
Qualified Cardinalityは,F5: Property Qualified Cardinality Restrictionsに挙げられているAUTOMOTIVEの制約のサンプル
ObjectMaxCardinality( 5 :hasPart :Door )
ObjectExactCardinality( 2 :hasPart :RearDoor )
のように,同一のプロパティであるが,値のクラスによって記述回数の上限や下限を区別したいという場面で使うものだと思う. Qualified CardinalityのClass Expressionは,値のクラスによって記述回数の制約を区別するためのもの であり,記述の対象となる個体のクラス(この場合はバイクやクルマ)によって記述回数の制約を区別するためのものではない.
Qualified Cardinalityの紹介は,OWL2(OWL 2 Web Ontology Language)のご紹介のスライド10ページ目にもある.こちらは,少なくとも1匹の,という制約なのにObjectMaxCardinalityを使っている点が間違っていて,本来はObjectMinCardinalityを使うべきである.また,第3引数のClass Expressionを指定していないので,Qualified CardinalityではなくUnqualified Cardinalityの例になっている,と思う.
参考
OWL1のcardinalityとOWL2のcardinality,RDFでの表現については,それぞれ以下を参考にした.