Datalogからsqlへの トランスレータを書いた話
-
Upload
yuki-takeichi -
Category
Software
-
view
1.315 -
download
0
Transcript of Datalogからsqlへの トランスレータを書いた話
DatalogからSQLへの トランスレータを書いた話
理論から学ぶデータベース実践入門Night LT 2015.10.8
@tacke_jp
$ whoami• 武市融紀 ( @tacke_jp )
• 株式会社ノハナ
• 「家族の問題を解決する」がミッションのmixi発社内ベンチャー
• エンジニア
• サーバーサイド/ネイティブアプリからデータ解析までやる器用貧乏不器用エンジニア
今日話したいこと
• 宣言型クエリ言語Datalogの紹介
• Datalogで記述したクエリをSQLに変換するデモ
Datalogとは?• 宣言的論理型プログラミング言語
• PrologっぽいSyntaxをもつ
• 3つの構文を持つ
• ファクト: リレーションを外延的に定義
• ルール: 推論規則 (あるファクトから別のファクトを導く)
• クエリ: ファクトを真にするような変数を見つける
ファクト
father(tara, masuo).mother(tara, sazae).
• リレーションを定義する構文 • SQLではINSERTに相当
father(sazae, namihei).mother(sazae, fune).
リレーション名
定数項(先頭が小文字)
ルール
parent(X, Y) :- father(X, Y).
• 推論規則を定義 • SQLにおけるViewに相当
parent(X, Y) :- mother(X, Y).
grandparent(X, Y) :- parent(X, P), parent(P, Y).
ancestor(X, Y) :- parent(X, Y). ancestor(X, Y) :- parent(X, P), ancestor(P, Y).
宣言部 本体
←複数行ならべると選言(OR)
カンマでつなぐと連言(AND)
リレーションをまたいだ変数はJOINに相当
減少性があれば再帰的定義も可能
クエリ
? :- parent(X, Y).
? :- grandparent(X, Y).
? :- ancestor(tara, Y).
親子関係を列挙せよ
親子関係を列挙せよ
タラちゃんの祖先を列挙せよ
• 右に現れる変数を満たす値を列挙する
モチベーション
• 複雑なロジックをSQLで記述しようとするとすぐ長くなる
• 「BigQuery (行数)」
• SQLを書いていると毎回同じようなロジックを記述しているような感じがする
• Viewでもいいけど乱立したら管理が大変そう…
• => リレーショナルDBへのクエリをSQL以外で書きたい!
というわけで
• 書きました!
• https://github.com/yuki-takeichi/datalog-sql
demo
まとめ• Datalogを使うことで複雑なJOINを行うクエリや再帰クエリを部品化することができた
• しかも記述が簡素になった
• 変数って便利
• RDBのSQL以外のクエリ言語の可能性を考えてみるのも面白いかも