11
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ADBのSELECT AIがProperty Graphに対応したので試してみた。

11
Posted at

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 を使ったグラフ問い合わせを生成してくれます。

この記事でやること

今回は設定を最小限に絞って、次の流れだけを扱います。

  1. テーブルを作成する
  2. Property Graph を作成する
  3. Select AI 用クレデンシャルを作成する
  4. Property Graph 専用の AI Profile を作成する
  5. 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_listProperty 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を確認し、その後 RUNSQLNARRATE に進む流れが分かりやすいです。


まとめ

今回は、2026年3月10日にリリースされた Oracle Database 26ai の新機能 Select AI for Property Graphs を、ADB 上で最小構成で試す流れを整理しました。

やることはシンプルです。

  1. テーブルを作る
  2. Property Graph を作る
  3. クレデンシャルを作る
  4. Property Graph 名を object_list に指定した AI Profile を作る
  5. SET_PROFILE 後に SELECT AI を実行する

これだけで、部品・工場・車種・ディーラーの関係を、自然言語で問い合わせられるようになります。

サプライチェーンのように、関係のたどり方自体が重要なデータでは、表を直接たたくよりも、Property Graph を介して Select AI を使うほうが、かなり分かりやすくなります。


参考

11
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?