OpenFlights % sql wksp_apexdev@localhost/freepdb1
SQLcl: 木 9月 11 13:26:36 2025のリリース25.2 Production
Copyright (c) 1982, 2025, Oracle. All rights reserved.
パスワード (**********?) ******
接続先:
Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.9.0.25.07
SQL>
SQL> create table ebaj_openflights_airports(
2 airport_id number primary key,
3 airport_name varchar2(80 char) not null,
4 city varchar2(40 char),
5 country varchar2(40 char),
6 iata varchar2(3 char),
7 icao varchar2(4 char),
8 latitude number,
9 longitude number,
10 altitude number,
11 timezone_offset number,
12 timezone_dst varchar2(1 char),
13 timezone_tz_name varchar2(40 char),
14 airport_type varchar2(8 char),
15 source_of_data varchar2(40 char)
16* );
Table EBAJ_OPENFLIGHTS_AIRPORTSは作成されました。
SQL> /*
2 * 運行会社
3 * https://raw.githubusercontent.com/jpatokal/openflights/master/data/airlines.dat
4* */
SQL> drop table if exists ebaj_openflights_airlines;
Table EBAJ_OPENFLIGHTS_AIRLINESが削除されました。
SQL> create table ebaj_openflights_airlines(
2 airline_id number primary key,
3 airline_name varchar2(100 char),
4 airline_alias varchar2(100 char),
5 iata varchar2(2 char),
6 icao varchar2(3 char),
7 callsign varchar2(60 char),
8 country varchar2(40 char),
9 active varchar2(1)
10* );
Table EBAJ_OPENFLIGHTS_AIRLINESは作成されました。
SQL> /*
2 * 航路
3 * https://raw.githubusercontent.com/jpatokal/openflights/master/data/routes.dat
4 *
5 * データ・ロード後に主キーroute_idを追加する。
6 * alter table ebaj_openflights_routes add route_id number generated by default as identity primary key;
7* */
SQL> drop table if exists ebaj_openflights_routes;
Table EBAJ_OPENFLIGHTS_ROUTESが削除されました。
SQL> create table ebaj_openflights_routes(
2 airline varchar2(3 char),
3 airline_id number,
4 source_airport varchar2(3 char),
5 source_airport_id number,
6 destination_airport varchar2(3 char),
7 destination_airport_id number,
8 codeshare varchar2(1),
9 stops number,
10 equipment varchar2(40 char)
11* );
Table EBAJ_OPENFLIGHTS_ROUTESは作成されました。
SQL>
curl -OL https://raw.githubusercontent.com/jpatokal/openflights/master/data/airports.dat
curl -OL https://raw.githubusercontent.com/jpatokal/openflights/master/data/airlines.dat
curl -OL https://raw.githubusercontent.com/jpatokal/openflights/master/data/routes.dat
OpenFlights % curl -OL https://raw.githubusercontent.com/jpatokal/openflights/master/data/airports.dat
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1100k 100 1100k 0 0 2811k 0 --:--:-- --:--:-- --:--:-- 2808k
OpenFlights % curl -OL https://raw.githubusercontent.com/jpatokal/openflights/master/data/airlines.dat
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 387k 100 387k 0 0 4200k 0 --:--:-- --:--:-- --:--:-- 4167k
OpenFlights % curl -OL https://raw.githubusercontent.com/jpatokal/openflights/master/data/routes.dat
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2321k 100 2321k 0 0 6802k 0 --:--:-- --:--:-- --:--:-- 6807k
OpenFlights %
これらの.datファイルにはnullを示す\Nとエスケープ文字の\\が含まれています。CSVとしてのアップロード時に問題が発生するため、sedを使ってこれらの文字をファイル中から除きます。
#!/bin/sh
sed -e 's/\\\\//g' $1.dat > t
sed -e 's/\\N//g' t > $1.csv
rm t
sh norm.sh airlines
sh norm.sh routes
ls *.csv
OpenFlights % sh norm.sh airports
OpenFlights % sh norm.sh airlines
OpenFlights % sh norm.sh routes
OpenFlights % ls *.csv
airlines.csv airports.csv routes.csv
OpenFlights %
OpenFlights % sql wksp_apexdev@localhost/freepdb1
SQLcl: 木 9月 11 13:40:44 2025のリリース25.2 Production
Copyright (c) 1982, 2025, Oracle. All rights reserved.
パスワード (**********?) ******
接続先:
Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.9.0.25.07
SQL>
set loadformat column_names off
SQL> set loadformat column_names off
SQL>
airports.csvを表EBAJ_OPENFLIGHTS_AIRPORTSにロードします。
SQL> load ebaj_openflights_airports ./airports.csv
csv
column_names off
delimiter ,
enclosures ""
double off
encoding UTF8
row_limit off
row_terminator default
skip_rows 0
skip_after_names
データを表にロードします WKSP_APEXDEV.EBAJ_OPENFLIGHTS_AIRPORTS
#INFO 処理された行数: 7,698
#INFO エラーのある行数: 0
#INFO 最後にコミットされたバッチで処理された最後の行: 7,698
成功: エラーなしで処理されました
SQL>
load ebaj_openflights_airlines ./airlines.csv
SQL> load ebaj_openflights_airlines ./airlines.csv
csv
column_names off
delimiter ,
enclosures ""
double off
encoding UTF8
row_limit off
row_terminator default
skip_rows 0
skip_after_names
データを表にロードします WKSP_APEXDEV.EBAJ_OPENFLIGHTS_AIRLINES
#INFO 処理された行数: 6,162
#INFO エラーのある行数: 0
#INFO 最後にコミットされたバッチで処理された最後の行: 6,162
成功: エラーなしで処理されました
SQL>
load ebaj_openflights_routes ./routes.csv
SQL> load ebaj_openflights_routes ./routes.csv
csv
column_names off
delimiter ,
enclosures ""
double off
encoding UTF8
row_limit off
row_terminator default
skip_rows 0
skip_after_names
データを表にロードします WKSP_APEXDEV.EBAJ_OPENFLIGHTS_ROUTES
#INFO 処理された行数: 67,663
#INFO エラーのある行数: 0
#INFO 最後にコミットされたバッチで処理された最後の行: 67,663
成功: エラーなしで処理されました
SQL>
alter table ebaj_openflights_routes add route_id number generated by default as identity primary key;
SQL> alter table ebaj_openflights_routes add route_id number generated by default as identity primary key;
Table EBAJ_OPENFLIGHTS_ROUTESが変更されました。
SQL>
SQL> create or replace property graph ebaj_openflights_routes_graph
2 vertex tables (
3 /* 空港 */
4 ebaj_openflights_airports key (airport_id)
5 label airport properties are all columns,
6 /* 運行会社 */
7 ebaj_openflights_airlines key (airline_id)
8 label airline properties are all columns,
9 /* 航路 */
10 ebaj_openflights_routes key (route_id)
11 label route properties are all columns
12 )
13 edge tables (
14 /* 航路から出発空港と到着空港を参照する。 */
15 ebaj_openflights_routes as airport_connections key (route_id)
16 source key (source_airport_id) references ebaj_openflights_airports (airport_id)
17 destination key (destination_airport_id) references ebaj_openflights_airports (airport_id)
18 label connects
19 properties are all columns,
20 /* 航路から運行会社を参照する。 */
21 ebaj_openflights_routes AS airline_operations key (route_id)
22 source key (airline_id) references ebaj_openflights_airlines (airline_id)
23 destination key (route_id) references ebaj_openflights_routes (route_id)
24 LABEL operates
25 properties are all columns
26* );
Property GRAPHは作成されました。
SQL>
select * from graph_table( ebaj_openflights_routes_graph
match (s is airport) -[e is connects]-> (d is airport)
where s.city = 'Tokyo' and d.city = 'London'
columns (
vertex_id(s) as s, edge_id(e) as e, vertex_id(d) as d
));
SQL> select * from graph_table( ebaj_openflights_routes_graph
2 match (s is airport) -[e is connects]-> (d is airport)
3 where s.city = 'Tokyo' and d.city = 'London'
4 columns (
5 vertex_id(s) as s, edge_id(e) as e, vertex_id(d) as d
6* ));
S E D
_______________________________________________________________________________________________________________________________________________________ ________________________________________________________________________________________________________________________________________________ ______________________________________________________________________________________________________________________________________________________
{"GRAPH_OWNER":"WKSP_APEXDEV","GRAPH_NAME":"EBAJ_OPENFLIGHTS_ROUTES_GRAPH","ELEM_TABLE":"EBAJ_OPENFLIGHTS_AIRPORTS","KEY_VALUE":{"AIRPORT_ID":2279}} {"GRAPH_OWNER":"WKSP_APEXDEV","GRAPH_NAME":"EBAJ_OPENFLIGHTS_ROUTES_GRAPH","ELEM_TABLE":"AIRPORT_CONNECTIONS","KEY_VALUE":{"ROUTE_ID":14469}} {"GRAPH_OWNER":"WKSP_APEXDEV","GRAPH_NAME":"EBAJ_OPENFLIGHTS_ROUTES_GRAPH","ELEM_TABLE":"EBAJ_OPENFLIGHTS_AIRPORTS","KEY_VALUE":{"AIRPORT_ID":507}}
{"GRAPH_OWNER":"WKSP_APEXDEV","GRAPH_NAME":"EBAJ_OPENFLIGHTS_ROUTES_GRAPH","ELEM_TABLE":"EBAJ_OPENFLIGHTS_AIRPORTS","KEY_VALUE":{"AIRPORT_ID":2359}} {"GRAPH_OWNER":"WKSP_APEXDEV","GRAPH_NAME":"EBAJ_OPENFLIGHTS_ROUTES_GRAPH","ELEM_TABLE":"AIRPORT_CONNECTIONS","KEY_VALUE":{"ROUTE_ID":15551}} {"GRAPH_OWNER":"WKSP_APEXDEV","GRAPH_NAME":"EBAJ_OPENFLIGHTS_ROUTES_GRAPH","ELEM_TABLE":"EBAJ_OPENFLIGHTS_AIRPORTS","KEY_VALUE":{"AIRPORT_ID":507}}
{"GRAPH_OWNER":"WKSP_APEXDEV","GRAPH_NAME":"EBAJ_OPENFLIGHTS_ROUTES_GRAPH","ELEM_TABLE":"EBAJ_OPENFLIGHTS_AIRPORTS","KEY_VALUE":{"AIRPORT_ID":2359}} {"GRAPH_OWNER":"WKSP_APEXDEV","GRAPH_NAME":"EBAJ_OPENFLIGHTS_ROUTES_GRAPH","ELEM_TABLE":"AIRPORT_CONNECTIONS","KEY_VALUE":{"ROUTE_ID":24296}} {"GRAPH_OWNER":"WKSP_APEXDEV","GRAPH_NAME":"EBAJ_OPENFLIGHTS_ROUTES_GRAPH","ELEM_TABLE":"EBAJ_OPENFLIGHTS_AIRPORTS","KEY_VALUE":{"AIRPORT_ID":507}}
{"GRAPH_OWNER":"WKSP_APEXDEV","GRAPH_NAME":"EBAJ_OPENFLIGHTS_ROUTES_GRAPH","ELEM_TABLE":"EBAJ_OPENFLIGHTS_AIRPORTS","KEY_VALUE":{"AIRPORT_ID":2279}} {"GRAPH_OWNER":"WKSP_APEXDEV","GRAPH_NAME":"EBAJ_OPENFLIGHTS_ROUTES_GRAPH","ELEM_TABLE":"AIRPORT_CONNECTIONS","KEY_VALUE":{"ROUTE_ID":25118}} {"GRAPH_OWNER":"WKSP_APEXDEV","GRAPH_NAME":"EBAJ_OPENFLIGHTS_ROUTES_GRAPH","ELEM_TABLE":"EBAJ_OPENFLIGHTS_AIRPORTS","KEY_VALUE":{"AIRPORT_ID":507}}
{"GRAPH_OWNER":"WKSP_APEXDEV","GRAPH_NAME":"EBAJ_OPENFLIGHTS_ROUTES_GRAPH","ELEM_TABLE":"EBAJ_OPENFLIGHTS_AIRPORTS","KEY_VALUE":{"AIRPORT_ID":2359}} {"GRAPH_OWNER":"WKSP_APEXDEV","GRAPH_NAME":"EBAJ_OPENFLIGHTS_ROUTES_GRAPH","ELEM_TABLE":"AIRPORT_CONNECTIONS","KEY_VALUE":{"ROUTE_ID":39299}} {"GRAPH_OWNER":"WKSP_APEXDEV","GRAPH_NAME":"EBAJ_OPENFLIGHTS_ROUTES_GRAPH","ELEM_TABLE":"EBAJ_OPENFLIGHTS_AIRPORTS","KEY_VALUE":{"AIRPORT_ID":507}}
{"GRAPH_OWNER":"WKSP_APEXDEV","GRAPH_NAME":"EBAJ_OPENFLIGHTS_ROUTES_GRAPH","ELEM_TABLE":"EBAJ_OPENFLIGHTS_AIRPORTS","KEY_VALUE":{"AIRPORT_ID":2279}} {"GRAPH_OWNER":"WKSP_APEXDEV","GRAPH_NAME":"EBAJ_OPENFLIGHTS_ROUTES_GRAPH","ELEM_TABLE":"AIRPORT_CONNECTIONS","KEY_VALUE":{"ROUTE_ID":40079}} {"GRAPH_OWNER":"WKSP_APEXDEV","GRAPH_NAME":"EBAJ_OPENFLIGHTS_ROUTES_GRAPH","ELEM_TABLE":"EBAJ_OPENFLIGHTS_AIRPORTS","KEY_VALUE":{"AIRPORT_ID":507}}
{"GRAPH_OWNER":"WKSP_APEXDEV","GRAPH_NAME":"EBAJ_OPENFLIGHTS_ROUTES_GRAPH","ELEM_TABLE":"EBAJ_OPENFLIGHTS_AIRPORTS","KEY_VALUE":{"AIRPORT_ID":2359}} {"GRAPH_OWNER":"WKSP_APEXDEV","GRAPH_NAME":"EBAJ_OPENFLIGHTS_ROUTES_GRAPH","ELEM_TABLE":"AIRPORT_CONNECTIONS","KEY_VALUE":{"ROUTE_ID":49804}} {"GRAPH_OWNER":"WKSP_APEXDEV","GRAPH_NAME":"EBAJ_OPENFLIGHTS_ROUTES_GRAPH","ELEM_TABLE":"EBAJ_OPENFLIGHTS_AIRPORTS","KEY_VALUE":{"AIRPORT_ID":507}}
{"GRAPH_OWNER":"WKSP_APEXDEV","GRAPH_NAME":"EBAJ_OPENFLIGHTS_ROUTES_GRAPH","ELEM_TABLE":"EBAJ_OPENFLIGHTS_AIRPORTS","KEY_VALUE":{"AIRPORT_ID":2279}} {"GRAPH_OWNER":"WKSP_APEXDEV","GRAPH_NAME":"EBAJ_OPENFLIGHTS_ROUTES_GRAPH","ELEM_TABLE":"AIRPORT_CONNECTIONS","KEY_VALUE":{"ROUTE_ID":50082}} {"GRAPH_OWNER":"WKSP_APEXDEV","GRAPH_NAME":"EBAJ_OPENFLIGHTS_ROUTES_GRAPH","ELEM_TABLE":"EBAJ_OPENFLIGHTS_AIRPORTS","KEY_VALUE":{"AIRPORT_ID":507}}
8行が選択されました。
SQL>
「これからはプロパティ・グラフEBAJ_OPENFLIGHTS_ROUTES_GRAPHにSQL/PGQで問い合わせて回答してください。グラフ問合せの勉強をしているので、CONNECT BYやJOINを使ったSELECT文は生成しないでください。」
自分の聞きたかったことと生成AIが作ったSELECT文を見比べることで、SQL/PGQの学習効率が上がります。また、生成AIに指示をすればJOINとCONNECT BYを使ったSELECT文も生成しますが、読み比べるとSQL/PGQの方が可読性が高いことがわかります。生成AIが作ったかどうかに関わらず、JOINとCONNECT BYを駆使したSELECT文の検索条件が意図したものかどうかの判断は難しいですが、それと比較してSQL/PGQではその判断は比較的容易です。
select * from graph_table( ebaj_openflights_routes_graph
match (s is airport) -[e is connects]-> (d is airport)
where s.country = :P1_SOURCE_COUNTRY and d.country = :P1_DESTINATION_COUNTRY
columns (
vertex_id(s) as s, edge_id(e) as e, vertex_id(d) as d
));