このブログでよく、
参考:
- Named graph # Named graphs and quads Named graph の graph name を context として RDF triple に加えることで、quad としてモデル化する
のように、参考文献をコメントと共に表示することがある。
RDF でもよく関係に注釈をつけたくなることがあるが、subject の方の rdfs:comment
で済ませてしまうのが実情。1 subject あたりの predicate が少ない場合や、知識が比較的 static で関係に関する議論によって object が修正されたりすることを想定していない場合には、この rdfs:comment
運用で良いのだけれど、個々の関係について議論するために注釈したいとなると、正確にはどうすればよいのか。
公式の答え
OWL2 では AnnotationAssertion (従来の rdfs:label
や rdfs:comment
)や Annotation が論理的に定式化された。
OWL 1 allowed extralogical annotations, such as a label or a comment, to be given for each ontology entity, but did not allow annotations of axioms, e.g., giving information about who asserted an axiom or when. OWL 2 allows for annotatins on ontologies, entities, anonymous individuals, axioms, and annotations themselves.
from OWL 2 Web Ontology Language New Features and Rationale (Second Edition)
挙げられている例はHCLC(Health Care and Life Sciences)分野のもので、関数記法によって
SubClassOf( Annotation( rdfs:comment "Middle lobes of lungs are necessarily right lobes since left lungs do not have middle lobe.") :MiddleLobe :RightLobe )
と表現され、このセマンティクスは :MiddleLobe
は :RightLobe
に対して SubClassOf
関係にあるのだが、その関係の注釈として、rdfs:comment
で "Middle lobes of lungs are necessarily right lobes since left lungs do not have middle lobe."
が書かれている。訳すと、「中肺葉は必然的に右肺のものになる。だって、左肺には中肺葉がないから」(註: 左肺は上肺葉・下肺葉のみに分かれる)というわけ。
しかし、関数記法では分かったものの turtle とかで書ける気がしないぞ?と思って OWL 2 Web Ontology Language Primerの方の例を見てみると、恐ろしいことが書いてある。
SubClassOf( Annotation( rdfs:label "States that every man is a person." ) :Man :Person )
という関数記法を Turtle 化すると
:Man rdfs:subClassOf :Person . [] rdf:type owl:Axiom ; owl:subject :Man ; owl:predicate rdfs:subClassOf ; owl:object :Person ; rdfs:label "States that every man is a person."^^xsd:string .
だというのだ!勝手にReificationしちゃってる。
使用と言及をごっちゃにしているように見えるのも気になる(使用と言及と言われてピンとこない人はカルナップの『構文論』(1)/言葉の「使用」と「言及」 | TETRA'S MATHとか参考にどうぞ)。でもそこは、このブランクノードに URI が与えられていないことを以って区別しているのかもしれません。つまり、スコーレム化の手続きがその2つを混同して論理的に相同とみなす手続きだと解釈すれば、ブランクノードである限り使用を言及と同様の構造で書いただけと言い張れなくもないから(でもRDF 1.1 Semanticsの D.1 Reification 見てると、Reification 自体がセマンティクス変えてるって言ってるし、その変え方がまさに使用と言及の問題なので、この言い訳は通用しなさそう)。
Reification によって記述が複雑になるのはいただけないけれど、とりあえず、公式の答えはこの通りです。
rdfs:comment
で済ませてしまうのも悪くない
例えば、肺の例で、
SubClassOf( Annotation( rdfs:comment "Middle lobes of lungs are necessarily right lobes since left lungs do not have middle lobe.") :MiddleLobe :RightLobe )
を
SubClassOf( :MiddleLobe :RightLobe ) rdfs:comment( :MiddleLobe "Middle lobes of lungs are necessarily right lobes since left lungs do not have middle lobe.")
としても理解可能ですよね。これが冒頭で述べた rdfs:comment
で済ませてしまう例です。
ところで、
SubClassOf( :MiddleLobe :RightLobe ) rdfs:comment( :RightLobe "Middle lobes of lungs are necessarily right lobes since left lungs do not have middle lobe.")
はどうでしょう。rdfs:comment
の主語を変えただけです。
比較的細かい単位で graph name が付随していると考えれば、中肺葉に関する文書で、右肺についてこういうコメントが書かれていると理解できないでしょうか?
その部分だけ TriG で書けば、
:MiddleLobe{ :RightLobe rdfs:comment "Middle lobes of lungs are necessarily right lobes since left lungs do not have middle lobe.". }
rdf:Description
だと気持ち悪いですが、rdfs:comment
だったらこういう形で注釈が散在してても別に良い気がします。
論理的には個々の関係のアノテーション記述と、主語や目的語のアノテーション記述をセマンティックスとして混同して扱えるかという問題が生じますが、この記法で行くと決めれば、コメント文も相応に書けるでしょうから(例えば 男-人間 の例では「"States that every man is a person."」というラベルの代わりに「人間の雄は特別に男と呼ばれるので、男は必ず人間。」のようなコメントになるだろう)問題ないのではないでしょうか。
目的語に書きつつ、文脈で区別することで、ほぼ関係個別の注釈として機能するのではないかという提案でした。「議論によって object が修正されたりする」場合も、その目的語についての疑義をとりあえずコメントに入れておけばいいものね。
補足
自然言語文のアノテーションとして RDF を使っている場合などは、公式の通り Reification が必要だし、個々の Statement にブランクノードではなく URI が付されるべきだろう。上の話はあくまで、rdfs:comment
を想定していて、男-人間 の例は rdfs:label
なのでそもそも グラフを主語とする以外に手段がない(それでも、本文まで reification してしまうよりは Named graph のアプローチを使うべきだとは思うが…)。