0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Oracle Graph クイックスタート(オンプレ)

Last updated at Posted at 2023-03-16

次のような方のためのガイドとして、なるべく簡潔に書いてみました。参考になれば幸いです。この記事で使用している Graph Server and Client のバージョンは 23.1 です。

  • Oracle Graph をすぐに試したい
  • 新規または既存の Oracle Database(12.2 以上)を利用する
    • 無償の Express Edition も使用可能です
  • オンプレ環境(クラウド上の VM も含む)を利用する

まずは Graph Server を使わない場合

無償の SQL クライアントである SQL Developer は Graph Client を含んでいるため、データベースに必要な権限を持つユーザーが作成されていれば、すぐにグラフ機能を使い始めることができます。

データベースユーザーの作成

まず、DBA 権限を持つユーザーで新しいユーザー(ここでは graphuser)を作成します。既存のユーザーを使用しても構いません。

CREATE USER graphuser
IDENTIFIED BY ********
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp
QUOTA UNLIMITED ON users;

次の権限を付与します。

GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW TO graphuser

SQL Developer の利用

SQL Developer は Oracle が提供している無償のデータベース管理ツールです。使い方の詳細は省きます。ここでは、バージョン 21.2.1.204.1703 を使用しています。

サンプルデータの作成

上記のユーザーで SQL Developer からデータベースに接続したら、サンプルの表データを作成します。

CREATE TABLE bank_account (
  acc_id NUMBER
);

CREATE TABLE bank_transaction (
  acc_id_src NUMBER, 
  acc_id_dst NUMBER, 
  txn_id NUMBER, 
  amount NUMBER
);

INSERT INTO bank_account VALUES (1);
INSERT INTO bank_account VALUES (2);
INSERT INTO bank_account VALUES (3);
INSERT INTO bank_account VALUES (4);
INSERT INTO bank_account VALUES (5);

INSERT INTO bank_transaction VALUES (1, 2, 101, 800);
INSERT INTO bank_transaction VALUES (2, 3, 102, 700);
INSERT INTO bank_transaction VALUES (3, 4, 103, 600);
INSERT INTO bank_transaction VALUES (4, 5, 104, 500);
INSERT INTO bank_transaction VALUES (5, 1, 105, 400);

グラフの作成

表データからグラフを作成するためには PGQL を使う必要がある(ただし、Database 23c 以降では SQL でも可能になる予定)ため、Property Graph を右クリックして PGQL Worksheet を開きます。

bank_graph というグラフを作成します。

CREATE PROPERTY GRAPH bank_graph
  VERTEX TABLES (
    bank_account
      KEY (acc_id)
      LABEL account
  )
  EDGE TABLES (
    bank_transaction
      KEY (txn_id)
      SOURCE KEY(acc_id_src) REFERENCES bank_account
      DESTINATION KEY(acc_id_dst) REFERENCES bank_account
      LABEL transferred_to
  )
  OPTIONS (PG_VIEW)
;

PGQL クエリの実行

試しに PGQL の SELECT 文を実行してみます。

SELECT a2.acc_id, t.amount
FROM MATCH (a1) -[t:transferred_to]-> (a2) ON bank_graph
WHERE a1.acc_id = 1

次に Graph Server を追加する場合

上記の通り、Oracle Database は単体でも PGQL クエリをしようすることができます(厳密には、Graph Client を含む SQL クライアントを使うことにより SQL が PGQL に変換されている)が、別に Graph Server を用意してグラフをメモリに展開しておくことで、グラフを辿るクエリを高速化したり、グラフアルゴリズムや Graph Neural Networks を使用することができます。

Graph Server のインストール

Graph Server のライセンスは Oracle Database に含まれており Oracle Linux または RedHat Linux の 7 と 8 でサポートされています。

RPM パッケージのインストール

Graph Server と JDK 11 をダウンロードしてインストールします。

sudo yum install -y libgfortran
sudo rpm -i oracle-graph-23.1.0.x86_64.rpm
sudo rpm -ivh jdk-11.0.17_linux-x64_bin.rpm 

JDBC URL の設定

Graph Server からデータベースに接続するため、設定ファイルに JDBC URL を書き込んで、Graph Server を再起動します。

vi /etc/oracle/graph/pgx.conf

...
"pgx_realm": {
  "implementation": "oracle.pg.identity.DatabaseRealm",
  "options": {
    "jdbc_url": "jdbc:oracle:thin:@myhost:1521/myservice",    <-- Here
    "token_expiration_seconds": 14400,
...

sudo systemctl restart pgx

データベースロールの作成

Graph Server を使うために必要なロールを作成するため、DBA 権限を持つユーザーでデータベースに接続し、以下のスクリプトを実行します。

-- This procedure creates a list of roles needed for graph.
DECLARE
  PRAGMA AUTONOMOUS_TRANSACTION;
  role_exists EXCEPTION;
  PRAGMA EXCEPTION_INIT(role_exists, -01921);
  TYPE graph_roles_table IS TABLE OF VARCHAR2(50);
  graph_roles graph_roles_table;
BEGIN
  graph_roles := graph_roles_table(
    'GRAPH_DEVELOPER',
    'GRAPH_ADMINISTRATOR',
    'GRAPH_USER',
    'PGX_SESSION_CREATE',
    'PGX_SERVER_GET_INFO',
    'PGX_SERVER_MANAGE',
    'PGX_SESSION_READ_MODEL',
    'PGX_SESSION_MODIFY_MODEL',
    'PGX_SESSION_NEW_GRAPH',
    'PGX_SESSION_GET_PUBLISHED_GRAPH',
    'PGX_SESSION_COMPILE_ALGORITHM',
    'PGX_SESSION_ADD_PUBLISHED_GRAPH');
  FOR elem IN 1 .. graph_roles.count LOOP
    BEGIN
      dbms_output.put_line('create_graph_roles: ' || elem || ': CREATE ROLE ' || graph_roles(elem));
      EXECUTE IMMEDIATE 'CREATE ROLE ' || graph_roles(elem);
    EXCEPTION
      WHEN role_exists THEN
        dbms_output.put_line('create_graph_roles: role already exists. continue');
      WHEN OTHERS THEN
        RAISE;
    END;
  END LOOP;
EXCEPTION
  when others then
    dbms_output.put_line('create_graph_roles: hit error ');
    raise;
END;
/
-- This procedure add some grants to the graph roles.
DECLARE
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  EXECUTE IMMEDIATE 'GRANT PGX_SESSION_CREATE TO GRAPH_ADMINISTRATOR';
  EXECUTE IMMEDIATE 'GRANT PGX_SERVER_GET_INFO TO GRAPH_ADMINISTRATOR';
  EXECUTE IMMEDIATE 'GRANT PGX_SERVER_MANAGE TO GRAPH_ADMINISTRATOR';
  EXECUTE IMMEDIATE 'GRANT PGX_SESSION_CREATE TO GRAPH_DEVELOPER';
  EXECUTE IMMEDIATE 'GRANT PGX_SESSION_NEW_GRAPH TO GRAPH_DEVELOPER';
  EXECUTE IMMEDIATE 'GRANT PGX_SESSION_GET_PUBLISHED_GRAPH TO GRAPH_DEVELOPER';
  EXECUTE IMMEDIATE 'GRANT PGX_SESSION_MODIFY_MODEL TO GRAPH_DEVELOPER';
  EXECUTE IMMEDIATE 'GRANT PGX_SESSION_READ_MODEL TO GRAPH_DEVELOPER';
  EXECUTE IMMEDIATE 'GRANT PGX_SESSION_CREATE TO GRAPH_USER';
  EXECUTE IMMEDIATE 'GRANT PGX_SESSION_GET_PUBLISHED_GRAPH TO GRAPH_USER';
EXCEPTION
  when others then
    dbms_output.put_line('add_graph_roles_grants: hit error ');
    raise;
END;
/

次の権限を付与します。

GRAPH_DEVELOPER, PGX_SESSION_ADD_PUBLISHED_GRAPH TO graphuser

TLS の無効化

初期状態では TLS が有効化されていますが、テスト使用の段階では証明書の設定などの手順を省きたいため、設定ファイル(server.conf)を編集して TLS を無効化しておきます。また、23.3 より前のバージョンでは Graph Visualization アプリケーションの WAR ファイルも修正が必要です。

vi /etc/oracle/graph/server.conf

  "enable_tls": false,
yum install -y zip unzip

# GraphViz
WAR=$(find /opt/oracle/graph/graphviz -name '*.war')
TMP=$(mktemp -d)
cd $TMP
unzip $WAR WEB-INF/web.xml
sed -i 's|<secure>true</secure>|<secure>false</secure>|' WEB-INF/web.xml
sed -i 's|https://|http://|' WEB-INF/web.xml
sudo zip $WAR WEB-INF/web.xml
rm -r $TMP

# restart
sudo systemctl restart pgx

Java Client の利用

Graph Server の RPM インストールに含まれている Java Client(JShell に Graph Client ライブラリを読み込んだもの)を用いて Graph Server に接続します。この際、データベースのユーザー情報でログインします。

$ opg4j -b http://localhost:7007 --user graphuser
password: 
For an introduction type: /help intro
Oracle Graph Server Shell 23.1.0
Variables instance, session, and analyst ready to use.
opg4j>

グラフのロード

先にデータベースに(ビューとして)作成したグラフを Graph Server にロードしてみます。

opg4j> var graph = session.readGraphByName("BANK_GRAPH", GraphSource.PG_VIEW)
opg4j> graph
graph ==> PgxGraph[name=BANK_GRAPH,N=5,E=5,created=1678876016842]

グラフの公開

さらにこのグラフに他のセッション(次の手順で Graph Visualization アプリケーションを用いる)からアクセスするために、公開(publish)しておきます。

opg4j> graph.publish()

Graph Visualization App の利用

ブラウザから http://<ip_address>:7007/ui/ にアクセスして、データベースのユーザー情報でログインします。

PGQL クエリの実行

PGQL の結果が可視化されることを確認します。

Python Client の利用

Graph Client をダウンロードして、Python が実行できるクライアント PC にインストールします。

$ pip install oracle-graph-client==23.1.0

Python Client から接続

次のスクリプトを使用して Graph Server に接続します。下のスクリーンショットでは Visual Studio Code で test.ipynb(Jupyter Notebook)を作成して、スクリプトを実行しています。

from opg4py import graph_server
from pypgx import setloglevel
from getpass import getpass

setloglevel("ROOT", "WARN")

base_url = "http://localhost:7007"
username = "graphuser"
password = getpass("Password: ")

instance = graph_server.get_instance(base_url, username, password)
session = instance.create_session("jupyter")
analyst = session.create_analyst()

print(session)

メモリ上で公開されているグラフ BANK_GRAPH にアクセスします。

graph = session.get_graph("BANK_GRAPH")
graph

PGQL クエリの実行

全てのエッジおよびその始点と終点を取得します。

graph.query_pgql("""
SELECT a1.acc_id AS a1_acc_id, a2.acc_id AS a2_acc_id, t.amount
FROM MATCH (a1)-[t]->(a2)
ORDER BY a1_acc_id
""").print()

パスの検索を実行してみます。

graph.query_pgql("""
SELECT
  ELEMENT_NUMBER(e) AS order
, v1.acc_id AS a1_acc_id
, e.amount
, v2.acc_id AS a2_acc_id
FROM MATCH SHORTEST
  ((a1) (-[t:transferred_to]->(a) WHERE t.amount > 300)+ (a2))
  ONE ROW PER STEP (v1, e, v2)
WHERE a1.acc_id = 2 AND a2.acc_id = 5
  AND COUNT(a) = COUNT(DISTINCT a)
ORDER BY order ASC
""").print()

以上、クイックスタートでした!

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?