【Webエンジニアの備忘録】SPARQLとは何か -SQLとの本質的な違い-
はじめに
ご高覧いただきありがとうございます.
ソフトウェアエンジニアのKitaharaです.
本日はSPARQLを解説します!
この記事はSPARQLの記事の参考記事です
SPARQLとは
SPARQLとはLODを検索する言語(クエリ言語)
SPARQLはLinked Open Dataとして公開されているRDFデータを処理する言語です. Linked Open Data? RDFって何?という方がほとんどだと思うのでRDFについて定義をのせます.
Linked Open Data
つまり, Linked Open DataとはURIによって繋がったインターネット上のオープンな資源(データ)のことです.
RDF
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と扱うデータの関係をまとめると以下のようになります.
だから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
参考文献
この記事が気に入ったらサポートをしてみませんか?