RDFデータモデリングとは

データモデリングとは、現実世界の情報をRDFのトリプル(主語・述語・目的語)として表現するための設計作業です。適切なモデリングは、データの再利用性、他のデータセットとの相互運用性、検索の効率性に直接影響します。

本章では、オントロジー設計の基本原則、既存語彙の再利用方法、クラスとプロパティの定義、そしてデータのバリデーション手法(ShEx・SHACL)を学びます。筆者がOmeka Sへの語彙登録やOdeuropaの語彙構造の調査、ShExファイルの作成など、実践を通じて得た知見を交えて解説します。

オントロジーとは

オントロジー(Ontology)とは、ある領域(ドメイン)の概念体系を形式的に定義したものです。RDFの文脈では、クラス(概念の分類)とプロパティ(概念間の関係)の定義を含む語彙体系を指します。

たとえば、書誌データのオントロジーでは以下のような概念を定義します。

  • クラス: 図書、雑誌、論文、著者、出版社
  • プロパティ: タイトル、著者(図書→著者)、出版日、ISBN、掲載誌

オントロジーは、RDFS(RDF Schema)やOWL(Web Ontology Language)を用いて記述されます。

既存語彙の再利用

RDFデータモデリングの最も重要な原則は、既存の語彙を可能な限り再利用することです。独自の語彙を一から定義するのではなく、広く使われている標準語彙を採用することで、データの相互運用性が格段に向上します。

語彙選定の指針

  1. 標準化された語彙を優先する: W3Cの標準(RDF, RDFS, OWL, SKOS)やISO標準(Dublin Core)を最初に検討する
  2. 広く採用されている語彙を選ぶ: Schema.org、FOAF、BIBO(Bibliographic Ontology)など、多くのデータセットで使われている語彙を優先する
  3. ドメイン固有の語彙も検討する: EDM(Europeana Data Model)、ICA RiC-Oなど、ドメインに特化した語彙が存在する場合はそれを活用する
  4. 独自語彙は最後の手段: 既存語彙で表現できない概念がある場合にのみ、独自のプロパティやクラスを定義する

語彙の探し方

既存の語彙を探すには、以下のリソースが役立ちます。

実践:Omeka Sへの語彙登録

筆者はOmeka S(デジタルアーカイブ構築プラットフォーム)に対して、さまざまな標準語彙を登録する実践を行ってきました。

これらの経験を通じて、語彙の選定と実装の両面での知見を蓄積してきました。

クラスの設計

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:domainrdfs: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:seeAlsoskos: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の実践を紹介しています。

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として公開するための技術を学びます。

関連記事