ヒント: RDF/XMLでrdf:aboutとrdf:IDを効果的に使う

リソース指定の混乱を最小限に抑える

Comments

このヒントでは、2003年1月23日のRDF/XML Syntaxの仕様を取り上げます。RDF関連の最新の仕様については、W3CのRDF Primerをご覧ください(参考文献を参照)。RDF/XMLでは、文の主語をノード要素として編成し、その主語を設定するためにrdf:aboutrdf:ID などの属性を使用します。RDFの実際の主語URIをこれらの属性から生成する方法を定めた規則はありますが、注意しないと、解析結果が環境によって大きく異なる可能性もあります。このヒントでは、その種のエラーや混乱を最小限に抑えるための方法を示します。

基底URIの指定

rdf:ID は、基本的にリスト1 のような方法で使います。

リスト1. rdf:IDの簡単な使用例 (listing1.rdf)
<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
>
 <rdf:Description rdf:ID="local-record">
  <dc:title>Local Record</dc:title>
 </rdf:Description>
</rdf:RDF>

この場合、RDF/XMLの規則によれば、文の主語は、スコープ内の基底URI の末尾に、シャープ記号 (#) を先頭に付けたID名 (#local-resource)を付加するという形で生成されます。ところが、この基底URIの部分が混乱のもとになります。リスト1 では、スコープ内の基底URIが明示的に指定されていません。基本的には、解析対象ファイルの位置に基づいて、パーサーがそのURIを解決することになります。たとえば、リスト1がhttp://rdfhost/listing1.rdf というURIに置かれていれば、実際の主語URIはhttp://rdfhost/listing1.rdf#local-resource となる場合が多いですし、リスト1が/code/rdf/listing1.rdf というローカル・ファイル・システム・パスに置かれていれば、URIはfile:///code/rdf/listing1.rdf#local-resource と解決される場合が多いと言えます。ところが、もっと複雑な方法でURIを解決するパーサーもあります。RDF/XMLでは、解析対象のRDF文書の基底URIの解決方法が決まっていないのです。

パーサーの動作が合理的であれば、主語URIは解析対象ファイルの位置に基づいて生成されます。ということは、そのファイルで意図しているRDF文は、ファイルそのものの位置によって変わってしまうということです。ところが、ファイルに記述するリソースについては絶対URIを想定することが多いため、このように位置によってURIが変わってしまう方法は問題になるわけです。

1つの解決策は、常にrdf:about を使って絶対URIを書くようにするという方法です。この点については、後から詳しく取り上げます。もう1つの解決策は、XML Base を使うという方法です。このXML Baseは、XMLファイル内の要素として基底URIを指定するための仕様です。XMLファイル内の適切な場所にxml:base 属性を入れることによって、rdf:ID を解決するために使用する基底URIを指定できます。リスト2 はそのような書き方の一例です。

リスト2. XML Baseを利用したrdf:IDの使用例 (listing2.rdf)
<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xml:base="http://spam.com/eggs/listing.rdf"
>
 <rdf:Description rdf:ID="local-record">
  <dc:title>Local Record</dc:title>
 </rdf:Description>
</rdf:RDF>

xml:base 属性が入っていることに注目してください。ここでは最上位の要素にこの属性を追加しました。基本的には親要素の基底URIが子要素に継承されていくので、最上位要素にこの属性を指定すれば、ファイル全体の基底URIを指定したことになります。したがって、リスト2 については、それがhttp://rdfhost/listing.rdf などのURIに置かれていようと、ローカル・ファイル・システムに置かれていようと、rdf:Description の主語として、http://spam.com/eggs/listing.rdf#local-resource が必ず生成されることになります。

rdf:aboutの役割

RDFノード要素でrdf:ID の代わりにrdf:about を使った場合は、URI解決の方法が異なります。一番簡単なのは属性の値として絶対URIを指定した場合です。この場合は、そのURIがそのまま主語URIになります。したがって、リスト3 は、RDFモデルとしてはリスト2 と同じ意味になります。

リスト3. 絶対URIを指定したrdf:aboutの使用例 (listing3.rdf)
<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
>
 <rdf:Description
    rdf:about="http://spam.com/eggs/listing.rdf#local-record">
  <dc:title>Local Record</dc:title>
 </rdf:Description>
</rdf:RDF>

ところが、rdf:about に相対URIを指定する場合は、その相対URIが基底URIに基づいて解決されます。したがって、ファイルの位置に左右されずに正しい主語URIを生成するには、やはりxml:base を指定しなければなりません。リスト4 は、RDFモデルとしてはリスト2リスト3 と同じ意味になります。

リスト4. 相対URIを指定したrdf:aboutの使用例 (listing4.rdf)
<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xml:base="http://spam.com/eggs/"
>
 <rdf:Description rdf:about="listing.rdf#local-record">
  <dc:title>Local Record</dc:title>
 </rdf:Description>
</rdf:RDF>

結論

相対URIを指定した場合のrdf:about の動作は、rdf:resource などの類似な属性にもそのまま当てはまります。rdf:ID の動作は、rdf:bagID などの動作と同じです。RDF/XMLファイルのどの部分を書いているときでも、有効になっている基底URIのことを常に意識して、RDFモデルがどのように生成されるのかをしっかりと把握しておく必要があります。

rdf:IDrdf:about のどちらを選ぶかについては、こう考えたらよいでしょう。つまり、RDFファイルの位置から切り離してしまったらほとんど意味がないリソースを記述するときには、rdf:ID が便利です。その種のリソースとしては、ローカルの手近なレコードや、抽象オブジェクトや実社会オブジェクトのプロキシーなどが考えられます(ただし、RDFでその種のリソースを記述するときには、十分な注意が必要です。下手な使い方をすると、ばかばかしい混乱のもとになってしまうからです。私はコンピューターにとって意味のあるレコードを記述するときにだけRDFを使うようにしています)。一方、rdf:about は、一般によく知られたIDや位置を持ったリソースを記述するときに使います。


ダウンロード可能なリソース


関連トピック

  • RDFの入門資料については、「The Languages of the Semantic Web」を参照してください。
  • W3C RDFCoreワーキング・グループ は、最近活発に活動しています。最新の仕様の分かりやすい説明については、RDF Primer をご覧ください。それとは逆にRDF/XMLの難解な詳細を読みたい方は、RDF/XML Syntax仕様をチェックしてください。
  • XMLノードの基底URIとxml:base 属性の詳細については、XML Base をお読みください。
  • 私の 『XML的思索』 コラムもご覧ください。RDFや他のテクノロジーを詳しく説明しています。
  • このヒントで取り上げたすべてのサンプルは、4Suite プラットフォームのRDFコンポーネントでテストしました。
  • XMLに関する参考文献がdeveloperWorksXMLゾーン に多数あります。
  • IBM WebSphere Studio(日本語サイト) より、Javaと他の言語の両方で、XML開発を自動化するためのツール・スイートが提供されています。これは、WebSphere Application Server と密接に統合されたものですが、他のJ2EEサーバーでも使用することができます。
  • XMLおよびその関連テクノロジーのIBM Certified Developer になる方法をお調べください。
static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=XML
ArticleID=242469
ArticleTitle=ヒント: RDF/XMLでrdf:aboutとrdf:IDを効果的に使う
publish-date=02012003