【注意】 このドキュメントは、W3CのLinked Data Platform Best Practices and Guidelines W3C Working Group Note 28 August 2014の和訳です。
このドキュメントの正式版はW3Cのサイト上にある英語版であり、このドキュメントには翻訳に起因する誤りがありえます。誤訳、誤植などのご指摘は、訳者までお願い致します。
First Update: 2014年9月8日
Copyright © 2014 W3C® (MIT, ERCIM, Keio, Beihang), All Rights Reserved. W3C liability, trademark and document use rules apply.
このドキュメントは、リンクト・データ・プラットフォーム[LDP]のサーバーとクライアントを実装するためのベスト・プラクティスとガイドラインを提供します。
この項は、このドキュメントの公開時のステータスについて記述しています。他のドキュメントがこのドキュメントに取って代わることがありえます。現行のW3Cの刊行物およびこの技術報告の最新の改訂版のリストは、http://www.w3.org/TR/のW3C技術報告インデックスにあります。
このドキュメントは、リンクト・データ・プラットフォーム・ワーキンググループによってワーキンググループ・ノートとして発表されました。このドキュメントに関してコメントを行いたい場合には、public-ldp@w3.org(購読、アーカイブ)にお送りください。どのようなコメントでも歓迎します。
ワーキンググループ・ノートとしての公開は、W3Cメンバーによる承認を意味するものではありません。これは草案ドキュメントであるため、他のドキュメントによって、随時更新されたり、置き換えられたり、廃止されることもありえます。このドキュメントを「作業中」以外のものとして引用することは適当ではありません。
このドキュメントは、2004年2月5日のW3C特許方針の下で活動しているグループによって作成されました。W3Cは、このグループの成果物に関連するあらゆる特許の開示の公開リストを維持し、このページには特許の開示に関する指示も含まれています。不可欠な請求権(Essential Claim(s))を含んでいると思われる特許に関して実際に知っている人は、W3C特許方針の6項に従って情報を開示しなければなりません。
リンクト・データ・プラットフォーム仕様の執筆中に、著者と貢献者は、共通する慣習や、得られた貴重な教訓を共有しなければならないと感じました。しかし、同時に、不必要な制限を課したり、形式的な仕様を不必要に冗長にしたくないと考えました。したがって、このドキュメントは、LDP入門[LDP-PRIMER]とともに、補足的なコンテキストを提供するために開発されました。これは、この著者と貢献者のプロフェッショナルな経験、関連技術の豊富な歴史に関する調査、一般的なコミュニティーからの継続的なフィードバックを用いて、システムの実装者が、共通の落とし穴を回避し、質を改善し、他のリンクト・データ・システムとの相互運用性を向上できるように支援することを目指します。
このドキュメントの目的に合わせて、「ベスト・プラクティス」という用語と「ガイドライン」という用語の、小さいながらも重要な違いを明確にすることは有用です。このドキュメントでは、これらの用語を次の通り定義し区別します。
このドキュメントで用いている用語およびリンクト・データの知識の範囲に関する様々な用語の定義に関しては、リンクト・データ・プラットフォーム1.0[LDP]の用語の項およびリンクト・データ用語集[LD-GLOSSARY]を参照してください。
実装者は、少なくともこのドキュメントで引用している参考情報の参考文献(特に次のもの)に関する一般的な知識を有しているべきです。
URIは資源を一意に識別するために用い、URLはウェブ上の資源の位置を示すために用います。つまり、URLは実際の資源に対して解決され、それをホストから検索できると予想されます。他方で、URIはURLでもありえますが、そうでなければならないわけではなく、検索可能な表現を持たないものを参照することもできます。
リンクト・データの背後にある基本的な考えの1つは、HTTP URIで参照される事物は実際に検索(「逆参照」)できるというものです。この重要な原理は、リンク用データ[LD-DI]の「4原則」の2番目の法則としてTim Berners-Leeが最初に概要を示しました。したがって、述語URIが資源を検索可能な表現で識別することが理想的です。LDPサーバーは、可能なときには、少なくともこの述語の[RDF-SCHEMA]表現を提供すべきです。
もちろん、公表されているオープンな語彙のプロパティーを再使用することも一般的な慣習です。このケースでは、実装者は、URIの逆参照を試みる際に、結果をコントロールできません。そのため、自身の語彙をデータのリンクに役立てたいと考える公開者は、その語彙が規定するプロパティーを検索可能な表現で提供するよう努めるべきです。その結果、リンク用データに対する語彙使用の有効性を判断するためのベンチマークとして実装者がこの慣習を用いることも期待できます。
LDPが提供する相互作用機能の使用は必須ではありませんが、LDPRの型(クラス)を知っていることはとても有用な場合が多いです。さらに、最も大きな文脈でデータをより役立つようにするためには、[RDF-SCHEMA]で定義されているrdf:type
という述語を用いて、型を明示的に定義すべきです。
これにより、クライアントは、追加処理を行なったり、HTTP要求を追加する必要なく、資源の型を容易に決定できます。例えば、推論をサポートしていないために型の推論を行えないクライアントにとって、この明示的な宣言は有用です。
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>. @prefix contact: <http://www.w3.org/2000/10/swap/pim/contact#>. <http://www.w3.org/People/EM/contact#me> a contact:Person; contact:fullName "Eric Miller"; contact:mailbox <mailto:em@w3.org>; contact:personalTitle "Dr.".
Turtleトリプルの述語の位置にある「a」というトークンは、http://www.w3.org/1999/02/22-rdf-syntax-ns#typeというIRIを表します。したがって、上記の例では、a contact:Person
はrdf:type contact:Person
や、<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> contact:Person
という完全修飾形式と同じです。
相対URIは、従来のウェブ・システムにおいて相対URL[RFC3986]が有用であったのとほぼ同じく、リンクト・データ・プラットフォームでも有用です。リンクト・データURIで参照する事物は、検索可能な表現[LD-DI]を提供すべきであるため、リンクト・データのURIも通常はURLです。つまり、識別するだけではなく、位置を示します。そのため、相対URLの実用的な価値はここにも当てはまります(特に、LDPコンテナ・モデルでは階層表現が奨励されるため)。
したがって、可能かつ適切な場合には、実装者は、LDPの相対URIの機能を、従来の相対URLのものに合わせるべきです。それによって、開発者にとって親しみやすいという快適性や利便性のみでなく、同じ利点の多くを得ることができます。
多くの場合、これにより、人間がコードとRDFを読むことが容易になるため、開発に役立ちます。さらに、これは、ペイロードの大きさも縮小できます。そして、それにより、エンドユーザに対する応答時間を改善しつつ、サーバーのネットワーク・トラフィックとストレスを縮小できます。
@prefix dcterms: <http://purl.org/dc/terms/>. @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>. @prefix ldp: <http://www.w3.org/ns/ldp#>. <http://example.org/container1/> a a ldp:Container, ldp:BasicContainer; dcterms:title "A very simple container"; ldp:contains <http://example.org/container1/member1>, <http://example.org/container1/member2>, <http://example.org/container1/member3>.
@prefix dcterms: <http://purl.org/dc/terms/>. @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>. @prefix ldp: <http://www.w3.org/ns/ldp#>. <> a a ldp:Container, ldp:BasicContainer; dcterms:title "A very simple container"; ldp:contains <member1>, <member2>, <member3> .
/people/
に対するPOSTにより、/people/1
という資源が作成されるかもしれません。LDPコンテナは、そのURIが同じモデルの恩恵を受けることができるようなコレクションで、これは、一部の実装では実際に極めて重要でありえます。相対URI内のドット・セグメント(例えば、../
)のセマンティクスは、他の仕様や過去の一般的な使い方によって暗示されているかもしれませんが、LDPの場合には、さらに考慮が必要です。
LDPの仕様では、次のとおりに記述されています。
LDPサーバーは、[RFC3987]の相対URI解決に対するデフォルトの基底URIを、資源が既に存在する場合にはHTTPリクエストURIとなるようにしなければならず、リクエストによって新しい資源が作成される場合には作成された資源のURIに割り当てなければなりません(MUST)。この定義に基づくと、POST中に
../
やその他の空でない相対URI構成子を用いると、クライアントが予測できないような方法で、ポストされたコンテンツが資源を参照するようになります。したがって、実装および(または)展開に何が期待されるのかをクライアントが明確に分かっていない場合には、ドット・セグメントは避けるべきです。
階層的URIは、相対URIが使用可能となるため、コンテナに適しています。さらに、論理上子が親に属する親子関係を表すためにモデル化された資源との相互作用が容易になります。
そのようなモデルの1つの例は、OSLC(Open Service for Lifecycle Collaboration)コミュニティーが定義している語彙に含まれているoslc_cm:attachment
のケースに見ることができます。OSLCは、LDPと一致する仕様と語彙を定義しています。問題やバグの追跡システムなどのOSLCに準拠した変更管理システムの資源には、oslc_cm:attachment
コンテナで表現される付属物が含まれているかもしれません。このコンテナのURIは、次のように表されるかもしれません。
http://example.org/bugs/2314/attachments/
このURIから、付属物が含まれている親資源のURIを容易に見つけられます。他の兄弟資源用の基本コンテナは、上の階層に移動することで見つけられますが、そのことはURIで暗示されています。メタデータやバイナリ―のコンテンツは、次のようなURIを用いて、階層を下ると取得できるかもしれません。
http://example.org/bugs/2314/attachments/1
相対URIが使用可なことに加え、階層的URIは、基礎となるグラフの実際の構造を表すため、ユーザが資源を用いた相互作用をより容易に行えるようになります。ソフトウェア・エージェント(ユーザの代わりに動作するコード[WEBARCH])は、URIの構造を利用する前に、実施時の過去の問題を考慮し、注意を払わなければなりません([WEBARCH], [metaDataInURI])。
階層的URLでコンテナ・メンバーシップを表す場合、コンテナのURIにトレイリング・スラッシュ(trailing slash)を含むことで、相対URIの使用がより簡単になります。例えば、次のコンテナURIについて考えてみましょう。
http://example.org/container1
この代わりに、次のURIを用いるほうが良いでしょう。
http://example.org/container1/
これの利点を説明するために、絶対URIを用いた次のコンテナから始めてみましょう。
@prefix dcterms: <http://purl.org/dc/terms/>. @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>. @prefix ldp: <http://www.w3.org/ns/ldp#>. <http://example.org/container1> a a ldp:Container, ldp:BasicContainer; dcterms:title "A very simple container"; ldp:contains <http://example.org/container1/member1>, <http://example.org/container1/member2>, <http://example.org/container1/member3>.
ここで、相対URIを用いて同じ資源を表したいとします。コンテナのURIにトレイリング・スラッシュが含まれていれば、次に示すとおり、非常に洗練された表現となります。
@prefix dcterms: <http://purl.org/dc/terms/>. @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>. @prefix ldp: <http://www.w3.org/ns/ldp#>. <> a a ldp:Container, ldp:BasicContainer; dcterms:title "A very simple container"; ldp:contains <member1>, <member2>, <member3> .
しかし、トレイリング・スラッシュを省略したと仮定した場合、HTTP GETが行われると、コンテナは上で示した表現を返します。これは、下記と同等のグラフを作成できるでしょう。
@prefix dcterms: <http://purl.org/dc/terms/>. @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>. @prefix ldp: <http://www.w3.org/ns/ldp#>. <http://example.org/container1> a a ldp:Container, ldp:BasicContainer; dcterms:title "A very simple container"; ldp:contains <http://example.org/member1>, <http://example.org/member2>, <http://example.org/member3>.
これは意図したものではありません。メンバーのURLには、container
パスのセグメントが欠けています。返されたドキュメントは、正確であるために、冗長にならざるをえないでしょう。
@prefix dcterms: <http://purl.org/dc/terms/>. @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>. @prefix ldp: <http://www.w3.org/ns/ldp#>. <> a a ldp:Container, ldp:BasicContainer; dcterms:title "A very simple container"; ldp:contains <container1/member1>, <container1/member2>, <container1/member3> .
したがって、明らかに、よりよい解決策は、コンテナURIを確実にトレイリング・スラッシュで終了することです。
資源のURIの末尾にフラグメントを置くことができます。フラグメント要素は、ハッシュ記号(#
)で始まるため、残りのURIと区切られます。そのため、空でないフラグメントを持つURIは、しばしばハッシュURIと呼ばれます。ハッシュURIは従属または関連する資源を識別します[RFC3986]。
例えば、http://www.example.org/products#item10245
というURIについて考えてみましょう。URIのフラグメントではない部分は、ハッシュ記号より前のhttp://www.example.org/products
の部分で、フラグメント識別子は、その後のitem10245
の部分です。
リンクト・データ・プラットフォーム資源をRDFで表す場合、フラグメントは、それを記述したドキュメント上で相対URIとして表すことができるため、有用です。これは特に、複数のLDPRの表現が1つのドキュメント内に含まれているような記述に便利です。
まずはじめに、これは、簡潔さという利便性と効率性を提供します。例えば、foo、bar、bazという資源が同じドキュメントに含まれているとします。1つのドキュメントですべての記述を提供することが認められているため、フラグメント識別子(<#foo>、<#bar>および<#baz>)を用いて、ドキュメント内で相対URIを作成できます。[LDP]では、デフォルトの基底URIがドキュメントのURI(http://www.example.org/products
)であることが保証されているため、個々の絶対URIは、基底URIにハッシュ記号とフラグメント識別子を加えたものです。
次に、これは、他のアプローチに内在する複雑さを回避するために役立ちます。3つの独立した逆参照可能なURIを用いて同じ結果を得るためには、恐らく303のリダイレクト設定も組み込んで、複数のドキュメントを作成しなければならないため、より複雑でありえます。
次のもドキュメントも参照してください。
セマンティック・ウェブのためのクールなURI(Cool URIs for the Semantic Web)
ウェブ・アーキテクチャの原理、URI参照: URIのフラグメント識別子(Axioms of Web Architecture, URI References: Fragment Identifiers on URIs)
http://www.w3.org/DesignIssues/Fragment.html
HTTP URIの逆参照(Dereferencing HTTP URIs)
http://www.w3.org/2001/tag/doc/httpRange-14/2007-05-31/HttpRange-14
LDPRの表現には、次の標準的なデータ型のみを使用すべきです。RDF自身にはリテラルのプロパティー値に用いるデータ型は定義されていません。したがって、[XMLSCHEMA11-2]と[RDF-PRIMER11]に基づく次の標準的なデータ型を用いるべきです。
URI | 説明 |
---|---|
http://www.w3.org/2001/XMLSchema#boolean | XSD Booleanで規定されているブール値型 |
http://www.w3.org/2001/XMLSchema#date | XSD dateで規定されている日付型 |
http://www.w3.org/2001/XMLSchema#dateTime | XSD dateTimeで規定されている日時型 |
http://www.w3.org/2001/XMLSchema#decimal | XSD Decimalで規定されている10進数型 |
http://www.w3.org/2001/XMLSchema#double | XSD Doubleで規定されている倍精度浮動小数点数型 |
http://www.w3.org/2001/XMLSchema#float | XSD Floatで規定されている浮動小数点数型 |
http://www.w3.org/2001/XMLSchema#hexBinary | XSD hexBinaryで規定されている任意の16進エンコードされたバイナリ・データ |
http://www.w3.org/2001/XMLSchema#integer | XSD Integerで規定されている整数型 |
http://www.w3.org/2001/XMLSchema#string | XSD Stringで規定されている文字列型 |
http://www.w3.org/2001/XMLSchema#base64Binary | XSD Base64Binaryで規定されているバイナリ型 |
http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral | RDFで規定されているリテラルXML値 |
この項では、RDF語彙と意味が一致する述語を資源が用いる必要のある場合に、リンクト・データ・プラットフォーム資源で必ず使用すべきいくつかの有名なRDF語彙について要約します。例えば、資源に内容記述(description)があり、その内容記述のアプリケーションのセメンティクスがdcterms:description
と互換性がある場合には、dcterms:description
を使用すべきです。必要であれば、追加のアプリケーション固有の述語を使用できます。定義域の仕様では、特定の資源の型に対しこれらのプロパティーのうちの1つ以上が必要でありえます。下記表の値域の列は、プロパティーに対する定義済みのrdfs:range
を識別します。
ダブリン・コアのURIから: http://purl.org/dc/terms/
プロパティー | 値域/データ型 | 解説 |
---|---|---|
dcterms:contributor | dcterms:Agent | |
dcterms:creator | dcterms:Agent | |
dcterms:created | xsd:dateTime | |
dcterms:description | rdf:XMLLiteral | XHTMLフォーマットのリッチ・テキストで表される、資源に関する説明文。XHTML要素の内部で有効かつ適切なコンテンツのみが含まれるべきです。 |
dcterms:identifier | rdfs:Literal | |
dcterms:modified | xsd:dateTime | |
dcterms:relation | rdfs:Resource | 関連する資源のHTTP URI。これは他に何を使用すべきか分からない場合に使用する述語です。どんな種類の関係かがより明確に分かっているときには、より特定的な述語を用いてください。 |
dcterms:subject | rdfs:Resource | |
dcterms:title | rdf:XMLLiteral | 資源に与えられた名前。XHTMLフォーマットのリッチ・テキストで表されます。 XHTML要素の内部で有効なコンテンツが含まれるべきです。 |
dcterms:type
という述語は、使用すべきではありません、その代りに、rdf:type
を用いましょう。[DC-RDF].
RDFのURIから: http://www.w3.org/1999/02/22-rdf-syntax-ns#
プロパティー | 値域/データ型 | 解説 |
---|---|---|
rdf:type | rdfs:Class | 資源の型(複数も可) |
RDFスキーマのURIから: http://www.w3.org/2000/01/rdf-schema#
プロパティー | 値域/データ型 | 解説 |
---|---|---|
rdfs:member | rdfs:Resource | |
rdfs:label | rdfs:Literal | 語彙の用語名を定義するために、語彙ドキュメントでのみこれを使用してください。 |
品質係数により、ユーザやユーザ・エージェントは、0から1までのqvalueの尺度を用いて、メディア・レンジに対する相対的な優先度を示すことができるようになります。デフォルト値はq=1です。例えば下記をご覧ください。
Accept: text/turtle; q=0.5, application/json
これは「application/jsonの方が望ましいけれども、品質を50%下げても利用可能な最良のものであれば、text/turtleを送信してください」と解釈すべきです。
qvaluesの不適切な取り扱いは、内容交渉の実装でよく見られる問題です。
クライアントとサーバーの両方の実装に対するqvaluesの適切な使用方法と評価について理解するためには、[HTTP11]仕様の14項「ヘッダ・フィールドの定義」を参照してください。
クライアントは複数のURLでLDPRにアクセスできます。LDPサーバーは、LDPRに対し、1つの整合性のあるURL(プライマリURL)を用いて、それらの個々のリクエストに応答すべきです。このプライマリURLは、応答のLocationおよび(または)Content-Locationのヘッダーにあり、LDPRの表現の中にもありえます。よくあるのは、1つはHTTP、1つはHTTPSと、プロトコルによってURLが異なるけれども、その他の点は同じであるURLのケースです。ほとんどの場合、これらの2つのURLは同じ資源を参照し、サーバーは1つの(プライマリ)URLがある方のURLのリクエストに応答すべきです。
クライアントは、プライマリURLをLDPRのアイデンティティーとして使用すべきです。例えば、2つのURLが同じ資源を参照するかどうかを判断する場合、クライアントは、資源にアクセスするために用いたURLではなく、プライマリURLを比較すべきです。この使用は、プライマリURLをクライアントに伝えるヘッダーおよび(または)コンテンツを信頼する十分な理由がクライアントにあることを暗示することに注意してください。HTTP[RFC7231]は単独ではこれを保証できません[RFC7231]。
LDPRは1つのRDFトリプルで別の資源へのリンク(関係)を表します。情報源資源のURIをトリプルの主語として、また、ターゲットの資源のURIをトリプルの目的語として持っていれば十分です。ある背景を持つ読者が持っている誤解に反して、関係を表現するために「中間リンク」資源を作成する必要はありません。
LDPサーバーは、LDPRを簡単に作成・修正できるようにすべきです。
LDPサーバーが表現に制限を置くことは一般的かもしれません – 例えば、rdf:type述語の範囲、述語の目的語のデータ型、LDPRにおける述語の出現数が挙げられますが、サーバーはそのような制限を最小化すべきです。
一部のサーバ・アプリケーションでは、資源の修正に対して過度の制約を要求されるかもしれません。しかし、複雑な制約を強制すると、資源を修正できるクライアントが大きく制限されるでしょう。したがって、より広範囲のクライアントとの相互運用性のために、実装者は、サーバー固有の制約を最小化することが推奨されます。
リンクト・データ・プラットフォーム・コンテナ(LDPC)がリンクト・データ・プラットフォームRDF情報源(LDP-RS)でもあることを覚えていることは重要です。また、それはメンバーシップ・コントローラーとして存在しているかもしれませんが、それにアクセスするエージェントにとって重要な追加データも提供してくれるかもしれません。
下記は、既存の語彙、共通の語彙、確立された語彙を発見・活用するためのいくつかの有用な資源です。
この種のドキュメントをとても簡単に記述できるReSpecツールに関し、Robin Berjonおよびすべての貢献者に謝意を表します。
編集者に加え、このドキュメントの継続的改善に直接的または間接的に貢献いただいた次の方々に謝意を表します。