Datalogからsqlへの トランスレータを書いた話

11
DatalogからSQLへの トランスレータを書いた話 理論から学ぶデータベース実践入門Night LT 2015.10.8 @tacke_jp

Transcript of Datalogからsqlへの トランスレータを書いた話

Page 1: Datalogからsqlへの トランスレータを書いた話

DatalogからSQLへの トランスレータを書いた話

理論から学ぶデータベース実践入門Night LT 2015.10.8

@tacke_jp

Page 2: Datalogからsqlへの トランスレータを書いた話

$ whoami• 武市融紀 ( @tacke_jp )

• 株式会社ノハナ

• 「家族の問題を解決する」がミッションのmixi発社内ベンチャー

• エンジニア

• サーバーサイド/ネイティブアプリからデータ解析までやる器用貧乏不器用エンジニア

Page 3: Datalogからsqlへの トランスレータを書いた話

今日話したいこと

• 宣言型クエリ言語Datalogの紹介

• Datalogで記述したクエリをSQLに変換するデモ

Page 4: Datalogからsqlへの トランスレータを書いた話

Datalogとは?• 宣言的論理型プログラミング言語

• PrologっぽいSyntaxをもつ 

• 3つの構文を持つ

• ファクト: リレーションを外延的に定義

• ルール: 推論規則 (あるファクトから別のファクトを導く)

• クエリ: ファクトを真にするような変数を見つける

Page 5: Datalogからsqlへの トランスレータを書いた話

ファクト

father(tara, masuo).mother(tara, sazae).

• リレーションを定義する構文 • SQLではINSERTに相当

father(sazae, namihei).mother(sazae, fune).

リレーション名

定数項(先頭が小文字)

Page 6: Datalogからsqlへの トランスレータを書いた話

ルール

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に相当

減少性があれば再帰的定義も可能

Page 7: Datalogからsqlへの トランスレータを書いた話

クエリ

? :- parent(X, Y).

? :- grandparent(X, Y).

? :- ancestor(tara, Y).

親子関係を列挙せよ

親子関係を列挙せよ

タラちゃんの祖先を列挙せよ

• 右に現れる変数を満たす値を列挙する

Page 8: Datalogからsqlへの トランスレータを書いた話

モチベーション

• 複雑なロジックをSQLで記述しようとするとすぐ長くなる

• 「BigQuery (行数)」

• SQLを書いていると毎回同じようなロジックを記述しているような感じがする

• Viewでもいいけど乱立したら管理が大変そう…

• => リレーショナルDBへのクエリをSQL以外で書きたい!

Page 9: Datalogからsqlへの トランスレータを書いた話

というわけで

• 書きました!

• https://github.com/yuki-takeichi/datalog-sql

Page 10: Datalogからsqlへの トランスレータを書いた話

demo

Page 11: Datalogからsqlへの トランスレータを書いた話

まとめ• Datalogを使うことで複雑なJOINを行うクエリや再帰クエリを部品化することができた

• しかも記述が簡素になった

• 変数って便利

• RDBのSQL以外のクエリ言語の可能性を考えてみるのも面白いかも