ちょっとしたメモ

JSONではじめるRDF/Turtle

JSONのデータ記法は、RDF/Turtleで主語を明記しない(空白ノードである)トリプルの書き方によく似ている。多くの人やサービスがデータをJSONの形で提供してくれれば、これをTurtleに変換してRDFとして扱うこともできるだろうし、JSONに馴染んだ人なら、案外Turtleを(そしてRDFを)抵抗なく受け入れられるのではなかろうか、などと考えたりしていた。

Turtleは、RDFのグラフを、XML構文ではなくて、主語、目的語、述語をシンプルに列挙する形で記述する。たとえば、ある学生の学籍番号をURIに仕立てて主語を名前付けし、その名前を目的語/述語で表すRDFトリプルがあるとしよう。

[http://...studentid/10108068]--name-->'John Barleycorn'

グラフのXML構文は次のようになる(http://example.org/ns/はデフォルト名前空間として宣言されているとする)。

[例1]

<rdf:Description rdf:about="http://example.org/studentid/10108068">
  <name>John Barleycorn</name>
</rdf:Description>

これをTurtleで記述すると、次のようになる(rdf:Descriptionは、ノードを表現するXML構文のために用意されている要素で、トリプルには反映されない)。

[例2]

<http://example.org/studentid/10108068> :name "John Barleycorn" .

最初の<>で囲まれたURIが主語、:nameが述語(プロパティ)、最後の引用符の中が目的語で、この3つを並べて最後にピリオドを置くだけだから、極めて簡単。nameの前にコロン(:)が付いているのは、Turtleでデフォルト名前空間を表す方法だ。

さてここで、studentidを、主語を表すURIではなく、IDとして機能するプロパティで記述したとしよう(厳密には、これだけでグローバルに主語を特定することは難しいが、細かいことは忘れる)。

[]--studentid-->'10108068'; --name-->'John Barleycorn'

XMLで書くと次のとおり。

[例3]

<rdf:Description>
  <studentid>10108068</studentid>
  <name>John Barleycorn</name>
</rdf:Description>

この場合、主語はURI参照を持たないので空白ノードとなる。こうした空白ノード主語を持つトリプルは、Turtleでは[]で囲んで示す。また、同じ主語を持つトリプルは、述語と目的語を ; で結んで列挙してよい。すると、例3のRDF/XMLは、次のTurtleで表現できる。

[例4]

[
  :studentid "10108068";
  :name "John Barleycorn"
] .

一方、例3のXMLをJSONに翻訳するとき、RDFグラフには現れないrdf:Descriptionは省いてしまえば、次のように表すことができるだろう。

[例5]

{
  "studentid": "10108068",
  "name": "John Barleycorn"
}

[]{};, を入れ替え、プロパティ名に付随する : の位置を逆にすれば、TurtleとJSONはまさに瓜二つではないか。JSONのデータからRDF/Turtleを得るというアイデアは、何とかなるかも知れない。JSONを知っていればRDF/Turtleに取り組みやすいというのも、それほど的外れではないように思える。

もちろん、両者にはそれなりに違いもあるから、変換にはいくつかの仕掛けが必要になる。少なくとも名前空間宣言の処理がないと始まらないし、型付きノード要素や配列の扱いなど、いくつかの慣用的なデータ記述をマップする方法も考えなくてはならない。が、これらを細かく検討すると話がどんどん長くなるので、ひとまずここで切り上げて、続きは稿を改めることにしよう。

まず出発点としては、JSONとRDF/Turtleはかなり親和性が高そうだ、ということだ。

関連メモ:
map - genre: rdf, js. at