Oracle Graph を Docker 上で構築（後編、バージョン 22.4 以上）

![docker2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410176/a7db8de9-fc3d-8310-f799-b32676c6b5a2.jpeg)
（以下の手順は、バージョン 22.4.2 および 23.1.0 でテストしています。）

[前編](https://qiita.com/ryotayamanaka/items/0e2bf7b0d1e00331c7d2)では、Oracle Database をコンテナ上に起動し、これをグラフ・データベースとして使う方法をご説明しました。この環境だけでも、表データからグラフへの[変換やビューの作成](https://qiita.com/ryotayamanaka/items/99a64b10f8f1f6456175)、さらには JSON と組み合わせなど、さまざまな利用方法がありますので、おいおいご紹介していきたいと思います。

ここでは、あくまで構築手順だけに絞って、その後半として Graph Server のためのコンテナを追加する方法をご説明します。次のアーキテクチャ図で、既に 2-tier deployment は構築できているので、これから 3-tier deployment を追加します。

![](https://user-images.githubusercontent.com/4862919/138631261-105c0795-3942-483c-9e01-f28417bf6d59.png)

## Oracle Graph と JDK のダウンロード

Graph Server と Graph Viz が含まれる RPM パッケージと Graph Client が含まれる ZIP ファイルを[こちらのサイト](https://www.oracle.com/database/technologies/spatialandgraph/property-graph-features/graph-server-and-client/graph-server-and-client-downloads.html)からダウンロードします。いずれかのパッケージを選択すると、Oracle アカウントでのログインが要求されて、Oracle Software Delivery Cloud というところに飛ばされます。

このチュートリアルで必要になる「Oracle Graph Server」にチェックを入れてダウンロードします。
![Screen Shot 2023-01-30 at 13.37.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410176/525f77b2-b420-7455-264d-0d46344bb707.png)

Oracle Download Manager なるものが現れてダウンロードを開始します。
![Screen Shot 2023-01-30 at 13.39.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410176/e0638590-4b5c-f438-f10a-adc45fea3be9.png)


加えて、JDK 11（Linux - x64 RPM Package）を[こちらのサイト](https://www.oracle.com/java/technologies/downloads/#java11)からダウンロードしておきます。こちらも個人用途や開発用途であればライセンス費用がかからないので、安心してお使いいただけます。

## Graph Server の構築

ここでダウンロードしたこれらの RPM パッケージと次に作成する Dockerfile を同じディレクトリに配置します。

- oracle-graph-23.1.0.x86_64.rpm
- jdk-11.0.17_linux-x64_bin.rpm

```
vi Dockerfile
```

```Dockerfile:Dockerfile
FROM oraclelinux:7

ARG VERSION_JDK
ARG VERSION_OPG
ARG JDBC_URL

COPY ./jdk-${VERSION_JDK}_linux-x64_bin.rpm /tmp
COPY ./oracle-graph-${VERSION_OPG}.x86_64.rpm /tmp

RUN yum install -y unzip numactl vim gcc openssl libgfortran \
 && yum clean all \
 && rm -rf /var/cache/yum/* \
 && rpm -ivh /tmp/jdk-${VERSION_JDK}_linux-x64_bin.rpm \
 && rpm -ivh /tmp/oracle-graph-${VERSION_OPG}.x86_64.rpm

ENV JAVA_HOME=/usr/java/jdk-${VERSION_JDK}
ENV PATH=$PATH:/opt/oracle/graph/bin
ENV SSL_CERT_FILE=/etc/oracle/graph/ca_certificate.pem
ENV PGX_SERVER_KEYSTORE_PASSWORD=changeit

RUN keytool -importkeystore \
    -srckeystore /etc/oracle/graph/server_keystore.jks \
    -destkeystore $JAVA_HOME/lib/security/cacerts \
    -deststorepass changeit \
    -srcstorepass changeit \
    -noprompt

RUN sed -i "s|<REPLACE-WITH-DATABASE-URL-TO-USE-FOR-AUTHENTICATION>|${JDBC_URL}|" /etc/oracle/graph/pgx.conf

EXPOSE 7007

WORKDIR /opt/oracle/graph/bin

CMD ["sh", "/opt/oracle/graph/pgx/bin/start-server"]
```

イメージをビルドします。JDK のバージョンはダウンロードしたものに置き換えてください。

```
docker build . \
-f Dockerfile-graph-server \
--tag graph-server:23.1.0 \
--build-arg VERSION_OPG=23.1.0 \
--build-arg VERSION_JDK=11.0.17 \
--build-arg JDBC_URL=jdbc:oracle:thin:@host.docker.internal:1521/xepdb1
```

イメージが完成したらコンテナを起動します。

```
docker run \
--name graph-server \
--publish 7007:7007 \
graph-server:23.1.0
```

opg4j シェルを使って GRAPHUSER（＝前編で作成したデータベースユーザー）として Graph Server にログインできることを確認します。

```
$ docker exec -it graph-server opg4j -b https://localhost:7007
...
username: graphuser
password: (Welcome1)
For an introduction type: /help intro
Oracle Graph Server Shell 23.1.0
Variables instance, session, and analyst ready to use.
opg4j> 
opg4j> /exit
```

後々 JDBC URL を変更する必要がある場合は、コンソールからコンテナに接続し、pgx.conf 内の JDBC URL を編集します。その後、ホストに戻り、Graph Server コンテナを再起動します。

```
$ docker exec -it graph-server /bin/bash
# vi /etc/oracle/graph/pgx.conf

  "jdbc_url": "jdbc:oracle:thin:@host.docker.internal:1521/xepdb1",

# exit
$ docker restart graph-server
$ docker logs -f graph-server
```

## Graph Visualization にログイン

ウェブ・ブラウザから Graph Visualization にログインします。

- https://localhost:7007/ui/

自己署名証明書が使われているため、セキュリティ警告が表示されます。

- Chrome: "thisisunsafe" とタイプします
- Firefox: Advanced > Accept the Risk and continue

データベース・ユーザーでログインします。

- User: graphuser
- Password: Welcome1（前編の通りに設定した場合）
- Advanced Options: Database
    - jdbc:oracle:thin:@host.docker.internal:1521/xepdb1

前編で作成したグラフ `GRAPH1` を可視化するため、次の PGQL クエリを実行します。

```
SELECT v1.name, v2.brand, e.since
FROM MATCH (v1)-[e]->(v2)
LIMIT 100
```

ノードやエッジを右クリックするとプロパティの値を確認することができます。

![](https://user-images.githubusercontent.com/4862919/144443544-93f19e36-cf31-4391-9053-e7917abc101f.jpg)

以上で Oracle Graph の環境を作成することができました。この環境を使用して、グラフ・データベースの様々なユースケースを議論していければと思います。