データとデータをつなぐ
この記事はUMITRON Advent Calendar 2023 15日目の記事です。
こんにちは。UMITRONの三田です。今年の2月にUMITRONに入社し、ソフトウェアエンジニアとしてプロダクトの開発を行っています。
今回はFediverseと生物多様性情報を例にインターネットでのデータの適切なつなぎ方について書こうと思います。
データの利活用に関する一般的な話なので、仕事でやっていることと直接の関係はないのですが、ガニエさんの記事と同様、社内のLTで話したテーマを勝手に深掘りしていきます。
はじめに
情報には様々な表現方法があります。ブログの記事のような自然言語による構造化されていない表現、表計算ソフトで用いられる構造化された表現などがあります。コンピューターがデータを効率的に処理するには構造化されていることが非常に重要になります。
Fediverseとは
Fediverseはfederation(連合)とuniverse(世界)からなるかばん語で、独立したサーバーが相互接続したネットワークを指します。Fediverseを実現するソフトウェアとして代表的なものとしてMisskeyやMastodonがあり、これらはX(旧Twitter)のオルタナティブとして注目を受けました。
これらのソフトウェアを使ったSNSではひとつのインスタンスに登録すると連合している他のインスタンスでも投稿や閲覧を行うことが出来ます。国(インスタンス)が国交(連合)を持つ他の国(インスタンス)と外交(投稿や閲覧)しているようなイメージです。
生物多様性情報とは
生物の観察記録や標本記録のことを生物多様性情報と呼びます。名前は少し厳ついですが、読んで字の如く生物多様性に関する情報を指します。
生物多様性の保全のためには当然ながら現状を把握することが必要です。過去と現在を比較するためには適切に情報が記録されていなければなりません。
地球全体の生物多様性を記録するための基盤として、世界中の国や機関の資金提供によって、地球規模生物多様性情報機構(GBIF)が設置されています。2023年12月時点でGBIFには数十億ほどの観察記録が登録されています。
データのつなぎ方
Mastodonの投稿(Fediverse)とGBIFの観察記録(生物多様性情報
)の間には何の関係性もないように見えます。しかし、これらはLinked Dataという方法論に従ってデータが記述されているという共通点を持ちます。
Linked Data
2006年にWorld Wide Web(WWW)の生みの親であるTim Berners-LeeによってLinked Dataの4つの原則がまとめられました。
要するにデータを他のデータとつなぐ時にはURIを使ってデータ同士の関係性、すなわち文脈を持たせようということです。
ActivityPub
ActivityPubはFediverseでデータをやり取りする際に使われるプロトコルです。2018年にWorld Wide Web Consortium(W3C)によって勧告されました。ActivityPubにおいて「投稿」や「投稿の作成」はJSON-LDで記述されます。それぞれ見ていきます。
「投稿」は以下のように記述されます。@contextにはActivity Streams 2.0の語彙のURIが入っています(vocabularyをそのまま訳して語彙と呼んでいますが、用語集のようなものだとイメージしてください)。語彙がなくてもなんとなくalyssaがbenに宛てて送った投稿なのはわかりますが、語彙を示すことによって情報を正確に記述し、機械的に処理することが出来ます。また、benもURIで記述されているため、どのbenに宛てられたものなのかも一意に定まります。
{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Note",
"to": ["https://chatty.example/ben/"],
"attributedTo": "https://social.example/alyssa/",
"content": "Say, did you finish reading that book I lent you?"
}
「投稿の作成」は以下のように記述されます。先ほどの「投稿」を作成するというアクティビティ自体がJSON-LDで表現されています。MastodonやMisskeyは実装の詳細な部分は異なりますが、ActivityPubという共通のインターフェースを持つことにより相互に接続することが出来るわけです。
{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Create",
"id": "https://social.example/alyssa/posts/a29a6843-9feb-4c74-a7f7-081b9c9201d3",
"to": ["https://chatty.example/ben/"],
"actor": "https://social.example/alyssa/",
"object": {
"type": "Note",
"id": "https://social.example/alyssa/posts/49e2d03d-b53a-4c4c-a95c-94a6abf45a19",
"attributedTo": "https://social.example/alyssa/",
"to": ["https://chatty.example/ben/"],
"content": "Say, did you finish reading that book I lent you?"
}
}
かなりざっくりとした説明なので詳細についてはW3Cのドキュメントなどを読むことをお勧めします。
Darwin Core
Darwin CoreはBiodiversity Information Standards (TDWG)によって開発された生物多様性情報を記述するための語彙(用語集)で、ActivityPubの説明で登場したActivity Streams 2.0に相当します。
観察記録をDarwin Coreの語彙を用いてJSON-LDで記述すると以下のようになります。これは「t3taが日本時間2023年1月1日12時00分に北緯35度東経140度の地点でネコを見た」と解釈することが出来ます。taxonIDのURIはGBIFによってホストされているネコという種自体のページに対する識別子です。このURIを参照することによりネコがどのようなものであるかについても情報を得ることが出来ます。
{
"@context": "http://rs.tdwg.org/dwc/terms/",
"basisOfRecord": "HumanObservation",
"eventDate": "2023-01-01T12:00+09:00",
"modified": "2023-01-01T12:00+09:00",
"decimalLatitude": 35.00000000,
"decimalLongitude": 140.00000000,
"taxonID": "https://www.gbif.org/species/113275790",
"scientificName: "Felis catus Linnaeus, 1758",
"identifiedBy": "https://t3ta.example/t3ta",
"dateIdentified": "2023-01-01T12:00+09:00"
}
もっとつなぐ
ここまででActivity Streams 2.0とDarwin Coreの語彙を使って記述されたデータについて見てきましたが、@contextを複数指定することでより多くの情報を表現することも出来ます。ネコの観察記録の投稿は以下のようになります。自分で語彙を定義すればより自由に情報を表現することも出来るでしょう。
{
"@context": [
"https://www.w3.org/ns/activitystreams",
{
"dwc": "http://rs.tdwg.org/dwc/terms/"
}
],
"type": "Note",
"attributedTo": "https://t3ta.example/t3ta",
"content": "ネコがいました",
"dwc:basisOfRecord": "HumanObservation",
"dwc:eventDate": "2023-01-01T12:00+09:00",
"dwc:modified": "2023-01-01T12:00+09:00",
"dwc:decimalLatitude": 35.00000000,
"dwc:decimalLongitude": 140.00000000,
"dwc:taxonID": "https://www.gbif.org/species/113275790",
"dwc:scientificName: "Felis catus Linnaeus, 1758",
"dwc:identifiedBy": "https://t3ta.example/t3ta",
"dwc:dateIdentified": "2023-01-01T12:00+09:00"
}
おわりに
SNSの投稿(Fediverse)と生き物の観察記録(生物多様性情報)という一見関係のなさそうなものがLinked Dataというシンプルな方法論を使って表現されているというのは個人的にはかなりイケてると思いますし、全部Linked Dataにしようよ!と思っています。
情報を解釈する際には文脈が非常に重要です。人と人とのコミュニケーションにおいては多少の齟齬があっても確認を取れば済むだけの話ですが、コンピューターには(今のところ)そのようなことは出来ません。しかし、語彙や言及されている対象をURIでつないであげることによってそういった問題を回避し、データの再利用を促進することが出来るでしょう。とはいえ、この記事をJSON-LDで書いたらきっと読む人はいないと思いますし、書きたくもないのでそのあたりのバランスが難しいところです。
最後まで読んでいただき本当にありがとうございました!
ウミトロンでは一緒に働く仲間を募集しております。持続可能な水産養殖を地球に実装するというミッションの元で、私たちと一緒に水産養殖xテクノロジーに取り組みませんか?