RDF Turtle を JSON-LD に変換する Javascript ライブラリを公開してみた

# はじめに

構造化データとしていろいろな RDF Turtle が世に出ていますが、これをたとえば可視化なんかのために気軽にブラウザで使いたい、という場合には結構な苦行が待っています。

SPARQL 派の場合はざっとこんな感じでしょうか？

1. サーバを借りて
2. SPARQL Endpoint を立てて
3. Turtle を SPARQL Endpoint に投入して
4. SPARQL Endpoint に SPARQL Query を投げ
5. 受け取った SPARQL 1.1 Query Results JSON Format をパースして保持
6. 4 と 5 を必要なだけ繰り返して必要なデータをすべて得る
7. ついに可視化に挑む

また、[N3.js](https://github.com/rdfjs/N3.js) のようなライブラリを使う方針だとこんなかんじでしょうか。

1. ブラウザから Turtle を取得
2. N3.js によってブラウザ上で直接 Turtle をパース
3. パースした結果を [RDFJS](http://rdf.js.org/) のインターフェイスを介してアクセス＆可視化

# 問題

もちろん SPARQL や RDFJS のようなスペックをちゃんと習得する、というのはひとつの方策ですが、他方で[JSON-LD 1.0 Specification](https://www.w3.org/TR/json-ld/#turtle) では、

こんな Turtle が

```input.ttl
@prefix foaf: <http://xmlns.com/foaf/0.1/> .

<http://manu.sporny.org/about#manu> a foaf:Person;
  foaf:name "Manu Sporny";
  foaf:homepage <http://manu.sporny.org/> .
```

こんな JSON-LD と等価ですよ、ということを言及したりしています。

```output.json
{
  "@context":
  {
    "foaf": "http://xmlns.com/foaf/0.1/"
  },
  "@id": "http://manu.sporny.org/about#manu",
  "@type": "foaf:Person",
  "foaf:name": "Manu Sporny",
  "foaf:homepage": { "@id": "http://manu.sporny.org/" }
}
```

SPARQL や RDFJS はともかく、 Turtle がこんなかんじの JSON-LD に簡単に変換できるのであれば、RDF のことはよくわからないけど使ってみよう、という入り口にはなるかもしれません。

実際のところ Turtle と JSON-LD は結構素直に変換していくことが可能なのですが、このような変換をしてくれるツールがどうにも見つかりません。

先行事例として <https://www.npmjs.com/package/ttl2jsonld> とか <https://www.npmjs.com/package/turtle2jsonld> といったズバリの名前のものはあったのですが、そもそも動作しなかったり、出力が [Flattened Document Form](https://www.w3.org/TR/json-ld/#flattened-document-form) 相当に制限されるなど、自分のニーズに対して十分なものが見つかりませんでした。


# 解決

Turtle をパースして JSON-LD に変換する Javascript のライブラリを作って公開しました。

- NPM [@frogcat/ttl2jsonld](https://www.npmjs.com/package/@frogcat/ttl2jsonld)
- GitHub <https://github.com/frogcat/ttl2jsonld>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82494/7c4a8705-6122-49c8-6545-cd6c3a02013e.png)

Node.js に限らずブラウザでも動作するようにビルドしています。ブラウザでの動作デモも公開しています。

- デモ <https://frogcat.github.io/ttl2jsonld/demo/>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82494/58f732c5-8619-9c1f-1582-5964581d3ec4.png)

あとコマンドラインインターフェイスも用意しています。NPM でインストールすると ttl2jsonld コマンドが使えるようになるので、↓ みたいなかんじにサクッと変換できます。

```
$ npm install @frogcat/ttl2jsonld
$ curl http://www.cavoc.org/cvo/src/cvo_ver_1_52.ttl | ttl2jsonld > cvo_ver_1_52.json
```

# 変換例

ここ一年ほどで公開された Turtle を変換してみました。もともとが 数Mbytes くらいのサイズの Turtle なのですが変換自体はうまくいきました。大きなもので 13Mbytes くらいの JSON になっているのでこれをそのままブラウザで扱うにはちょっと大変かもしれませんが。

## NDCデータ（NDC8版および9版）

[NDCデータ（NDC8版および9版）](https://www.jla.or.jp/committees/bunrui/tabid/789/Default.aspx) にて
CC-BY で公開されている NDC8 と NDC9 を変換したもの。


- <https://gist.githubusercontent.com/frogcat/cab6a6e0f51553b9625aa6f735913185/raw/4fc1cb592470e4d7a8492e843a8ada49c236dece/ndc8.json> (サイズ注意)
- <https://gist.githubusercontent.com/frogcat/cab6a6e0f51553b9625aa6f735913185/raw/4fc1cb592470e4d7a8492e843a8ada49c236dece/ndc9.json> (サイズ注意)


## 農作業基本オントロジー

[農作業基本オントロジー(Agricutlure Activity Ontology)](http://www.cavoc.org/aao.php) にて CC-BY で公開されている Turtle を変換したもの。

- <https://gist.githubusercontent.com/frogcat/cab6a6e0f51553b9625aa6f735913185/raw/4fc1cb592470e4d7a8492e843a8ada49c236dece/aao_ver_2_01.json>



## 農作物語彙体系

[農作物語彙体系(CVO, Crop VOcabulary)](http://www.cavoc.org/cvo.php) にて CC-BY で公開されている Turtle を変換したもの。

- <https://gist.githubusercontent.com/frogcat/cab6a6e0f51553b9625aa6f735913185/raw/4fc1cb592470e4d7a8492e843a8ada49c236dece/cvo_ver_1_52.json>

## ナレッジグラフ推論チャレンジ2018「まだらの紐」

<https://github.com/KnowledgeGraphJapan/Challenge/tree/master/rdf/SpeckledBand> にて CC-BY で公開されている Turtle を変換したもの。

 - <https://gist.githubusercontent.com/frogcat/cab6a6e0f51553b9625aa6f735913185/raw/2f32fde9002556cecef980a297e8d6c77f193f30/SpeckledBand.json>

# まとめ


- Turtle を素直に JSON-LD に変換する JS ライブラリを公開しました
- 小規模な Turtle をブラウザ上で直接扱いたいような場合の選択肢の一つとしてどうぞ
- Turtle を公開するときにあわせて JSON-LD を公開すると喜ぶ人がいるかもしれません