QL とは?
QL は、宣言型のオブジェクト指向クエリ言語であり、階層データ構造 (特にソフトウェア成果物を表すデータベース) を効率的に分析できるように最適化されています。
データベースとは、整理されたデータ コレクションです。 最も一般的に使用されているデータベース モデルは、データを表に格納するリレーショナル モデルです。 SQL (構造化照会言語) はリレーショナル データベースで最も一般的に使用されているクエリ言語です。
クエリ言語の目的は、データベースに格納されている情報について問い合わせできるプログラミング プラットフォームを提供することです。 データベース管理システムは、データのストレージと運用を管理し、クエリ メカニズムを提供します。 クエリでは通常、関連するデータベース エンティティを参照し、結果によって満足されなければならないさまざまな条件 (述語と呼ばれます) を指定します。 クエリの評価では、これらの述語を確認し、結果を生成する必要があります。 優れたクエリ言語とその実装に求められる特性には、次のようなものがあります。
- 宣言型の指定: 宣言型の指定では、結果を計算する手順を提供するのではなく、結果によって満足されなければならないプロパティを記述します。 データベース クエリ言語のコンテキストでは、宣言型の指定を使用することで、基になるデータベース管理システムとクエリ処理手法の詳細が抽象化されます。 これにより、クエリの記述が大幅に簡素化されます。
- 表現力: 優れたクエリ言語を使用すると、複雑なクエリを記述できます。 これにより、この言語を幅広く適用できます。
- 効率的な実行: クエリは複雑になる可能性があり、データベースも非常に大規模になることがあるため、クエリ言語の実装でクエリを効率的に処理して実行することが重要です。
このユニットでは、QL プログラミング言語の基本的な機能について学習し、独自のカスタム クエリを記述したり、利用できる既存のオープン ソース クエリの理解を深めたりできるようにします。
QL の構文
QL の構文は SQL に似ていますが、QL のセマンティクスは、クエリ言語としてよく使用されている宣言型ロジック プログラミング言語である Datalog に基づきます。 これによって QL が基本的にロジック言語になり、QL のすべての演算は論理演算になります。 さらに、QL では Datalog から再帰述語を継承し、集計のサポートが追加されるので、複雑なクエリも簡潔でシンプルになります。 たとえば、人の親子関係を含むデータベースについて考えてみます。 人の子孫の数を確認する場合、通常は次のようにします。
- 特定の人の子孫 (つまり、子または子の子孫) を見つけます。
- 前の手順で見つかった子孫の数をカウントします。
このプロセスを QL で記述すると、上記の構造によく似たものになります。 この例では、再帰を使用して特定の人のすべての子孫を見つけ、集計によって子孫の数をカウントしています。 この言語の宣言型の性質により、手順の詳細を追加せずに、これらの手順を最終的なクエリに変換できます。 QL コードは次のようになります。
Person getADescendant(Person p) {
result = p.getAChild() or
result = getADescendant(p.getAChild())
}
int getNumberOfDescendants(Person p) {
result = count(getADescendant(p))
}
オブジェクト指向
オブジェクト指向は QL の重要な機能です。 オブジェクト指向の利点はよく知られています。モジュール性が向上し、情報を非表示にすることができ、コードを再利用できます。 QL は、論理的な基盤を損なうことなく、これらすべての利点を備えています。 これは、クラスが述語として、継承が推測としてモデル化される単純なオブジェクト モデルを定義することで実現します。 サポートされているすべての言語で使用できるライブラリでは、クラスと継承が多く活用されます。
QL と汎用プログラミング言語
汎用プログラミング言語と QL の間の概念と機能上の主な相違点を次に示します。
- QL には、変数への割り当てやファイル システム操作などの命令型の機能はありません。
- QL はタプルのセットに対して動作し、クエリは、クエリの結果を定義するセット操作の複雑なシーケンスと見ることができます。
- QL のセット ベースのセマンティクスを使用すると、値のコレクションを非常に自然な形で処理でき、それらを効率的に格納、インデックス付け、走査する心配をする必要はありません。
オブジェクト指向プログラミング言語の場合、クラスをインスタンス化するには、クラスのそのインスタンスの状態を保持するための物理メモリを割り当てて、オブジェクトを作成する必要があります。 QL では、クラスは、既に存在する値のセットを記述する論理プロパティにすぎません。