ちょっとしたメモ

JSONではじめるRDF/Turtle(2) - 名前空間

前回JSONとRDF/Turtleは親和性が高そうであることを見たが、単純な置き換えではうまく行かなかったり、意味が正確に伝わらなかったりすることもある。ここでは名前空間宣言について考えてみよう。

まず、空白ノードを主語にした前回のグラフをもう一度確認。

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

この図でも分かるように、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";
] .

どんなプロパティ名が使われるかは分からないわけだから、この名前空間であらかじめ語彙を定義しておくことは難しい。それでも、titledateのようにDublin Coreに含まれる語彙ならそのサブプロパティとしての定義、そうでなければWordnetなどへの参照を提供することで、ある程度関連するRDFスキーマを取得することもできるだろう。

JSONのデータは、基本的にはあらかじめ定義を承知したパーティどうしがやり取りをするための閉じたものだが、名前空間をうまく組み込めば、多少なりとも相互運用性のある開かれたデータとしての活用が可能になるかも知れない。

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