RDFデータモデリングとは
データモデリングとは、現実世界の情報をRDFのトリプル(主語・述語・目的語)として表現するための設計作業です。適切なモデリングは、データの再利用性、他のデータセットとの相互運用性、検索の効率性に直接影響します。
本章では、オントロジー設計の基本原則、既存語彙の再利用方法、クラスとプロパティの定義、そしてデータのバリデーション手法(ShEx・SHACL)を学びます。筆者がOmeka Sへの語彙登録やOdeuropaの語彙構造の調査、ShExファイルの作成など、実践を通じて得た知見を交えて解説します。
オントロジーとは
オントロジー(Ontology)とは、ある領域(ドメイン)の概念体系を形式的に定義したものです。RDFの文脈では、クラス(概念の分類)とプロパティ(概念間の関係)の定義を含む語彙体系を指します。
たとえば、書誌データのオントロジーでは以下のような概念を定義します。
- クラス: 図書、雑誌、論文、著者、出版社
- プロパティ: タイトル、著者(図書→著者)、出版日、ISBN、掲載誌
オントロジーは、RDFS(RDF Schema)やOWL(Web Ontology Language)を用いて記述されます。
既存語彙の再利用
RDFデータモデリングの最も重要な原則は、既存の語彙を可能な限り再利用することです。独自の語彙を一から定義するのではなく、広く使われている標準語彙を採用することで、データの相互運用性が格段に向上します。
語彙選定の指針
- 標準化された語彙を優先する: W3Cの標準(RDF, RDFS, OWL, SKOS)やISO標準(Dublin Core)を最初に検討する
- 広く採用されている語彙を選ぶ: Schema.org、FOAF、BIBO(Bibliographic Ontology)など、多くのデータセットで使われている語彙を優先する
- ドメイン固有の語彙も検討する: EDM(Europeana Data Model)、ICA RiC-Oなど、ドメインに特化した語彙が存在する場合はそれを活用する
- 独自語彙は最後の手段: 既存語彙で表現できない概念がある場合にのみ、独自のプロパティやクラスを定義する
語彙の探し方
既存の語彙を探すには、以下のリソースが役立ちます。
- LOV(Linked Open Vocabularies): https://lov.linkeddata.es/ — LODで使われている語彙の検索エンジン
- prefix.cc: https://prefix.cc/ — プレフィックスとURIの対応を検索できるサービス。prefix.ccを利用するで詳しく紹介しています
- Schema.org: https://schema.org/ — Web全体で広く使われる語彙
- W3C標準仕様: 各W3C仕様書に語彙の定義が含まれている
実践:Omeka Sへの語彙登録
筆者はOmeka S(デジタルアーカイブ構築プラットフォーム)に対して、さまざまな標準語彙を登録する実践を行ってきました。
- 【Omeka S Tips】既存の標準語彙の追加方法: Omeka Sで利用可能な語彙の追加手順
- Omeka SにDC-NDL(国立国会図書館ダブリンコアメタデータ記述)を語彙として登録する: 国立国会図書館のDublin Core拡張語彙の登録
- Omeka SにPROV-Oオントロジーを登録する方法: 来歴(Provenance)記述のための語彙登録
- Omeka SにICA RiC-Oの語彙を登録する: 国際アーカイブズ評議会のアーカイブズ記述のための語彙登録
- 【Omeka S モジュール紹介】Data Type RDF: RDFデータ型の拡張モジュール
これらの経験を通じて、語彙の選定と実装の両面での知見を蓄積してきました。
クラスの設計
rdf:type によるクラスの指定
RDFでは、リソースがどのクラスに属するかを rdf:type(Turtleでは a)で指定します。
@prefix schema: <http://schema.org/> .
@prefix ex: <http://example.org/> .
ex:book/kokoro a schema:Book .
ex:person/natsume a schema:Person .
ex:org/iwanami a schema:Organization .
クラス階層の定義
rdfs:subClassOf を使ってクラスの階層構造を定義できます。
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix ex: <http://example.org/ontology/> .
ex:Novel rdfs:subClassOf ex:LiteraryWork .
ex:LiteraryWork rdfs:subClassOf ex:CreativeWork .
ex:ShortStory rdfs:subClassOf ex:LiteraryWork .
ex:Poetry rdfs:subClassOf ex:LiteraryWork .
筆者がOdeuropa Explorerの語彙階層構造を調査した際にも、SKOS語彙の skos:broader / skos:narrower を使った階層構造の設計が重要な役割を果たしていました。詳しくはOdeuropa Explorer の語彙階層構造を調査するをご覧ください。
プロパティの設計
rdfs:domain と rdfs:range
プロパティの定義域(domain)と値域(range)を指定することで、プロパティがどのクラス間の関係を記述するかを明示できます。
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix ex: <http://example.org/ontology/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
ex:authorOf a rdf:Property ;
rdfs:label "〜の著者である"@ja ;
rdfs:domain ex:Person ;
rdfs:range ex:CreativeWork ;
rdfs:comment "人物がある創作物の著者であることを示す"@ja .
ただし、RDFSの rdfs:domain と rdfs:range は制約(バリデーション)としてではなく、推論の根拠として機能する点に注意してください。この点は混同されやすいため、筆者はRDFSとSHACLの使い分け:rangeとpropertyShapeの関係を理解するで詳しく解説しています。RDFSのrangeは「推論」のための仕組みであり、データの「制約」にはSHACLを使うべきです。
実践的なモデリング例
書誌データのモデリング
@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix schema: <http://schema.org/> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix ex: <http://example.org/data/> .
ex:book/kokoro
a schema:Book ;
dcterms:title "こころ"@ja ;
dcterms:title "Kokoro"@en ;
dcterms:creator ex:person/natsume_soseki ;
dcterms:publisher ex:org/iwanami ;
dcterms:issued "1914-04-20"^^xsd:date ;
dcterms:language "ja" ;
owl:sameAs <http://www.wikidata.org/entity/Q1196954> .
ex:person/natsume_soseki
a foaf:Person , schema:Person ;
foaf:name "夏目漱石"@ja ;
foaf:name "Natsume Sōseki"@en ;
schema:birthDate "1867-02-09"^^xsd:date ;
schema:deathDate "1916-12-09"^^xsd:date ;
owl:sameAs <http://www.wikidata.org/entity/Q1195> ;
owl:sameAs <http://id.ndl.go.jp/auth/entity/00054222> .
owl:sameAs による同一性の宣言
異なるURIが同じ実体を指す場合、owl:sameAs で結びつけます。ただし、owl:sameAs は「完全に同一の実体である」という強い宣言であるため、慎重に使用する必要があります。類似しているが完全に同一とは言えない場合は、rdfs:seeAlso や skos:closeMatch の方が適切です。
ICA RiC-Oを用いたアーカイブズ記述
筆者はOmeka SにICA RiC-Oの語彙を登録するで、国際アーカイブズ評議会のRecords in Contexts Ontology(RiC-O)を用いたデータモデリングを紹介しています。また、rico-converterを試すでは、EADからRiC-Oへの変換ツールの実践例を報告しています。
ShEx / SHACLによるバリデーション
RDFデータが期待される構造に準拠しているかを検証するために、ShExとSHACLという2つのバリデーション手法があります。
ShExとSHACLの違い
筆者はShExとSHACLの違いで、両者の特徴を比較しています。簡潔にまとめると、ShExはスキーマ定義に近いアプローチ、SHACLはバリデーションルールの定義に適したアプローチです。
ShExの実践
ShEx(Shape Expressions)は、RDFデータのスキーマを簡潔に記述するための言語です。筆者は以下の記事でShExの実践を紹介しています。
- ShExファイルを作成してみる: ShExファイルの基本的な書き方
- ShExCとShExJの違い: ShExの2つの表現形式の比較
ShExCでの記述例を示します。
PREFIX schema: <http://schema.org/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX dcterms: <http://purl.org/dc/terms/>
<BookShape> {
a [schema:Book] ;
dcterms:title xsd:string MinCount 1 ;
dcterms:creator IRI MinCount 1 ;
dcterms:issued xsd:date ? ;
schema:isbn xsd:string ? ;
}
SHACLの実践
SHACL(Shapes Constraint Language)は、RDFグラフのバリデーションを行うためのW3C標準です。
@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix schema: <http://schema.org/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix ex: <http://example.org/shapes/> .
ex:BookShape
a sh:NodeShape ;
sh:targetClass schema:Book ;
sh:property [
sh:path dcterms:title ;
sh:minCount 1 ;
sh:datatype xsd:string ;
sh:message "タイトルは必須です"@ja ;
] ;
sh:property [
sh:path dcterms:creator ;
sh:minCount 1 ;
sh:nodeKind sh:IRI ;
sh:message "著者(IRI)は必須です"@ja ;
] ;
sh:property [
sh:path dcterms:issued ;
sh:maxCount 1 ;
sh:datatype xsd:date ;
sh:message "発行日はxsd:date型で最大1つ"@ja ;
] .
RDFSとSHACLの使い分け
RDFSの rdfs:range とSHACLの sh:class は一見似ていますが、動作が根本的に異なります。RDFSは推論の根拠として機能し、SHACLはバリデーション(制約違反の検出)として機能します。この重要な違いについては、筆者がRDFSとSHACLの使い分け:rangeとpropertyShapeの関係を理解するで詳しく解説しています。
モデリングのベストプラクティス
1. URI設計の原則
- 永続性: URIは長期間にわたって安定して利用できるように設計する
- 人間可読性: URIにはリソースの内容を推測できる文字列を使う
- パスの階層性: クラスや種別に応じたパス設計を行う
筆者はw3id.orgを用いた永続識別子の取得とSnorqlへのリダイレクトで、w3id.orgを使った永続URIの設計と取得方法を紹介しています。
2. 適切なデータ型の使用
文字列で表現できる値でも、適切なXSDデータ型を指定しましょう。
# 推奨
ex:book1 dcterms:issued "1914-04-20"^^xsd:date .
# 非推奨(文字列のまま)
ex:book1 dcterms:issued "1914年4月20日" .
3. 多言語対応
複数言語の利用者を想定する場合は、言語タグを活用しましょう。
ex:book1 dcterms:title "こころ"@ja ;
dcterms:title "Kokoro"@en .
4. 外部リソースへのリンク
自分のデータから外部のLinked Open Dataへのリンクを積極的に張りましょう。これが5つ星オープンデータの要件です。
5. データ変換の実践
既存のデータからRDFへの変換は、データモデリングの重要なステップです。筆者は以下の記事で具体的な変換手法を紹介しています。
まとめ
本章では、RDFデータのモデリング手法を学びました。重要なポイントを振り返ります。
- 既存の語彙(Dublin Core、Schema.org、FOAF等)を可能な限り再利用する
rdfs:subClassOfでクラス階層、rdfs:subPropertyOfでプロパティ階層を定義するowl:sameAsで異なるURIの同一性を宣言し、データセット間のリンクを張る- ShExとSHACLでデータのバリデーションルールを定義し、データ品質を担保する
- RDFSのrangeとSHACLの制約は異なるメカニズムであることを理解する
- URI設計、データ型指定、多言語対応などのベストプラクティスに従う
次章では、モデリングしたデータを実際にLinked Open Dataとして公開するための技術を学びます。
関連記事
- ShExとSHACLの違い
- ShExファイルを作成してみる
- ShExCとShExJの違い
- RDFSとSHACLの使い分け:rangeとpropertyShapeの関係を理解する
- Odeuropa Explorer の語彙階層構造を調査する
- prefix.ccを利用する
- w3id.orgを用いた永続識別子の取得とSnorqlへのリダイレクト
- Omeka SにICA RiC-Oの語彙を登録する
- rico-converterを試す
- Omeka SにPROV-Oオントロジーを登録する方法
- Omeka SにDC-NDL(国立国会図書館ダブリンコアメタデータ記述)を語彙として登録する
- 【Omeka S Tips】既存の標準語彙の追加方法
- 【Omeka S モジュール紹介】Data Type RDF
- ExcelからRDFを作成する
- Microsoft Visioを使ってRDFデータを作成する