オープンデータ Web API検索・生成サイト作りました

SPARQLと呼ばれるRDFデータ用のクエリを発行して検索できる Web API、SPARQLエンドポイントが現在多数公開されており、それをまとめた記事を以前 Qiita に投稿していました。

https://qiita.com/uedayou/items/9e4c6029a2cb6b76de9f

以前からこれらのAPIを検索できるサイトが欲しいなと思っていましたが、今回自分で作ってみました。

https://uedayou.net/ldapinavi/

[![Linked Data API Navi](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62575/76e26b49-2cf5-8a0b-f75d-4f7519c5c074.jpeg)](https://uedayou.net/ldapinavi/)

この [**Linked Data API Navi**](https://uedayou.net/ldapinavi/) を紹介したいと思います。

# 特徴

[Linked Data API Navi](https://uedayou.net/ldapinavi/)には以下の特徴があります。詳細は後述します。

- 主に日本語コンテンツを提供するWeb API(SPARQLエンドポイント)を対象
- Web APIのライセンスを可能な限り明記、ほとんどはオープンデータ
- 本サイトで Web APIからデータを取得・検索可能(一部除く)
- オープンデータ提供サイトのデータセットについて収集して Web API を独自提供

# 独自Web APIについて

このサイトは、基本的に[利用可能なSPARQLエンドポイントリスト(2021年7月版)](https://qiita.com/uedayou/items/9e4c6029a2cb6b76de9f)のAPIの検索ができますが、それ以外にサイト独自で提供するWeb API(SPARQLエンドポイント)も併せて検索できるようになっています。

この独自Web APIについては、オープンデータカタログ(オープンデータ提供サイト)で提供されるオープンライセンスであるデータセットを対象に提供しようと考えています。

2022年2月現在、[**LinkData**](http://linkdata.org/)のオープンデータについてサイト独自にWeb APIを提供しています。


http://linkdata.org/

[**LinkData**](http://linkdata.org/)は、2011年から10年以上サービスを続ける日本最大級のオープンデータ提供サイトで、サイト内のオープンデータを使ったWebアプリ作成サービスなど利活用ツールも豊富に提供されています。

[LinkData](http://linkdata.org/)を使えば、利用者自身が持つデータセットを簡単にオープンデータとして公開でき、その手軽さから多くの自治体がLinkDataを使ったオープンデータ公開を行っています。

[Linked Data API Navi](https://uedayou.net/ldapinavi/)では、[LinkData](http://linkdata.org/)で公開されるオープンデータを定期的に収集して、Web API用データベースに変換してWeb APIを作成、サイト内で検索できるようにしています。

今後、他のオープンデータカタログについても対応したいと考えています。

# 使い方

## Web API 検索

Web APIの検索はサイトトップページから行えます。
検索はキーワード、検索候補、タグで検索できます。

![検索方法](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62575/b1a24d4c-2464-0dff-02d2-02a6d693165f.jpeg)

データセットのリンクをクリックするとWeb APIのページに遷移しますが、LinkData由来のWeb APIについては、LinkData のデータセットの構造の特徴により、データセット内に複数のファイルを持つ場合、Web APIリストページに遷移します(Web API提供がファイル単位のため)。

[![APIリスト](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62575/8f2dad0d-1a11-3e5b-07a4-a63d5e1397b7.jpeg)](https://uedayou.net/ldapinavi/linkdata/rdf1s9097i)

## 自治体オープンデータリスト

[Linked Data API Navi](https://uedayou.net/ldapinavi/)に登録されるWeb APIや、LinkDataのデータセットから生成した独自Web APIには、多数の自治体オープンデータがあります。

その自治体のリストをサイトトップページやサイドバーから一覧することができます。

![自治体オープンデータリスト](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62575/b76af253-e67f-9c13-cf37-5aec25dd30eb.jpeg)

![自治体オープンデータリスト](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62575/bc1e87fc-2c89-bf18-817b-8ec59b0af7a7.jpeg)

自治体名をクリックすると、各自治体が公開するデータセットが一覧できます。

[![大阪府高槻市さんのデータセット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62575/ef11b82c-66f9-c74f-ae8f-f272937164eb.jpeg)](https://uedayou.net/ldapinavi/linkdata/user/itseisak)


## Web API ページとその利用

Web API ページには、Web API の URLや作成者、説明、ライセンス表記、関連データセット(同一作者、同一タグを持つものなど)などを表示するとともに、Web API が CORS(Cross-Origin Resource Sharing)に対応するものは、このページからクエリを実行してそのデータを確認することができます。
独自提供のWeb API( **= [LinkData](http://linkdata.org/)由来のWeb API** )については全て CORS に対応しているので、このページからクエリ実行可能です。

[![Web APIページ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62575/ff69d487-fe97-f69e-97ec-2a6d50c3f3e3.jpeg)](https://uedayou.net/ldapinavi/linkdata/rdf1s9097i/mediaArtDbQuiz_AnimeData)

以下のようにクエリ実行ボタンをクリックすると API から結果を取得・表示できます。

![クエリ実行方法](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62575/d7aff4d8-bd66-5878-3aa1-39d10b0210cf.jpeg)


[**LinkData**](http://linkdata.org/)由来のWeb APIについては、あらかじめ全ての項目が検索できるクエリで自動生成しているため、手軽にデータ取得が可能です。

![クエリ実行結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62575/4dc0ae7b-ca17-06cc-f7ed-927b4590cde9.jpeg)

また、[**LinkData**](http://linkdata.org/)由来のWeb API には、RDF内のプロパティURI と ネームスペースも表示できます。SPARQLクエリが書ける方はこちらを確認すると、クエリを改変して必要なデータのみ取得することができると思います。最初は閉じた状態になっているので、必要に応じて広げてください。

![プロパティリスト](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62575/58e64b24-c2e3-fb46-3856-60ae7fa2e787.jpeg)


## API活用事例

[Linked Data API Navi](https://uedayou.net/ldapinavi/)のWeb APIを使って簡単なWebアプリを作ってみたいと思います。

今回使うのは、[高槻市](http://www.city.takatsuki.osaka.jp/)さんの図書館リストです。

https://uedayou.net/ldapinavi/linkdata/rdf1s3443i/272078_public_facility_library

この API と以下の地図アプリをマッシュアップして図書館マップを作ってみます。

https://github.com/uedayou/leaflet-simple-sparql

この地図アプリはSPARQLエンドポイントから取得したデータの中に lat と long 変数があれば勝手に地図上に表示してくれるというものになります。

[高槻市　図書館(272078_public_facility_library)](https://uedayou.net/ldapinavi/linkdata/rdf1s3443i/272078_public_facility_library) で自動生成されたクエリの中にすでに lat、long が含まれるのでそのままWeb API の URL と クエリを設定してやれば、地図アプリができます。

[![高槻市　図書館(272078_public_facility_library)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62575/6cbf99b2-7b75-b219-1558-c08cc1ab5c00.jpeg)](https://uedayou.net/ldapinavi/linkdata/rdf1s3443i/272078_public_facility_library)

↓

```js:config.js
var endpoint = "https://uedayou.net/ldapinavi/api/rdf1s3443i/272078_public_facility_library/sparql";
var query = (function () {/*
PREFIX rdf1s3443ip: <http://linkdata.org/property/rdf1s3443i#>
PREFIX rdf1s3443i: <http://linkdata.org/resource/rdf1s3443i#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX cc: <http://creativecommons.org/ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX schema: <http://schema.org/>
PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dcterms: <http://purl.org/dc/elements/1.1/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
select * where{
?uri rdfs:label ?label;
rdf1s3443ip:%E9%83%BD%E9%81%93%E5%BA%9C%E7%9C%8C%E3%82%B3%E3%83%BC%E3%83%89%E5%8F%88%E3%81%AF%E5%B8%82%E7%94%BA%E6%9D%91%E3%82%B3%E3%83%BC%E3%83%89 ?都道府県コード又は市町村コード;
rdf1s3443ip:NO ?NO;
rdf1s3443ip:%E9%83%BD%E9%81%93%E5%BA%9C%E7%9C%8C%E5%90%8D ?都道府県名;
rdf1s3443ip:%E5%B8%82%E5%8C%BA%E7%94%BA%E6%9D%91%E5%90%8D ?市区町村名;
rdf1s3443ip:%E5%90%8D%E7%A7%B0 ?名称;
rdf1s3443ip:%E5%90%8D%E7%A7%B0%E3%82%AB%E3%83%8A ?名称カナ;
rdf1s3443ip:POI%E3%82%B3%E3%83%BC%E3%83%89 ?POIコード;
rdf1s3443ip:%E4%BD%8F%E6%89%80 ?住所;
geo:lat ?lat;
geo:long ?long;
rdf1s3443ip:%E9%9B%BB%E8%A9%B1%E7%95%AA%E5%8F%B7 ?電話番号;
rdf1s3443ip:%E5%88%A9%E7%94%A8%E5%8F%AF%E8%83%BD%E6%9B%9C%E6%97%A5 ?利用可能曜日;
rdf1s3443ip:%E5%88%A9%E7%94%A8%E5%8F%AF%E8%83%BD%E6%99%82%E9%96%93%E7%89%B9%E8%A8%98%E4%BA%8B%E9%A0%85 ?利用可能時間特記事項;
foaf:homepage ?homepage.
optional{?uri rdf1s3443ip:%E5%90%8D%E7%A7%B0%E9%80%9A%E7%A7%B0 ?名称通称.}
optional{?uri rdf1s3443ip:%E6%96%B9%E6%9B%B8 ?方書.}
optional{?uri rdf1s3443ip:%E5%86%85%E7%B7%9A%E7%95%AA%E5%8F%B7 ?内線番号.}
optional{?uri rdf1s3443ip:%E6%B3%95%E4%BA%BA%E7%95%AA%E5%8F%B7 ?法人番号.}
optional{?uri rdf1s3443ip:%E5%9B%A3%E4%BD%93%E5%90%8D ?団体名.}
optional{?uri rdf1s3443ip:%E9%96%8B%E5%A7%8B%E6%99%82%E9%96%93 ?開始時間.}
optional{?uri rdf1s3443ip:%E7%B5%82%E4%BA%86%E6%99%82%E9%96%93 ?終了時間.}
optional{?uri dc:description ?description.}
optional{?uri rdf1s3443ip:%E3%83%90%E3%83%AA%E3%82%A2%E3%83%95%E3%83%AA%E3%83%BC%E6%83%85%E5%A0%B1 ?バリアフリー情報.}
optional{?uri rdf1s3443ip:%E5%82%99%E8%80%83 ?備考.}
}limit 100
*/}).toString().match(/\n([\s\S]*)\n/)[1];

var maxZoom = 19;
var baseUrl = "//{s}.tile.openstreetmap.org/{z}/{x}/{y}.png";
var baseAttribution = 'Map data &copy; OpenStreetMap contributors, Tiles Courtesy of OpenStreetMap Japan';
var subdomains = 'abc';
var clusterOptions = {showCoverageOnHover: false, maxClusterRadius: 50};
var labelColumn = "title";
var labelLatitude = "lat";
var labelLongitude = "long";
var opacity = 1.0;
```

↓

https://uedayou.net/leaflet-simple-sparql-ldapinavi-sample/
[![サンプルアプリ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62575/4a75ebe4-d27d-81df-0d38-2b73d28bf16a.jpeg)](https://uedayou.net/leaflet-simple-sparql-ldapinavi-sample/)

CORSに対応するWeb APIであればこのように手軽にマッシュアップアプリが作れます。

似たような方法で簡単にWebアプリを作成する方法を以下の[SPARQL](https://zenn.dev/uedayou/articles/c1e76684d3d094#sparql)節で紹介しています。

https://zenn.dev/uedayou/articles/c1e76684d3d094

# 自作オープンデータをWeb APIとして生成・登録するには

[Linked Data API Navi](https://uedayou.net/ldapinavi/)では、[LinkData](http://linkdata.org/)からオープンデータを収集して独自でWeb APIを提供しています。
[LinkData](http://linkdata.org/)は、アカウントを作ればだれでもオープンデータを公開できますので、LinkData で自作オープンデータを公開すれば、このサイトにも Web API として検索されることになります。
ただし、この Web API に登録されるようにするには以下のルールに適合する必要があります。

- パブリックドメイン、もしくはクリエイティブコモンズのライセンスである
- RDF(Turtle)ファイルのファイルサイズが20MB以下である
- RDFファイルが正しく記述されている(例えば、URIに不正な文字列が含まれないなど)


# SPARQLとは

SPARQLはRDF用のクエリ言語で、RDFのトリプル(主語、述語、目的語のセット)をSPARQLで検索、取得することができます。
詳しくは以下のサイトを参照ください。

https://www.aise.ics.saitama-u.ac.jp/~gotoh/IntroSPARQL.html

http://uedayou.net/sparql-examples/

有料ですが私のかかわるサークルでSPARQLについての技術同人誌を発行しています。

https://techbookfest.org/product/5642815304368128

ただ、上記でも説明しましたが、SPARQLを理解してなくても普通には利用できる工夫をしていますので、安心して利用してもらえると思います。