注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。
Ontology SQL は開発のベータ版段階にあり、一部の機能はお使いの環境で利用できない場合があります。開発が活発に進められている間は、機能が変更される可能性があります。ベータ機能の利用をご希望の場合は、Palantir サポートにお問い合わせください。
Ontology SQL は、使い慣れた SQL のセマンティクスをオントロジーデータに適用するために設計された、Foundry のオントロジーオブジェクト向け SQL クエリエンジンです。Ontology SQL では、オブジェクトタイプ、多対多リンク、インターフェースに対して SQL クエリを直接実行できます。Ontology SQL を使用すると、標準の Spark SQL 構文でオントロジーオブジェクトをクエリし、オブジェクトストレージに対して直接実行できます。Ontology SQL は Foundry の SQL インフラストラクチャを基盤として構築されており、変数、標準の SQL 関数、既存のオントロジーモデリングとのシームレスな統合をサポートする、単一の SELECT 文のインターフェースを提供します。
Ontology SQL は、オントロジーオブジェクトのクエリに統一された SQL の操作体験を提供します。Foundry のほかの SQL 製品と同じ SQL 方言とフロントエンドの操作体験を共有しつつ、専用のバックエンドで動作します。
SQL Studio または SQL Console のオブジェクトモードで Ontology SQL を使用できます。オブジェクトモードに切り替えると、標準の SQL 構文を使用してオブジェクトタイプをクエリできます。利用可能な操作の詳細については、SQL 方言のドキュメントを参照してください。
Ontology SQL クエリでは、リソース識別子(RID)を使用してオブジェクトタイプを参照します。基本的な構文は次のパターンに従います。
Copied!1SELECT * FROM `ri.ontology.main.object-type.<object-type-rid>`;
たとえば、Employee オブジェクトタイプのすべてのプロパティを取得するクエリは、次のように記述します。
Copied!1SELECT * FROM `ri.ontology.main.object-type.00000000-0000-0000-0000-000000000000`;
多対多リンクのクエリは、次のように記述できます。
Copied!1SELECT * FROM `ri.ontology.main.relation.<relation-rid>`;
クエリでは、すべてのオブジェクトプロパティを表示名ではなく、API名で参照します。クエリで利用可能な列は、オントロジーで定義されているプロパティのAPI名に直接対応します。プロパティのAPI名は Ontology Manager で確認できます。
たとえば、Employee オブジェクトにAPI名が employeeId、firstName、department のプロパティがある場合、クエリは次のように記述します。
Copied!1 2SELECT employeeId, firstName, department FROM ri.ontology.main.object-type.<employee-rid>;
一対一および一対多のリンクタイプは、Ontology SQL で使用するために Ontology Manager で定義する必要はありません。SQL を使用して、任意の方法でオブジェクトを結合できます。Ontology Manager で定義されたリンクを結合で使用するかどうかにかかわらず、パフォーマンスは同じです。
多対多リンクには結合テーブルが必要であり、Ontology Manager で定義する必要があります。SQL の結合で使用するには、SQL クエリでリンクタイプを選択する必要があります。
多対多リンクテーブルをクエリする場合、曖昧さを避けるため、列名は特定の規則に従います。
外部キー列の名前は、次のパターンを使用します。
<objectTypeApiName>_<relationApiName>
Person オブジェクトと Car オブジェクトの間に多対多の関係がある場合を考えます。
オントロジーの設定は次のとおりです。
Person(API名: person)
personIdPerson 側のリンクのAPI名: vehiclesCar(API名: car)
carIdCar 側のリンクのAPI名: driversri.ontology.main.relation.0以下は、特定の人が運転するすべての車を検索するクエリの例です。
Copied!1 2 3 4 5SELECT c.* FROM `ri.ontology.main.relation.0` AS linkTable INNER JOIN `car` AS c ON c.`carId` = linkTable.`person_vehicles` WHERE linkTable.`car_drivers` = 'person-123';
また、特定の車を運転するすべての人を検索するクエリの例です。
Copied!1 2 3 4 5SELECT p.* FROM `ri.ontology.main.relation.0` AS linkTable INNER JOIN `person` AS p ON p.`personId` = linkTable.`car_drivers` WHERE linkTable.`person_vehicles` = 'car-456';
多対多リンクを使用する場合は、常にテーブルエイリアスを使用してください。エイリアスがないと、列名が読みにくくなり、保守が難しくなることがあります。次の例を比較してください。
エイリアスあり(推奨):
Copied!1 2 3 4SELECT c.* FROM `ri.ontology.main.relation.0` AS linkTable INNER JOIN car AS c ON c.carId = linkTable.person_vehicles WHERE linkTable.car_drivers = 'person-123';
エイリアスなし(読みにくい):
Copied!1 2 3 4SELECT car.* FROM `ri.ontology.main.relation.0` INNER JOIN car ON car.carId = `ri.ontology.main.relation.0`.person_vehicles WHERE `ri.ontology.main.relation.0`.car_drivers = 'person-123';
Ontology SQL は、DECLARE 文による変数の使用に対応しています。
Copied!1 2 3 4 5DECLARE @minSalary DOUBLE = 75000.0, @department STRING = 'Engineering'; SELECT employeeId, salary FROM ri.ontology.main.object-type.<employee-rid> WHERE salary > @minSalary AND department = @department;
DECLARE 文はクエリの最初の文である必要があり、1回だけ使用できます。複数の変数を宣言する方法については、上記の例を参照してください。SET 文は使用できません。次の Palantir 独自の構文を使用して、オブジェクトセット変数を定義できます。
Copied!1 2 3 4DECLARE @employees `ri.ontology.main.object-type.<object-type-rid>`; SELECT employeeId FROM @employees;
INT や STRING などの変数タイプを指定する代わりに、オブジェクトタイプの RID をバッククォートで囲んで記述します。これにより、オブジェクトセットの形式が制約されます。オブジェクトセット変数のデフォルト値は、指定されたタイプのすべてのオブジェクトであり、上書きできません。
user や result など、一部のキーワードは予約されています。競合を避けるため、次のように列名をバッククォートで囲むことを推奨します。
Copied!1SELECT `user`, `result` FROM ri.ontology.main.object-type.<object-rid>;
WHERE 句の列に関数や変換を適用した場合、または絞り込みに計算列を使用した場合、クエリエンジンはインデックスを活用できません。これにより、クエリのパフォーマンスと計算の規模が大幅に制限されます。
インデックスを使用できなくなる次のパターンは避けてください。
Copied!1 2 3 4 5 6 7 8 9-- 計算列で絞り込む SELECT employeeId, salary, bonus FROM employee WHERE salary + bonus > 100000; -- 関数の結果で絞り込む SELECT employeeId, hireDate FROM employee WHERE YEAR(hireDate) = 2023;
インデックスを使用できるよう、次のパターンを推奨します。
Copied!1 2 3 4 5 6 7 8 9-- 元の列で直接絞り込みます SELECT employeeId, salary, bonus FROM employee WHERE salary > 100000 - bonus; -- 年を抽出する代わりに日付範囲の比較を使用します SELECT employeeId, hireDate FROM employee WHERE hireDate >= '2023-01-01' AND hireDate < '2024-01-01';
同じ原則は集計にも適用されます。クエリのいずれかの部分で変換された列(たとえば、colA + colB AS newColumn)を対象に絞り込むと、エンジンはインデックスを使用して一致する行を効率的に特定できなくなり、パフォーマンスが低下します。
必要がない場合は、ベクトル(埋め込み)などの大きい列をクエリで選択しないでください。分析に不要な場合、これらの列は有用な情報をもたらさず、クエリの実行時間とメモリー使用量を大幅に増加させる可能性があります。
SELECT クエリのみ: Ontology SQL は読み取り操作のみに対応しています。データ変更(INSERT、UPDATE、DELETE)やスキーマ定義(CREATE、ALTER、DROP)の操作は利用できません。SELECT 文: 変数用の DECLARE 文を除き、クエリごとに使用できる SELECT 文は1つだけです。OFFSET + LIMIT が10,000以下であれば、OFFSET を使用できます。たとえば、OFFSET 1000 LIMIT 1000 は動作しますが、OFFSET 9000 LIMIT 2000 は動作しません。アプリケーションを使用して Ontology SQL を操作する場合、それぞれのアプリケーションがより厳しい制限を適用することがあります。NotEnoughSparkResources エラーが発生します。| 機能 | 対応状況 |
|---|---|
| オブジェクトタイプ | 対応。オブジェクトタイプは Ontology Manager で定義する必要があります |
| 多対多リンク | 対応。リンクタイプは Ontology Manager で定義する必要があります |
| インターフェース | 対応 |
| 一対一および一対多リンク | 対応。Ontology Manager でリンクタイプを定義する必要がないため、Ontology SQL で直接使用できます |
| ブランチ | 対応 |
| シナリオ | 対応 |
| 書き込み操作 | 対応していません |