JSONのデータ記法は、RDF/Turtleで主語を明記しない(空白ノードである)トリプルの書き方によく似ている。多くの人やサービスがデータをJSONの形で提供してくれれば、これをTurtleに変換してRDFとして扱うこともできるだろうし、JSONに馴染んだ人なら、案外Turtleを(そしてRDFを)抵抗なく受け入れられるのではなかろうか、などと考えたりしていた。
Turtleは、RDFのグラフを、XML構文ではなくて、主語、目的語、述語をシンプルに列挙する形で記述する。たとえば、ある学生の学籍番号をURIに仕立てて主語を名前付けし、その名前を目的語/述語で表すRDFトリプルがあるとしよう。
グラフの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として機能するプロパティで記述したとしよう(厳密には、これだけでグローバルに主語を特定することは難しいが、細かいことは忘れる)。
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はかなり親和性が高そうだ、ということだ。
- JSONではじめるRDF/Turtle(2) - 名前空間 (2006-02-21)
- JSONではじめるRDF/Turtle(3) - 型付ノード (2006-02-21)
- JSONではじめるRDF/Turtle(4) - プロパティの反復と主語 (2006-03-05)
- JSONではじめるRDF/Turtle(5) - 相互変換のデモ (2006-03-05)
- JSONがRFCに (2006-03-30)
- application/jsonがRFC4627に (2006-07-29)
- DOASとTurtle/RDF (2007-12-27)
- もうひとつのRDF構文:Turtle (2004-03-27)