JSONのデータとRDF/Turtleをマッピングするためには、あと少し整理しておくべきポイントがある。JSONで配列として表現されるデータモデルの扱いと、Turtleに空白ノードではなくURI参照を持つ主語を与える方法だ。
JSONで一つのプロパティが複数の値を持つ場合、配列が用いられる。
[例1]
{ "item": ["ab","cd","ef"] }
配列は、0,1,2...というプロパティを持つオブジェクトと同じなので、素直にTurtleに変換すれば次のようになるだろう。
[例2]
[ :item [ :_0 "ab"; :_1 "cd"; :_2 "ef" ] ] .
ひとつのプロパティに対して空白ノードの目的語があって、それが番号の付いたプロパティ(名前は数字で始められないので、:0, :1...ではなく:_0, :_1...としている)とその値を持つこの形は、RDFのコンテナモデル(RSS1.0のchannel要素内のitems要素が持つあれだ)と酷似している。
ここで考えたいのは、元のモデルはこのようなコンテナ的モデルではなく、itemプロパティが3回繰り返され、それぞれの値が'ab','cd','ef'であることを想定しているのではないかということ。つまり、次のようなグラフだ。
[例3]
[ :item "ab"; :item "cd"; :item "ef" ] .
途中を大幅に端折って、コンテナモデルはあまり嬉しくないので、ここは後者のプロパティを繰り返すモデルにマップすることにする(XMLからJSONに変換するライブラリも、ちょうどこの逆で、同じ要素が繰り返されているときは配列にまとめたりしているようだ)。
最後にもうひとつ、このJSONにRDFの主語を付け加える方法だけ考えておく。最初に述べたように、JSONのデータ記法は、RDF/Turtleの空白ノードであるの書き方によく似ているのだが、RDFの基本的なモデルは主語にURIが与えられている。RDF/XMLでいえば、rdf:about
属性の値だ。
同じく最初の例を再び見ると、Turtleで主語URIがある場合は、次のように書く。
[例4]
@prefix : <http://example.org/ns/> .
<http://example.org/studentid/10108068>
; :name "John Barleycorn" .
JSONにはこうした主語に相当するものはない(敢えて言えば、JSONデータを割り当てるオブジェクトの名前が主語か)ので、直接マップすることはできないのだが、せっかくここまで来たら、何とかこの主語もJSONで表現してしまいたい。どっちみち「正しい」方法はないので、名前空間の時と同じように、特別なプロパティ@about
を導入して、そこに主語を記述することにしてしまおう。
[例5]
{ "@prefix": "<http://example.org/ns/>","@about"
: "<http://example.org/studentid/10108068>
", "name": "John Barleycorn" }
かなり強引だが、まあいいことにする。とりあえずこれで、JSONをTurtleにマップする方法が大まかに揃った。
- JSONではじめるRDF/Turtle (2006-02-21)