Oracle Database 26ai新機能: ADBでSelect AIをProperty Graphに使ってみる
この記事は、2026年3月10日に Autonomous Database Serverless へ追加された Oracle Database 26ai の新機能 Select AI for Property Graphs を、できるだけシンプルな構成で試すものです。
前回は、Property Graph を作るところまでを扱いました。
今回はその続きとして、ADB 上に作成した Property Graph に対して、Select AI で自然言語問い合わせ を行います。
ポイントはシンプルで、AI Profile の object_list に Property Graph を指定するだけです。
すると Select AI が、GRAPH_TABLE を使ったグラフ問い合わせを生成してくれます。
この記事でやること
今回は設定を最小限に絞って、次の流れだけを扱います。
- テーブルを作成する
- Property Graph を作成する
- Select AI 用クレデンシャルを作成する
- Property Graph 専用の AI Profile を作成する
-
SELECT AIで自然言語問い合わせを実行する
この記事では、データ投入は省略します。
フォーカスするのは、Property Graph を Select AI の対象として認識させる設定です。
前提
- Autonomous Database Serverless が利用できること
-
DBMS_CLOUD/DBMS_CLOUD_AIが利用できること - OCI Generative AI を利用できること
- ここではスキーマ名を
DEMO_USERとします
1. テーブル作成
まずは、サプライチェーンを表現するためのテーブルを作成します。
CREATE TABLE "VEHICLE_MODELS"
( "MODEL_ID" NUMBER,
"MODEL_CODE" VARCHAR2(50) NOT NULL ENABLE,
"MODEL_NAME" VARCHAR2(200) NOT NULL ENABLE,
"CREATED_AT" TIMESTAMP (6) DEFAULT CURRENT_TIMESTAMP,
"DISPLAY_LABEL" VARCHAR2(200),
"IMPACT" NUMBER(1,0) DEFAULT 0 NOT NULL ENABLE,
PRIMARY KEY ("MODEL_ID")
USING INDEX ENABLE,
UNIQUE ("MODEL_CODE")
USING INDEX ENABLE
) ;
CREATE TABLE "FACTORIES"
( "FACTORY_ID" NUMBER,
"FACTORY_NAME" VARCHAR2(100) NOT NULL ENABLE,
"LOCATION" VARCHAR2(200),
"CREATED_AT" TIMESTAMP (6) DEFAULT CURRENT_TIMESTAMP,
"LATITUDE" NUMBER,
"LONGITUDE" NUMBER,
"DISPLAY_LABEL" VARCHAR2(200),
"HAS_STOPPED" NUMBER(1,0) DEFAULT 0 NOT NULL ENABLE,
"HAS_NORMAL" NUMBER(1,0) DEFAULT 0 NOT NULL ENABLE,
"IMPACT" NUMBER(1,0) DEFAULT 0 NOT NULL ENABLE,
PRIMARY KEY ("FACTORY_ID")
USING INDEX ENABLE
) ;
CREATE TABLE "PARTS"
( "PART_ID" NUMBER,
"PART_CODE" VARCHAR2(50) NOT NULL ENABLE,
"PART_NAME" VARCHAR2(200) NOT NULL ENABLE,
"LEAD_TIME_DAYS" NUMBER,
"SAFETY_STOCK" NUMBER,
"CREATED_AT" TIMESTAMP (6) DEFAULT CURRENT_TIMESTAMP,
"DISPLAY_LABEL" VARCHAR2(200),
"HAS_STOPPED" NUMBER(1,0) DEFAULT 0 NOT NULL ENABLE,
"HAS_NORMAL" NUMBER(1,0) DEFAULT 0 NOT NULL ENABLE,
"IMPACT" NUMBER(1,0) DEFAULT 0 NOT NULL ENABLE,
PRIMARY KEY ("PART_ID")
USING INDEX ENABLE,
UNIQUE ("PART_CODE")
USING INDEX ENABLE
) ;
CREATE TABLE "DEALERS"
( "DEALER_ID" NUMBER,
"DEALER_CODE" VARCHAR2(50) NOT NULL ENABLE,
"DEALER_NAME" VARCHAR2(200) NOT NULL ENABLE,
"REGION" VARCHAR2(100),
"CONTACT_INFO" VARCHAR2(500),
"CREATED_AT" TIMESTAMP (6) DEFAULT CURRENT_TIMESTAMP,
"DISPLAY_LABEL" VARCHAR2(200),
"IMPACT" NUMBER(1,0) DEFAULT 0 NOT NULL ENABLE,
PRIMARY KEY ("DEALER_ID")
USING INDEX ENABLE,
UNIQUE ("DEALER_CODE")
USING INDEX ENABLE
) ;
CREATE TABLE "PRODUCTION_SCHEDULE"
( "SCHEDULE_ID" NUMBER,
"MODEL_ID" NUMBER NOT NULL ENABLE,
"FACTORY_ID" NUMBER NOT NULL ENABLE,
"PLANNED_QUANTITY" NUMBER NOT NULL ENABLE,
"PLANNED_DATE" DATE NOT NULL ENABLE,
"STATUS" VARCHAR2(20),
"CREATED_AT" TIMESTAMP (6) DEFAULT CURRENT_TIMESTAMP,
CHECK (status IN ('PLANNED', 'IN_PROGRESS', 'DELAYED', 'COMPLETED')) ENABLE,
PRIMARY KEY ("SCHEDULE_ID")
USING INDEX ENABLE
) ;
ALTER TABLE "PRODUCTION_SCHEDULE" ADD FOREIGN KEY ("MODEL_ID")
REFERENCES "VEHICLE_MODELS" ("MODEL_ID") ENABLE;
ALTER TABLE "PRODUCTION_SCHEDULE" ADD FOREIGN KEY ("FACTORY_ID")
REFERENCES "FACTORIES" ("FACTORY_ID") ENABLE;
CREATE TABLE "PART_INVENTORY"
( "INVENTORY_ID" NUMBER,
"PART_ID" NUMBER NOT NULL ENABLE,
"FACTORY_ID" NUMBER NOT NULL ENABLE,
"QUANTITY" NUMBER NOT NULL ENABLE,
"STATUS" VARCHAR2(20),
"LAST_UPDATED" TIMESTAMP (6) DEFAULT CURRENT_TIMESTAMP,
CHECK (status IN ('NORMAL', 'LOW', 'OUT_OF_STOCK', 'STOPPED')) ENABLE,
PRIMARY KEY ("INVENTORY_ID")
USING INDEX ENABLE
) ;
ALTER TABLE "PART_INVENTORY" ADD FOREIGN KEY ("PART_ID")
REFERENCES "PARTS" ("PART_ID") ENABLE;
ALTER TABLE "PART_INVENTORY" ADD FOREIGN KEY ("FACTORY_ID")
REFERENCES "FACTORIES" ("FACTORY_ID") ENABLE;
CREATE TABLE "MODEL_BOM"
( "MODEL_BOM_ID" NUMBER,
"MODEL_ID" NUMBER,
"PART_ID" NUMBER,
"QUANTITY_REQUIRED" NUMBER,
"ASSEMBLY_ORDER" NUMBER,
"IMPACT" NUMBER(1,0) DEFAULT 0 NOT NULL ENABLE,
PRIMARY KEY ("MODEL_BOM_ID")
USING INDEX ENABLE
) ;
ALTER TABLE "MODEL_BOM" ADD CONSTRAINT "FK_MODEL_BOM_MODEL" FOREIGN KEY ("MODEL_ID")
REFERENCES "VEHICLE_MODELS" ("MODEL_ID") ENABLE;
ALTER TABLE "MODEL_BOM" ADD CONSTRAINT "FK_MODEL_BOM_PART" FOREIGN KEY ("PART_ID")
REFERENCES "PARTS" ("PART_ID") ENABLE;
CREATE TABLE "FACTORY_PRODUCES_PART"
( "PRODUCTION_ID" NUMBER,
"FACTORY_ID" NUMBER,
"PART_ID" NUMBER,
"PRODUCTION_CAPACITY" NUMBER,
"STATUS" VARCHAR2(20),
"IMPACT" NUMBER(1,0) DEFAULT 0 NOT NULL ENABLE,
PRIMARY KEY ("PRODUCTION_ID")
USING INDEX ENABLE
) ;
ALTER TABLE "FACTORY_PRODUCES_PART" ADD CONSTRAINT "FK_FP_FACTORY" FOREIGN KEY ("FACTORY_ID")
REFERENCES "FACTORIES" ("FACTORY_ID") ENABLE;
ALTER TABLE "FACTORY_PRODUCES_PART" ADD CONSTRAINT "FK_FP_PART" FOREIGN KEY ("PART_ID")
REFERENCES "PARTS" ("PART_ID") ENABLE;
CREATE TABLE "PART_DEPENDENCIES"
( "DEPENDENCY_ID" NUMBER,
"PARENT_PART_ID" NUMBER,
"CHILD_PART_ID" NUMBER,
"QUANTITY_REQUIRED" NUMBER,
"FACTORY_ID" NUMBER,
"IMPACT" NUMBER(1,0) DEFAULT 0 NOT NULL ENABLE,
PRIMARY KEY ("DEPENDENCY_ID")
USING INDEX ENABLE
) ;
ALTER TABLE "PART_DEPENDENCIES" ADD CONSTRAINT "FK_DEP_PARENT" FOREIGN KEY ("PARENT_PART_ID")
REFERENCES "PARTS" ("PART_ID") ENABLE;
ALTER TABLE "PART_DEPENDENCIES" ADD CONSTRAINT "FK_DEP_CHILD" FOREIGN KEY ("CHILD_PART_ID")
REFERENCES "PARTS" ("PART_ID") ENABLE;
ALTER TABLE "PART_DEPENDENCIES" ADD CONSTRAINT "FK_DEP_FACTORY" FOREIGN KEY ("FACTORY_ID")
REFERENCES "FACTORIES" ("FACTORY_ID") ENABLE;
CREATE TABLE "DEALER_ALLOCATION"
( "ALLOCATION_ID" NUMBER,
"DEALER_ID" NUMBER NOT NULL ENABLE,
"MODEL_ID" NUMBER NOT NULL ENABLE,
"SCHEDULED_DELIVERY_DATE" DATE NOT NULL ENABLE,
"QUANTITY" NUMBER NOT NULL ENABLE,
"STATUS" VARCHAR2(20),
"RELATED_SCHEDULE_ID" NUMBER,
"CREATED_AT" TIMESTAMP (6) DEFAULT CURRENT_TIMESTAMP,
"IMPACT" NUMBER(1,0) DEFAULT 0 NOT NULL ENABLE,
CHECK (status IN ('PLANNED', 'DELAYED', 'SHIPPED', 'DELIVERED')) ENABLE,
PRIMARY KEY ("ALLOCATION_ID")
USING INDEX ENABLE
) ;
ALTER TABLE "DEALER_ALLOCATION" ADD FOREIGN KEY ("DEALER_ID")
REFERENCES "DEALERS" ("DEALER_ID") ENABLE;
ALTER TABLE "DEALER_ALLOCATION" ADD FOREIGN KEY ("MODEL_ID")
REFERENCES "VEHICLE_MODELS" ("MODEL_ID") ENABLE;
ALTER TABLE "DEALER_ALLOCATION" ADD FOREIGN KEY ("RELATED_SCHEDULE_ID")
REFERENCES "PRODUCTION_SCHEDULE" ("SCHEDULE_ID") ENABLE;
2. Property Graph作成
次に、これらのテーブルをもとに Property Graph を作成します。
CREATE PROPERTY GRAPH SUPPLY_CHAIN_PG2
VERTEX TABLES (
parts KEY (part_id)
LABEL Part
PROPERTIES (
part_id, part_code, part_name, lead_time_days,
safety_stock, display_label, has_stopped, has_normal,
impact
),
factories KEY (factory_id)
LABEL Factory
PROPERTIES (
factory_id, factory_name, location, latitude,
longitude, display_label, has_stopped, has_normal,
impact
),
vehicle_models KEY (model_id)
LABEL Model
PROPERTIES (
model_id, model_code, model_name, display_label,
impact
),
dealers KEY (dealer_id)
LABEL Dealer
PROPERTIES (
dealer_id, dealer_code, dealer_name, region, display_label,
impact
)
)
EDGE TABLES (
-- 1. 車種 → 部品(車種が使う部品)
model_bom KEY (model_bom_id)
SOURCE KEY (model_id) REFERENCES vehicle_models(model_id)
DESTINATION KEY (part_id) REFERENCES parts(part_id)
LABEL REQUIRES_PART
PROPERTIES (
quantity_required, assembly_order,
impact
),
-- 2. 部品 → 部品(部品間の依存関係)
part_dependencies KEY (dependency_id)
SOURCE KEY (parent_part_id) REFERENCES parts(part_id)
DESTINATION KEY (child_part_id) REFERENCES parts(part_id)
LABEL DEPENDS_ON
PROPERTIES (
quantity_required, factory_id,
impact
),
-- 3. 工場 → 部品(工場が生産する部品)
factory_produces_part KEY (production_id)
SOURCE KEY (factory_id) REFERENCES factories(factory_id)
DESTINATION KEY (part_id) REFERENCES parts(part_id)
LABEL PRODUCES
PROPERTIES (production_capacity, status, impact),
-- 4. 工場 → 部品(在庫)
part_inventory KEY (inventory_id)
SOURCE KEY (factory_id) REFERENCES factories(factory_id)
DESTINATION KEY (part_id) REFERENCES parts(part_id)
LABEL STOCKS
PROPERTIES (quantity, status, last_updated),
-- 5. 工場 → 車種(生産スケジュール)
production_schedule KEY (schedule_id)
SOURCE KEY (factory_id) REFERENCES factories(factory_id)
DESTINATION KEY (model_id) REFERENCES vehicle_models(model_id)
LABEL ASSEMBLES
PROPERTIES (planned_quantity, planned_date, status),
-- 6. 車種 → ディーラー(配車)
dealer_allocation KEY (allocation_id)
SOURCE KEY (model_id) REFERENCES vehicle_models(model_id)
DESTINATION KEY (dealer_id) REFERENCES dealers(dealer_id)
LABEL ALLOCATED_TO
PROPERTIES (
scheduled_delivery_date, quantity, status, related_schedule_id,
impact
)
);
ここで Select AI に渡す対象は、個々の表ではなく、作成した Property Graph SUPPLY_CHAIN_PG2 です。
3. クレデンシャル作成
Select AI で OCI モデルを使うために、まずはクレデンシャルを作成します。
以下は マスク済みの例 です。
BEGIN
DBMS_CLOUD.create_credential(
credential_name => 'AI_CREDENTIAL',
user_ocid => 'ocid1.user.oc1..***************',
tenancy_ocid => 'ocid1.tenancy.oc1..***************',
private_key => '-----BEGIN PRIVATE KEY-----
<YOUR_PRIVATE_KEY>
-----END PRIVATE KEY-----',
fingerprint => '**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**'
);
END;
/
4. AI Profile作成
Property Graph を Select AI の対象にするには、AI Profile の object_list に Property Graph 名 を指定します。
ここでは SUPPLY_CHAIN_PG2 を指定し、Profile 名を OCI_GENAI_GRAPH とします。
BEGIN
BEGIN DBMS_CLOUD_AI.drop_profile(profile_name => 'OCI_GENAI_GRAPH');
EXCEPTION WHEN OTHERS THEN NULL; END;
DBMS_CLOUD_AI.CREATE_PROFILE(
profile_name => 'OCI_GENAI_GRAPH',
attributes => '{
"provider": "oci",
"credential_name": "AI_CREDENTIAL",
"model": "xai.grok-4.20-0309-non-reasoning",
"region": "us-chicago-1",
"object_list":[
{"owner":"DEMO_USER","name":"SUPPLY_CHAIN_PG2"}]}'
);
END;
/
この設定で押さえておきたいポイントは次の 3 つです。
-
credential_nameは、先ほど作成したクレデンシャル名 -
object_listには 表名ではなく Property Graph 名 を指定する - Property Graph を使う Profile は、Graph 専用 にしておく
特に最後が重要です。
Property Graph を object_list に入れた Profile は、表やビューなどのリレーショナル・オブジェクトと混在させず、Graph 専用 Profile として作成します。
制限事項
プロパティ・グラフのSelect AIでは、次の機能はサポートされません。
- 合成データ生成
- プロパティグラフとAIプロファイル内のほかのオブジェクトタイプの混在
- サポートされていない断続的なクエリー
5. Property Graphに対してSELECT AIする
Profile を作成したら、現在のセッションで有効化します。
EXEC DBMS_CLOUD_AI.SET_PROFILE(profile_name => 'OCI_GENAI_GRAPH');
これは、そのセッションで使うアクティブな AI Profile を切り替えるためのコマンドです。
今回の記事では、作成した Profile 名は OCI_GENAI_GRAPH なので、Property Graph に問い合わせるときはこれを使います。
これで、SELECT AI をそのまま実行できるようになります。
5-1. SHOWSQL で生成SQLを確認する
最初は SHOWSQL で、どんなグラフ問い合わせが生成されるかを見るのがおすすめです。
SELECT AI SHOWSQL 影響フラグが立っている部品を使う車種を一覧してください;
レスポンス例:
SELECT DISTINCT model_name, part_name
FROM GRAPH_TABLE("DEMO_USER"."SUPPLY_CHAIN_PG2"
MATCH (m IS Model)-[r IS REQUIRES_PART]->(p IS Part)
WHERE p.impact = 1
COLUMNS (
m.model_name AS model_name,
p.part_name AS part_name
)
)
ORDER BY model_name, part_name;
SELECT AI が、Property Graph に対する自然言語プロンプトを、GRAPH_TABLE ベースの SQL/PGQ に変換していることが分かります。
5-2. SELECT AI <自然言語> の形でそのまま実行する
SHOWSQL を付けない場合は、デフォルトで RUNSQL として扱われます。
つまり、自然言語から生成されたグラフ問い合わせをそのまま実行し、SQL文そのものではなく結果セット を返します。
SELECT AI 影響フラグが立っている部品を使う車種を一覧してください;
レスポンス例:
MODEL_NAME
------------------------------
Sedan LX
SUV EX
Hybrid Touring
最初から SELECT AI だけで使えるのが便利ですが、実運用ではまず SHOWSQL で生成内容を確認してから実行するほうが安心です。
5-3. NARRATE で自然文の返答を見る
SELECT AI NARRATE 供給停止の影響を受ける車種と配車先ディーラーを要約してください;
レスポンス例:
供給停止状態の部品に依存する車種が複数見つかりました。
それらの車種に対する配車計画を持つディーラーも確認できるため、
部品停止の影響範囲を車種から販売店までまとめて把握できます。
実際の結果は投入データに依存します。
まずはSHOWSQLで生成SQLを確認し、その後RUNSQLやNARRATEに進む流れが分かりやすいです。
まとめ
今回は、2026年3月10日にリリースされた Oracle Database 26ai の新機能 Select AI for Property Graphs を、ADB 上で最小構成で試す流れを整理しました。
やることはシンプルです。
- テーブルを作る
- Property Graph を作る
- クレデンシャルを作る
- Property Graph 名を
object_listに指定した AI Profile を作る -
SET_PROFILE後にSELECT AIを実行する
これだけで、部品・工場・車種・ディーラーの関係を、自然言語で問い合わせられるようになります。
サプライチェーンのように、関係のたどり方自体が重要なデータでは、表を直接たたくよりも、Property Graph を介して Select AI を使うほうが、かなり分かりやすくなります。
参考
- Oracle公式ドキュメント: プロパティ・グラフのSelect AI
https://docs.oracle.com/ja-jp/iaas/autonomous-database-serverless/doc/select-ai-property-graphs.html - Oracle公式ドキュメント: Select AIの使用例
https://docs.oracle.com/ja-jp/iaas/autonomous-database-serverless/doc/select-ai-examples.html - Oracle Autonomous AI Database Serverless の新機能
https://docs.oracle.com/ja-jp/iaas/autonomous-database-serverless/doc/whats-new-adwc.html - 前回記事
https://qiita.com/kanakani/items/6d8a1f87ecd51e9be4ca