はじめに

RDF(Resource Description Framework)でデータを扱う際、「RDFS(RDF Schema)」と「SHACL(Shapes Constraint Language)」という2つの仕組みが出てきます。どちらもプロパティやクラスの制約を定義できますが、目的も動作も全く異なります

この記事では、特に混乱しやすい以下の疑問に答えます:

  • rdfs:domain / rdfs:range と SHACL の sh:class / sh:datatype は何が違うのか?
  • RDFS の range と異なる SHACL 制約を設定してもいいのか?
  • range がクラス(foaf:Person)なのに SHACL でデータ型(xsd:string)を指定するのは問題ないか?

1. RDFSとSHACLの根本的な違い

RDFS:推論(Inference)のため

RDFS は**「もしこのプロパティが使われたら、こういう知識が導き出せる」**という宣言です。

#exR:DaFuSthorrrddffss::droamnagieneexx::PBeoroskon;.

意味 :

  • ex:author が使われたら、主語(subject)は自動的に ex:Book のメンバーと推論される
  • 目的語(object)は自動的に ex:Person のメンバーと推論される
#e#eexxx:::bbjooooohkkn11aeaxe:exax:u:PtBehoroosrkone.x.:john##.droamnagien

特徴 :

  • ✅ 新しい知識を生成 する(推論エンジンが実行)
  • ✅ Open World Assumption(世界は開かれている)
  • ✅ エラーという概念はない
  • ✅ 「もし使われたら、これも真である」という宣言

SHACL:検証(Validation)のため

SHACL は**「既存のデータがこのルールに従っているかチェック」**する制約です。

#exS:ass]HBhhAos::ssss.CohtphhhhLk:ar::::SNropcmmhogpaliaadeetanxpetrhsCCeSCtsoohlyeuuaaxennps[:xttesa:uP13;etexhr;:osBroono;k;;###"""3ex:1P"ers"on"

意味 : 「データはこのルールに従うべき」

#e#s]xh::ss].bVhhoa::sssssolcrhhhhhkioe:::::1dnsrfrvrafueoeaeetolscslsxirtuuuuu:omlslelans[tNttuRSoP"MtefedaJehpavetosoolehhsrrsrenateixeg"t:xSeJ[;yb:mooai"hsoutVnhktha:1h"lSVoumi;r;eiotl;ihas"tin.oont;a#membePrerosfonclassex:Person"

特徴 :

  • ✅ ルール違反を検出 する(検証エンジンが実行)
  • ✅ Closed World Assumption的(ルールに明示されたものを検証)
  • ✅ エラーレポートを生成
  • ✅ 「データはこうあるべき」という制約

2. 両者の比較表

観点RDFS domain/rangeSHACL property shape
目的意味定義・推論データ検証
動作新しい知識を生成ルール違反を検出
哲学Open WorldClosed World的
タイミングスキーマ設計時データ登録・検証時
実行主体推論エンジン検証エンジン
結果推論されたトリプルバリデーションレポート
柔軟性より緩いより厳密

3. 実践的な使い分け

パターン1:RDFS で意味を定義、SHACL で品質を保証

これが最も推奨される組み合わせ です。

#e#eexxx1:2:ass]:ass].h.PhhChhaes::ssss.os::ssss.RsSrhtphhhhnhtphhhhDCHs:ar::::t:ar::::FoAoNropcmmaNropdpmSnCnogpaliacogpaaaitLSdeetanxtdeetttnahetrhsCCIetrhatCcaSCtsoonSCtteotphlyeuufhlyeyrueaaxennoaaxpnnrrrps[:xttSps[:etdddesh:hese"fffaC13amx^1sss;esop;eas[:::xCn;exid^drl:ot:l:@oaaPnaCs]mnbetco;t+ageratnr@ielscIti[notnan^e"nfcg@ex;ot]x:;I;+:C;n$Pof"enort####;sa";ocRnt.D#IF;nSfSoHA3;rCaLnge

パターン2:プロファイルごとに異なる制約

同じ語彙を、用途に応じて異なる制約で使えます。

#e#:#:#:xPRB:as]es]os]aphphohue:sss.o:sss.k:sss.trphhhrphhhPphhhhPr:::tr:::rr:::oropcmPopcmoopcmropalirpalifpalifetanoetanietanrirhsCfrhsClrhsCd-ltsoitso-etsofeyeu-lyeuyeusxfnexfnxfn:[:ot[:ot[:otraaaaaaauf1uf1uf1nt:t:t:ghPhOhAeoeorogrrrgrefsano;o;n;tanifz;:;aAtgi#e#onnrtAag;n.egnet##Ageonrt

4. よくある疑問Q&A

Q1: RDFS の range と異なる SHACL 制約を設定できますか?

A: はい、できますし、推奨される場合も多いです。

ただし、SHACL は range と同じか、より厳しい制約にすべき です。

✅ 推奨パターン:サブクラスで絞り込む

#e#:xPR:Srs]DcHohFrAf:sss.SeCiphhhaLlr:::-teopcmo-SpalirhetanarhsCrptsodeyeufxfns[:ot:carrf1ae:naPgteeorrsfoo;naf;:Ag#entA.gent#or

✅ 推奨パターン:リテラル型を具体化

#e#:xPR:Srs]DvHohFaAf:sss.SlCiphhhuLlr:::-eeopdm-SpaairhettndarhaIfpttnseyeyc:xplr[:euavsnaxiglsveudee:ri0d;nftse:gLeirte;ral#.Literalinteger

⚠️ 避けるべきパターン:range より広くする

#e#:xPR:Srs]DaHohFuAf:ss.StCiphhhLlr::oeopcrSpalhetararhsdptsfeyesxf:[:oraaaufnt:ghAeogrefno;taf:#PersoPner.son

論理的に矛盾はしませんが、混乱を招きます。

Q2: range がクラスなのに SHACL でデータ型を指定するのは問題ですか?

A: はい、これは意味的な矛盾です。絶対に避けてください。

❌ 問題のある例

#e#:xP:rs]aohuf:ss.tiphhhlr::-oeopdrSpaa-hettrarhadpttfeyeyUsxpR:[:eIraauxntsghdeo:rsfto;raifn:gPer#son.

なぜ問題か :

  • rdfs:range foaf:Person: 値は foaf:Person のインスタンス(URI参照
  • sh:datatype xsd:string: 値は文字列リテラル

この2つは型として互換性がありません

#e#eexxx:::bbjooooohkkn11aeaxe:exax:u:PtBehoroosrkone.x.:john##.droamnagien

0

✅ 正しいパターン1:URI参照を使う

#e#eexxx:::bbjooooohkkn11aeaxe:exax:u:PtBehoroosrkone.x.:john##.droamnagien

1

✅ 正しいパターン2:リテラルを使う

#e#eexxx:::bbjooooohkkn11aeaxe:exax:u:PtBehoroosrkone.x.:john##.droamnagien

2

✅ 推奨パターン:両方提供する

#e#eexxx:::bbjooooohkkn11aeaxe:exax:u:PtBehoroosrkone.x.:john##.droamnagien

3

Q3: 型カテゴリの整合性とは?

A: RDFS range と SHACL 制約は同じ「型カテゴリ」でなければなりません。

rdfs:rangeSHACL 制約型カテゴリ評価
foaf:Personsh:class foaf:Personクラス ↔ クラス✅ 整合
foaf:Personsh:class foaf:Agentクラス ↔ クラス⚠️ より緩い
foaf:Agentsh:class foaf:Personクラス ↔ クラス✅ より厳しい(推奨)
foaf:Personsh:datatype xsd:stringクラス ↔ データ型矛盾
xsd:stringsh:datatype xsd:integerデータ型 ↔ データ型矛盾
rdfs:Literalsh:datatype xsd:stringデータ型 ↔ データ型✅ 具体化(推奨)

5. 実際のアプリケーションでの活用例

ケース:メタデータ管理システム

#e#eexxx:::bbjooooohkkn11aeaxe:exax:u:PtBehoroosrkone.x.:john##.droamnagien

4

6. まとめ:設計指針

語彙設計(RDFS)のポイント

  1. できるだけ一般的に定義 する(再利用性を高める)
  2. domain/range は柔軟に (将来の拡張を考慮)
  3. 意味的な関係を明示 (推論に使える情報を提供)

プロファイル設計(SHACL)のポイント

  1. 用途に応じて具体的な制約を設定 (データ品質を保証)
  2. RDFS range と同じか、より厳しい制約に (より緩くしない)
  3. 型カテゴリの整合性を保つ (クラス↔クラス、データ型↔データ型)
  4. 必須・任意、個数制限などを明確に (運用ルールを反映)

禁止事項

❌ RDFS がクラス(foaf:Person)なのに SHACL でデータ型(xsd:string)を指定
❌ RDFS がデータ型(xsd:string)なのに SHACL で別のデータ型(xsd:integer)を指定
❌ SHACL の制約を RDFS range より緩くする

推奨事項

✅ RDFS は汎用的に、SHACL は具体的に
✅ サブクラスやサブプロパティで絞り込む
✅ プロファイルごとに異なる制約を設定
✅ URI参照とリテラルは別プロパティで管理

7. さらに学ぶために