はじめに
Oracle Autonomous Database(ADB)のSELECT AI機能で自然言語のプロンプトをプロパティグラフに対するクエリ(PGQ: Property Graph Query)に変換する機能 Select AI for Property Graphsが追加されました。日本語・英語の問いかけを SELECT AI 構文や DBMS_CLOUD_AI.GENERATE 関数でそのまま実行でき、LLM(大規模言語モデル)が Oracle SQL/PGQ の GRAPH_TABLE 演算子を自動生成して結果を返してくれることを試してみました。
プロパティグラフは、顧客と商品の購買関係、人物どうしの知り合い関係など、エンティティ間の「繋がり」を表現するのに適したデータ構造です。通常はグラフクエリの専門知識が必要ですが、Select AI を使うことで SQL・グラフの知識がなくてもデータにアクセスできます。
| 操作方法 | 構文 | 特徴 |
|---|---|---|
| SQL コマンドライン | SELECT AI <プロンプト> |
SQL*Plus / Database Actions で簡単に実行 |
| PL/SQL 関数 | DBMS_CLOUD_AI.GENERATE(prompt, profile_name, action) |
アプリケーションやスクリプトから呼び出し可能 |
主な作業ステップ
- プロパティグラフの作成(テーブル +
CREATE PROPERTY GRAPH) - AI プロファイルの作成
-
runsql・showsql・narrate・explainsqlの各アクション実行
事前準備
- Autonomous Database Serverless(ADB-S)が作成済みであること
- OCI Generative AI または OpenAI など対応プロバイダーへのアクセス権限があること
- 以下の権限を持つ DB ユーザーであること
-
ADMINユーザー(または DBA 権限相当):ネットワーク ACL 設定・権限付与のため -
DBMS_CLOUD_AIパッケージのEXECUTE権限:Select AI 操作のため -
DBMS_CLOUDパッケージのEXECUTE権限:資格証明作成のため
-
- Select AI の前提条件(資格証明・ネットワーク ACL・権限付与)
→ Perform Prerequisites for Select AI- 使用するプロバイダーの API キーまたは OCI API キーが発行済みであること - SQL*Plus または Database Actions(SQL ワークシート)で ADB-S に接続できること
- Oracle Database 23ai 以降の
CREATE PROPERTY GRAPH構文が ADB-S でサポートされていること
手順
Step 1: サンプルテーブルとプロパティグラフを作成
検証に使うテーブルとプロパティグラフを作成します。ここでは「顧客(Customers)」「商品(Products)」「購買関係(Buys)」の3テーブルを作成します。
-- テーブルの作成
CREATE TABLE Customers (
ID NUMBER,
NAME VARCHAR2(10),
AGE NUMBER
);
CREATE TABLE Products (
ID NUMBER,
NAME VARCHAR2(10)
);
CREATE TABLE Buys (
ID NUMBER,
CUST NUMBER,
PROD NUMBER,
PRICE NUMBER
);
-- サンプルデータの投入
INSERT INTO Customers VALUES(1, 'Kate', 25);
INSERT INTO Customers VALUES(2, 'Mark', 30);
INSERT INTO Customers VALUES(3, 'Alex', 25);
COMMIT;
INSERT INTO Products VALUES(1, 'Dress');
INSERT INTO Products VALUES(2, 'Socks');
INSERT INTO Products VALUES(3, 'Shirt');
INSERT INTO Products VALUES(4, 'Pants');
COMMIT;
INSERT INTO Buys VALUES(1, 1, 1, 50); -- Kate が Dress を購入
INSERT INTO Buys VALUES(2, 1, 2, 20); -- Kate が Socks を購入
INSERT INTO Buys VALUES(3, 2, 3, 40); -- Mark が Shirt を購入
INSERT INTO Buys VALUES(4, 3, 4, 50); -- Alex が Pants を購入
COMMIT;
次に、上記テーブルを使ってプロパティグラフ G を作成します。
-- プロパティグラフの作成
CREATE PROPERTY GRAPH G
VERTEX TABLES (
PRODUCTS KEY(ID),
CUSTOMERS KEY(ID)
)
EDGE TABLES (
BUYS KEY(ID)
SOURCE KEY(CUST) REFERENCES CUSTOMERS(ID)
DESTINATION KEY(PROD) REFERENCES PRODUCTS(ID)
PROPERTIES(PRICE)
);
注意:
CREATE PROPERTY GRAPH構文は Oracle Database 23ai 以降でサポートされています。ADB-S のバージョンを確認してから実行してください。
Step 2: AI プロファイルを作成
プロパティグラフ G を参照する AI プロファイルを作成します。object_list にプロパティグラフのオーナーと名前を指定します。
OCI Generative AI を使う場合(デフォルトモデル)
BEGIN
DBMS_CLOUD_AI.CREATE_PROFILE(
profile_name => 'OPGAI',
attributes => '{"provider": "oci",
"credential_name": "OCI_CRED",
"object_list": [{"owner": "<DBユーザー名>", "name": "G"}]
}');
END;
/
文が処理されました。
Step 3: AI プロファイルをセッションに設定
作成したプロファイルを現在のセッションで有効化します。
-- プロファイルを有効化
EXEC DBMS_CLOUD_AI.SET_PROFILE(profile_name => 'OPGAI');
PL/SQLプロシージャが正常に完了しました。
-- 現在のプロファイルを確認
SELECT DBMS_CLOUD_AI.GET_PROFILE() FROM DUAL;
実行結果の例:
DBMS_CLOUD_AI.GET_PROFILE()
--------------------------------------------------------------------------------
"OPGAI"
Step 4: 自然言語でプロパティグラフをクエリする
プロファイルを設定したら、SELECT AI 構文で自然言語のプロンプトを実行します。
runsql(デフォルト):SQL を実行して結果を返す
-- ドレスを買った顧客を調べる
SQL> SELECT AI who bought a dress;
実行結果の例:
CUSTOMER_N
----------
{"GRAPH_OWNER":"WKSP_APPS","GRAPH_NAME":"G","ELEM_TABLE":"GCUSTOMERS","KEY_VALUE":{"ID":1}}
-- 顧客数を調べる
SQL> SELECT AI how many customers are there;
実行結果の例:
TOTAL_CUSTOMERS
---------------
3
showsql:生成された PGQ を確認する
SQL> SELECT AI SHOWSQL how many customers are there;
実行結果の例:
RESPONSE
--------------------------------------------------------------------------------
SELECT COUNT(*) AS total_customers
FROM GRAPH_TABLE("WKSP_APPS"."G"
MATCH (c IS "GCUSTOMERS")
COLUMNS (1 as dummy_value))
LLM が GRAPH_TABLE 演算子を使った PGQ 構文を自動生成していることが確認できます。
explainsql:生成 SQL の解説を確認する
SQL> SELECT AI EXPLAINSQL how many customers are there;
実行結果の例:
RESPONSE
--------------------------------------------------------------------------------
SELECT COUNT(*) AS customer_count
FROM GRAPH_TABLE("G"
MATCH (v IS "CUSTOMERS")
COLUMNS(1 as dummy_value))
Explanation:
This SQL/PGQ query counts the total number of customers in the property graph "WKSP_APPS"."G". The `GRAPH_TABLE` operator is used to access the graph data. The `MATCH` clause specifies a pattern to match all vertices with the label "GCUSTOMERS", which represents customers. The `COLUMNS` clause includes a dummy value to satisfy the requirement that it must not be empty. Finally, the `SELECT` statement outside of the `GRAPH_TABLE` operator uses the `COUNT(*)` function to count all matched customer vertices, and the result is aliased as `total_customers`.
narrate:結果を自然言語で受け取る
SQL> SELECT AI NARRATE how many products are there;
実行結果の例:
RESPONSE
--------------------------------------------------------------------------------
There are four products.
SQL> SELECT AI NARRATE 製品数は?;
実行結果の例:
RESPONSE
--------------------------------------------------------------------------------
製品の総数は4です。
Step 5: DBMS_CLOUD_AI.GENERATE 関数で実行する
SQL コマンドライン以外に、DBMS_CLOUD_AI.GENERATE 関数を使ってプロシージャから呼び出すこともできます。アプリケーション組み込みに適した方法です。
-- showsql アクション
SELECT DBMS_CLOUD_AI.GENERATE(
prompt => '顧客数は?',
profile_name => 'OPGAI',
action => 'showsql')
FROM dual;
実行結果の例:
DBMS_CLOUD_AI.GENERATE(...)
--------------------------------------------------------------------------------
SELECT COUNT(*) AS customer_count
FROM GRAPH_TABLE("WKSP_APPS"."G"
MATCH (v IS "GCUSTOMERS")
COLUMNS (1 as dummy_value))
-- narrate アクション
SELECT DBMS_CLOUD_AI.GENERATE(
prompt => '製品数は?',
profile_name => 'OPGAI',
action => 'narrate')
FROM dual;
実行結果の例:
DBMS_CLOUD_AI.GENERATE(PROMPT=>'製品数は?',PROFILE_NAME=>'OCI_OPENAI',ACTION=>'NARRA
--------------------------------------------------------------------------------
製品の総数は4です。
Step 6: クリーンアップ(作成リソースの削除)
検証が完了したら、作成したプロファイル・グラフ・テーブルを削除します。
-- セッションのプロファイル設定をクリア
BEGIN
DBMS_CLOUD_AI.CLEAR_PROFILE;
END;
/
-- プロファイルを削除
EXEC DBMS_CLOUD_AI.DROP_PROFILE('OPGAI');
-- プロパティグラフを削除
DROP PROPERTY GRAPH G;
-- テーブルを削除
DROP TABLE Buys;
DROP TABLE Products;
DROP TABLE Customers;
注意: プロパティグラフはエッジテーブルが参照しているテーブルに依存しているため、グラフを先に削除してからテーブルを削除する順序を守ってください。
制限事項
Select AI for Property Graphs には、2026年3月時点(Oracle AI Database 26ai)でサポートされていないクエリパターンが存在します。
| カテゴリ | 非サポートの内容 | プロンプト例 |
|---|---|---|
| NOT EXISTS サブクエリ |
WHERE NOT EXISTS (SELECT 1 FROM GRAPH_TABLE ...) パターン |
「Scott を知らない人を見つけてください」 |
| OPTIONAL MATCH |
OPTIONAL MATCH 句によるオプショナルパターン |
「いいねしていない人も含めて全員のいいね数を表示してください」 |
| 非制限再帰パス | 上限なし量化子(->*)を使う再帰パスクエリ |
「Scott が到達できる全員を見つけてください」 |
| 複数の GRAPH_TABLE | 複数の GRAPH_TABLE 演算子を必要とするクエリ(LLM が苦手) |
「Hans と同じ投稿をいいねしている人を見つけてください」 |
| 集約・グルーピング |
COLUMNS 句内への集約関数の誤配置(LLM が混同しやすい) |
「全ユーザーのいいね数の平均を求めてください」 |
サポートされているパターン(参考):
| カテゴリ | 説明 |
|---|---|
| ラベルなしノード・エッジのマッチング |
MATCH (v) や MATCH (v1) -[e]-> (v2)
|
| ラベルありエッジのマッチング | MATCH (p IS PERSON) -[e IS KNOWS]-> (p2 IS PERSON) |
| 制限付き再帰パス |
MATCH (a) -[e IS KNOWS]->{1,3} (b)(1〜3ホップ) |
| ノード・エッジプロパティのアクセス |
p.FIRSTNAME、JSON_QUERY(p.JSONPROP, '$.key1')
|
| フィルタリング | WHERE UPPER(p.FIRSTNAME) = UPPER('John') |
| ソート・件数制限 |
ORDER BY、OFFSET ... FETCH NEXT ... ROWS ONLY
|
おわりに
本記事では Oracle Autonomous Database の Select AI for Property Graphs を試しました。
-
CREATE PROPERTY GRAPHで作成したグラフを AI プロファイルのobject_listに指定するだけで、自然言語によるグラフクエリが実行可能になることを確認しました。 -
runsql・showsql・narrate・explainsqlの各アクションが、通常のテーブルクエリと同様にプロパティグラフでも動作することを確認しました。