見出し画像

【Webエンジニアの備忘録】SPARQLとは何か -SQLとの本質的な違い-

はじめに

ご高覧いただきありがとうございます.
ソフトウェアエンジニアのKitaharaです.
本日はSPARQLを解説します!

この記事はSPARQLの記事の参考記事です

SPARQLとは

SPARQLとはLODを検索する言語(クエリ言語)

SPARQLはLinked Open Dataとして公開されているRDFデータを処理する言語です. Linked Open Data? RDFって何?という方がほとんどだと思うのでRDFについて定義をのせます.

Linked Open Data

LODとは、ウェブ上に存在する他のデータと「リンク」されているデータ(リンクトデータ、Linked Data)であることと、誰でも自由に利用できるように「オープン」なライセンスで公開されたデータ(オープンデータ)であることを兼ね備えたデータを指します。ウェブの創始者であるティム・バーナーズ=リーによると、Linked Dataには次のような4つの原則があります(1)。

事物の名前としてURI*を用いること
これらの名前を参照できるように、HTTP URIを用いること
URIを参照したときに、RDF*やSPARQL*のような標準技術を用いて、有用な情報を提供できるようにすること
さらに多くの事物を発見できるように、他のURIへのリンクを含むこと

国立国会図書館

つまり, Linked Open DataとはURIによって繋がったインターネット上のオープンな資源(データ)のことです.

RDF

RDF(Resource Description Framework)は、ウェブ技術を使ってデータを記述するためのフレームワークです. RDFでは全てのものがリソースとして抽象的に扱われ、それぞれのリソースを判別するのにIRIを使います。

オープンデータ時代の標準Web API SPARQL

RDFは先程出てきた繋がりの規則と捉えることができます.

以上のことから, SPARQLとはURIによって結びつけられているRDF等の規則に則ったインターネット上のオープンな資源(データ)を機械的に取得する技術であることが分かります

RDFという規則はSQLのようなデータベースと表という形式とは異なっています. だからSQLと本質的に処理するデータの形が異なっているのです.

SPARQLとSQLの本質的な違い

データがグラフ形式

例えばSPARQLで扱うデータは以下の様になっています.
ある主体のノードと対象のノードが関係性という矢印によって結ばれています. このデータ形式を理解することがSPARQLでは重要です.

※正式にはこの形式のデータのことをトリプルといい,
それぞれの要素を主語(Subject), 述語(Presicate), 目的語(Object) といいます.

上記の関係性はSPARQLのエンドポイントで以下のクエリを送ることで分かります. (コードの詳細は分からなくて大丈夫です)

PREFIX : <http://ja.dbpedia.org/resource/> 
PREFIX rdf-comment: <http://www.w3.org/2000/01/rdf-schema#comment>

SELECT ?o
WHERE  {  :東京都 rdf-comment: ?o . } LIMIT 100

# return
"東京都(とうきょうと、英: Tokyo Metropolis)は、日本の首都。関東地方に位置する広域地方公共団体(都道府県)のひとつ。都庁所在地は新宿区。最大の人口を有する都市は世田谷区。"@ja

SPARQLの扱うデータはこのようなデータが集まった集合です.
つまり, 主体と対象が関係性によって結ばれた網目のような形になっていることがわかります.

SPARQLと扱うデータの関係をまとめると以下のようになります.

SPARQLは網目上のデータから関係を探す

だからWHERE内は何を検索するのかを書く

先程のコードを見ていきましょう

PREFIX : <http://ja.dbpedia.org/resource/> 
PREFIX rdf-comment: <http://www.w3.org/2000/01/rdf-schema#comment>

SELECT ?o
WHERE  {  :東京都 rdf-comment: ?o . } LIMIT 100

# return
"東京都(とうきょうと、英: Tokyo Metropolis)は、日本の首都。関東地方に位置する広域地方公共団体(都道府県)のひとつ。都庁所在地は新宿区。最大の人口を有する都市は世田谷区。"@ja

WHERE内ですが, 

http://ja.dbpedia.org/resource/東京都 -- (http://www.w3.org/2000/01/rdf-schema#comment) --> ?o

というノードを書いていることが分かります.

変数の?oはすべてのデータになるのでこのノードの意味は

http://ja.dbpedia.org/resource/東京都」と「http://www.w3.org/2000/01/rdf-schema#comment」という関係性を持つ「すべての対象」になります.

このようにWHERE内は探すグラフ(主体・関係性・対象)を書いていきます.
個々が通常のSQL文と異なるところです.

SQLでいうとFROMに近いです.

通常のSQLのWHEREはFILTERという別の要素を使って書きます.

例えば「米津玄師」という主体と「作った曲」という関係性を持つ「対象」だと米津玄師の曲すべてが該当しますが, FILTERを用いて発表年が2020年以降という絞り込みをすることができます.

こうしてみるとSQLのWHEREはFILTERの方が近いことがわかります.

WHERE ?s ?p ?o . と書いた場合はデータすべてになる

ここまでで「それなら主体, 関係性, 対象」すべてを変数にした場合はどうなるかと思った方もいるかもしれません.

それはデータすべてになります.
データベースに存在するどんなデータでも当てはまってしまうからですね.

試しにクエリを送ってみましょう.
SPARQLのエンドポイントにアクセスして書きのコードを実行してみてください. ([Execute Query] と書かれた青いボタンです)

LIMIT 100を忘れるとデータすべてが出力されるので気を付けてください

SELECT *
WHERE  {  ?s ?p ?o . } LIMIT 100

クエリが実行されたらデータを見てみましょう.
Bootstrapっぽいページが表示されれば成功です.
データに制限が無いので多種多様なデータが抽出されたと思います.

落選者と出ていますが, なんの落選者なのでしょうか?

SQLが検索するデータは表形式

一方でSQLが検索するデータはデータベースに入っている表のどれかです.
なのでuseとFROMで対象となるデータ集合を指定できるわけですね.

mysql> use stock_data
Database changed
mysql> select * from stocks limit 10
    -> ;
+----+------------+---------------+------------+--------+--------+--------+-------+------------+----------+
| id | date       | stock_name    | stock_code | open   | high   | low    | close | volume     | market   |
+----+------------+---------------+------------+--------+--------+--------+-------+------------+----------+
|  1 | 2022-01-04 |  日経225   |       1001 |  29098 |  29323 |  28954 | 29302 | 1109930000 | 東証1部 |
|  2 | 2022-01-04 |  TOPIX   |       1002 |   2015 |   2031 |   2005 |  2030 | 1109930000 | 東証1部 |
|  3 | 2022-01-04 |  極洋         |       1301 |   3110 |   3110 |   3075 |  3085 |       9200 | 東証1部 |
|  4 | 2022-01-04 |  ダイワTPX |       1305 |   2124 |   2140 | 2111.5 |  2138 |     173150 | 東証1部 |
|  5 | 2022-01-04 |  TOPIX投 |       1306 | 2100.5 |   2122 | 2087.5 |  2122 |    3075010 | 東証1部 |
|  6 | 2022-01-04 |  上場TPX   |       1308 | 2078.5 | 2093.5 | 2065.5 |  2089 |     242500 | 東証1部 |
|  7 | 2022-01-04 |  上海上証50 |       1309 |  44330 |  44600 |  44000 | 44510 |        346 | 東証1部 |
|  8 | 2022-01-04 |  T30連動投 |       1311 |   1030 |   1040 |   1027 |  1029 |      15690 | 東証1部 |
|  9 | 2022-01-04 |  野村小型コア |       1312 |  20515 |  20675 |  20515 | 20520 |         19 | 東証1部 |
| 10 | 2022-01-04 |  KODEX200     |       1313 |   3985 |   3985 |   3887 |  3985 |        100 | 東証1部 |
+----+------------+---------------+------------+--------+--------+--------+-------+------------+----------+
10 rows in set (0.01 sec)

※データは下記のページで作成しています.

おわりに

今回はSPARQLの解説をしました!参考になったという方はぜひハートボタンを押していってください!

モチベーションが上がります!

記事内で不明な点等ございましたら気軽にご連絡ください.

Twitter: @kitahara_dev
email: kitahara.main1@gmail.com

参考文献


この記事が気に入ったらサポートをしてみませんか?