NTT DATA

DATA INSIGHT

NTTデータの「知見」と「先見」を社会へ届けるメディア

絞り込み検索
キーワードで探す
カテゴリで探す
サービスで探す
業種で探す
トピックで探す
キーワードで探す
カテゴリで探す
サービスで探す
業種で探す
トピックで探す
2021年3月24日技術ブログ

「非開発職にもSQLを!」を技術で叶えてみた

誰でも簡単にSQLを書ける時代を目指し、研究開発したSQLの自動生成技術について紹介する。

「非開発職であってもSQL(※1)くらいは書けた方がよい」という声を各所で聞くようになりました。デジタル・トランスフォーメーションへの取り組みが拡大するにあたり、蓄積したデータを分析し、ビジネス的な価値を創出することの重要性が高まっています。より多くの人がデータを分析し、それぞれの業務の価値を高める社会は魅力的です。本記事では、プログラミングの知識を持たない人でもSQLを使いこなせるようにする技術の研究開発について紹介します。

※1
SQLは関係データベースに蓄積されたデータを分析するためのクエリ言語です。

エンドユーザ・プログラミング

プログラミングの知識を持たない人でもプログラムを作れるようにする、という考え方は「エンドユーザ・プログラミング」として古くから知られています。代表的なアプローチとして近年注目を集めているのがローコード・プラットフォームです。ローコード・プラットフォームでは、GUI操作により視覚的に画面、データ、ロジックといったアプリケーションを設計します。あらかじめ提供された部品を上手く組み合わせることで、高度なプログラミングの知識を持たないエンドユーザでもシステム開発に関わることができます。詳しくは過去の記事(※2)をご覧ください。

※2
https://www.nttdata.com/jp/ja/data-insight/2019/0304/

私たちの研究チームでは、エンドユーザ・プログラミングに対する別のアプローチとしてProgramming by Example(PBE,例によるプログラミング)という技術に着目しています。PBEは、プログラムが満たすべき入出力の例が与えられたとき、それを実現するようなプログラムを自動生成する技術です。

たとえば、ユーザが文字列を加工するプログラムを作りたい状況を想定します。そのユーザは「住所の文字列から郵便番号を抽出したい」としましょう。たくさんの住所を処理する必要があるとき、ひとつひとつ手作業で郵便番号を抽出してゆくのは骨が折れます。そこでPBEの登場です。ユーザは入力とその出力の例として以下のようなデータを与えます。

  • 入力:“〒135-6033 東京都江東区豊洲3-3-3 豊洲センタービル”
  • 出力:”135-6033”

PBEツールはこの入出力例を受け取り、この文字列加工を行うプログラムを自動生成します。その結果、ユーザは、すべての住所の文字列から自動的に郵便番号を抽出できるようになります。実は、このような機能はMS Excelに「フラッシュフィル」として搭載されています。

プログラミングの本質的な難しさは処理の抽象化にあると考えています。つまり、正しいプログラムを作るには、どんな入力に対しても正しく処理が行われるように設計する必要があります。一方でPBEのもとでは、ユーザは具体的な入出力例のみを考慮すればよく、たとえば「郵便番号のハイフンが抜けている場合」などを考慮した上でプログラム全体を設計する必要はありません。郵便番号のハイフンが抜けている場合はどんな出力になるべきか、を例として与えればよいのです。

ここで、PBEとローコード・プラットフォームの違いを整理します。コンピュータは与えられた命令の通りにプログラムを実行するだけの機械なので、プログラミングでは「コンピュータがどうふるまうべきか」を“完全な仕様”として表現する必要があります。ローコード・プラットフォームは、この“完全な仕様”を表現するために、ユーザーフレンドリなGUIや部品を提供します。一方で、PBEはユーザに“完全な仕様”を求めません。ユーザが与えた“具体的な仕様”から“完全な仕様”を復元するのが大きな特徴です。もちろんPBEの方が実現するのが技術的には難しいです。(図1)

図1:ローコード・プラットフォームとProgramming by Exampleの違い

図1:ローコード・プラットフォームとProgramming by Exampleの違い

独自技術~入出力例からSQLを自動生成する技術~

PBEの研究開発を行っている私たちのチームでは、入出力例からSQLクエリを自動生成する手法PATSQLを開発しました。本手法は、奈良先端科学技術大学院大学(NAIST)と共同で開発を行っており、デモツールをNAISTのページ(※3)にて公開しています。このデモツールでは、入出力例として具体的なテーブルを与えると、それを実現するようなSQLクエリが自動で生成される様子が確認できます(図2)。

図2:PATSQLのデモページ。サブクエリをもつSQLクエリが自動生成される例

※3
https://naist-se.github.io/patsql/index.html?lang=jpn

私たちが開発した手法の中身について簡単に説明します。入出力例からSQLクエリを自動生成する研究は以前から存在したのですが、本手法では、従来手法より複雑なSQLクエリを高速に自動生成することを可能としました。PBEの手法は「プログラム合成」と呼ばれる研究領域のひとつとして長きにわたって研究されてきたのですが、その主な関心はより″汎用的″なプログラムを効率的に生成することでした。一方で私たちは、自動生成のアルゴリズムをSQLという“具体的”なドメインに特化させることで効率的な手法を実現しました。特にSQLの基礎をなす関係代数がもつ性質を上手く利用することで、従来手法が抱えていた計算量が爆発的に増加する課題を解決しました。技術的な詳細はNAISTのニュースリリース(※4)やarXiv上の論文(※5)をご覧ください。

※4
http://www.naist.jp/pressrelease/2020/11/007406.html
※5
https://arxiv.org/abs/2010.05807

PBEをはじめとするプログラム合成の手法は、今現在も世界中の研究者たちによって盛んに研究されています。(※6)近年になって、機械学習を用いてプログラムを効率的に生成する手法も数多く提案されています。しかしながら、エンドユーザのプログラミングを支援する実用的な技術として役立っているものはほとんど無いのが現状です。私たちが開発したPATSQLも同様に現状すぐに実用に耐えうるとは考えていませんが、地道にエンドユーザからのフィードバックを収集し改善を続けることが、真に実用的な技術の実現につながると信じています。

※6
https://www.nttdata.com/jp/ja/data-insight/2019/0401/

最後に、実用的な技術を開発することに加え、私たちにはプログラム合成に関するコミュニティを醸成するという目標があります。世界中の研究論文からアイデアを集めて実用的な技術に落とし込む。シンプルですが一筋縄ではいかないことばかりです。ともに課題を共有し解決することに興味がある方がいらっしゃいましたら、「お問い合わせ」ボタンよりご一報ください。

- NTTデータは、「これから」を描き、その実現に向け進み続けます -
お問い合わせ