前回、JSONとRDF/Turtleは親和性が高そうであることを見たが、単純な置き換えではうまく行かなかったり、意味が正確に伝わらなかったりすることもある。ここでは名前空間宣言について考えてみよう。
まず、空白ノードを主語にした前回のグラフをもう一度確認。
この図でも分かるように、RDFでは基本的にURI参照でトリプルの名前付けを行うから、簡潔な記述には名前空間接頭辞が欠かせない。XML構文におけるxmlns
属性の役割は、Turtleでは @prefix
という特別な指示子が担う。デフォルト名前空間URIをhttp://example.org/ns/
とすれば、Turtleでは接頭辞を:
として@prefix
で宣言する。
[例1]
@prefix : <http://example.org/ns/>
[
:studentid "10108068";
:name "John Barleycorn"
] .
ここで困ったことに、@prefix
は []
の外側にあるため、単純にJSONにマップすることができない。XML構文のrdf:Description
を引っ張り出せば、次のように書くことはできるだろう。
[例2]
{ "@prefix": "<http://example.org/ns/>", "rdf:Description": { "studentid": "10108068", "name": "John Barleycorn" } }
しかし、これは余計な入れ子があって使い勝手が悪いし、rdf:
の名前空間宣言はどうしたとか面倒なことが増えてしまう。そこで、XMLなら名前空間宣言はどの要素で行ってもよいことをふまえて、JSONでは名前空間宣言を中に入れてデータと同じレベルで扱うことにする。
[例3]
{
"@prefix": "<http://example.org/ns/>"
,
"studentid": "10108068",
"name": "John Barleycorn"
}
これでかなりすっきりした。例3のJSONから例1のTurtleを導くのは、難しくないだろう(JSON側のプロパティ名は、@prefix
よりもxmlns
のほうが、XMLから変換したJSONを処理するときに実用的かも知れない)。
実際には、JSONで名前空間宣言が与えられない方が普通だろうが、Turtleは名前空間宣言なしという訳にいかないので、こういうケースに対処する汎用URIが必要になる。このために、http://purl.org/net/ns/jsonrdf/
という名前空間を用意してみた。名前空間宣言のないJSONをRDF/Turtleにするときは、次のような形になる。
[例4]
@prefix : <http://purl.org/net/ns/jsonrdf/> . [ :title "JSON to RDF/Turtle"; :date "2006-02-21"; ] .
どんなプロパティ名が使われるかは分からないわけだから、この名前空間であらかじめ語彙を定義しておくことは難しい。それでも、title
、date
のようにDublin Coreに含まれる語彙ならそのサブプロパティとしての定義、そうでなければWordnetなどへの参照を提供することで、ある程度関連するRDFスキーマを取得することもできるだろう。
JSONのデータは、基本的にはあらかじめ定義を承知したパーティどうしがやり取りをするための閉じたものだが、名前空間をうまく組み込めば、多少なりとも相互運用性のある開かれたデータとしての活用が可能になるかも知れない。
- JSONではじめるRDF/Turtle (2006-02-21)