注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。

Ontology SQL

ベータ版

Ontology SQL は開発のベータ版段階にあり、一部の機能はお使いの環境で利用できない場合があります。開発が活発に進められている間は、機能が変更される可能性があります。ベータ機能の利用をご希望の場合は、Palantir サポートにお問い合わせください。

Ontology SQL は、使い慣れた SQL のセマンティクスをオントロジーデータに適用するために設計された、Foundry のオントロジーオブジェクト向け SQL クエリエンジンです。Ontology SQL では、オブジェクトタイプ、多対多リンク、インターフェースに対して SQL クエリを直接実行できます。Ontology SQL を使用すると、標準の Spark SQL 構文でオントロジーオブジェクトをクエリし、オブジェクトストレージに対して直接実行できます。Ontology SQL は Foundry の SQL インフラストラクチャを基盤として構築されており、変数、標準の SQL 関数、既存のオントロジーモデリングとのシームレスな統合をサポートする、単一の SELECT 文のインターフェースを提供します。

Ontology SQL のアーキテクチャ

Ontology SQL は、オントロジーオブジェクトのクエリに統一された SQL の操作体験を提供します。Foundry のほかの SQL 製品と同じ SQL 方言とフロントエンドの操作体験を共有しつつ、専用のバックエンドで動作します。

  • 統一された SQL 方言: Ontology SQL は、Furnace と同じ SQL パースレイヤーと ANSI 準拠の Spark SQL 方言を共有しており、Foundry の SQL エコシステム全体で構文と動作の一貫性を確保します。これにより、使い慣れた SQL の操作体験を提供しつつ、基盤となるクエリの計画と最適化はオントロジーデータに特化しています。
  • オントロジーデータプロバイダー: Ontology SQL は、オブジェクトタイプと多対多リンクテーブル向けの専用プロバイダーを導入しています。これらのプロバイダーは、オブジェクトプロパティ、主キー、リンク関係といったオントロジーの概念を SQL に対応したテーブルスキーマに変換し、標準の SQL 構文を使用してオントロジーデータをシームレスにクエリできるようにします。
  • オブジェクトストレージへの直接アクセス: クエリは、オブジェクトセットでも使用されている Foundry のオブジェクトストレージレイヤーに対して直接実行されます。この直接アクセスにより、中間的なデータ移動を必要とせず、パフォーマンスとコストの特性をほかのオントロジー操作と一貫したものに保ちます。
  • コンピュートエンジンの抽象化: 計画の作成後、オブジェクトストレージサービス(OSS)が、クエリを実行するコンピュートエンジンを決定します。コンピュートエンジンは、クエリの実行、データの読み取り、結果の返却を担い、自動リソース管理と組み込みのスケール制約によって安定したパフォーマンスを確保します。
  • 一貫した API の操作体験: Ontology SQL は Furnace と同様の API を提供し、一貫した開発者体験を実現するとともに、プラットフォームの進化に伴う将来の拡張を可能にします。
  • サポートされるコンピュートエンジン: Ontology SQL は Foundry のコンピュートエンジンの抽象化を基盤として構築されており、プラットフォームの進化に伴う将来の最適化や更新を可能にします。また、より大規模で複雑なクエリに対応するため、Ontology SQL の一部のクエリは Spark ↗ で実行できます。

Ontology SQL のはじめに

Ontology SQL にアクセスする

SQL Studio または SQL Console のオブジェクトモードで Ontology SQL を使用できます。オブジェクトモードに切り替えると、標準の SQL 構文を使用してオブジェクトタイプをクエリできます。利用可能な操作の詳細については、SQL 方言のドキュメントを参照してください。

最初のクエリを書く

Ontology SQL クエリでは、リソース識別子(RID)を使用してオブジェクトタイプを参照します。基本的な構文は次のパターンに従います。

Copied!
1 SELECT * FROM `ri.ontology.main.object-type.<object-type-rid>`;

たとえば、Employee オブジェクトタイプのすべてのプロパティを取得するクエリは、次のように記述します。

Copied!
1 SELECT * FROM `ri.ontology.main.object-type.00000000-0000-0000-0000-000000000000`;

多対多リンクのクエリは、次のように記述できます。

Copied!
1 SELECT * FROM `ri.ontology.main.relation.<relation-rid>`;

列名を理解する

クエリでは、すべてのオブジェクトプロパティを表示名ではなく、API名で参照します。クエリで利用可能な列は、オントロジーで定義されているプロパティのAPI名に直接対応します。プロパティのAPI名は Ontology Manager で確認できます。

たとえば、Employee オブジェクトにAPI名が employeeId、firstName、department のプロパティがある場合、クエリは次のように記述します。

Copied!
1 2 SELECT 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)
    • 主キー: personId
    • Person 側のリンクのAPI名: vehicles
  • オブジェクトタイプ: Car(API名: car)
    • 主キー: carId
    • Car 側のリンクのAPI名: drivers
  • リンクタイプの RID: ri.ontology.main.relation.0

以下は、特定の人が運転するすべての車を検索するクエリの例です。

Copied!
1 2 3 4 5 SELECT 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 5 SELECT 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 4 SELECT 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 SELECT 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 5 DECLARE @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回だけ使用できます。複数の変数を宣言する方法については、上記の例を参照してください。
  • 対応している変数タイプについては、SQL 方言のドキュメントを参照してください。
  • 変数名には、英字、数字、アンダースコアを使用できます。
  • SET 文は使用できません。

オブジェクトセット変数

次の Palantir 独自の構文を使用して、オブジェクトセット変数を定義できます。

Copied!
1 2 3 4 DECLARE @employees `ri.ontology.main.object-type.<object-type-rid>`; SELECT employeeId FROM @employees;

INT や STRING などの変数タイプを指定する代わりに、オブジェクトタイプの RID をバッククォートで囲んで記述します。これにより、オブジェクトセットの形式が制約されます。オブジェクトセット変数のデフォルト値は、指定されたタイプのすべてのオブジェクトであり、上書きできません。

予約キーワード

user や result など、一部のキーワードは予約されています。競合を避けるため、次のように列名をバッククォートで囲むことを推奨します。

Copied!
1 SELECT `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つだけです。
  • オブジェクトとデータセットの混在不可: クエリは、オントロジーオブジェクトのみ、またはデータセットのみを対象とする必要があります。単一のクエリで両者を混在させることには対応していません。

データ型の制約

  • ベクトル列(埋め込み)は技術的には対応していますが、サイズが大きく、SQL のコンテキストでは用途が限られるため、フロントエンドアプリケーションによって除外されることがよくあります。
  • そのほかのすべてのオントロジー列のデータ型に対応しており、SQL に対応するデータ型に自動的に変換されます。

規模とパフォーマンスの制約

  • 出力制限: Ontology SQL サービスは、結果を最大10,000行に切り詰めます。クエリで制限を指定しなくても、結果は10,000行が上限になります。OFFSET + LIMIT が10,000以下であれば、OFFSET を使用できます。たとえば、OFFSET 1000 LIMIT 1000 は動作しますが、OFFSET 9000 LIMIT 2000 は動作しません。アプリケーションを使用して Ontology SQL を操作する場合、それぞれのアプリケーションがより厳しい制限を適用することがあります。

リソースの制約

  • OSS Spark リソースが飽和している場合、ジョブは最大6秒間キューで待機することがあります。
  • クエリ実行のタイムアウトは20秒です。
  • これらの時間を超えると、NotEnoughSparkResources エラーが発生します。

プラットフォームの制約

  • Object Storage v2 のみ: Ontology SQL は現在、Object Storage v2 でのみ利用可能です。
  • オブジェクトセットの制限:
    • フロントエンドアプリケーションによっては、オブジェクトセットをクエリの入力として使用できます。
    • オブジェクトセットをクエリの出力として直接使用することはできません。

対応しているオントロジー機能

機能対応状況
オブジェクトタイプ対応。オブジェクトタイプは Ontology Manager で定義する必要があります
多対多リンク対応。リンクタイプは Ontology Manager で定義する必要があります
インターフェース対応
一対一および一対多リンク対応。Ontology Manager でリンクタイプを定義する必要がないため、Ontology SQL で直接使用できます
ブランチ対応
シナリオ対応
書き込み操作対応していません