PG/PGX - OCI上のプロパティ・グラフをローカルPCのCytoscapeで可視化

#はじめに
###本記事について
OCI（Oracle Cloud Infrastructure）上のOracle Databaseに格納したプロパティ・グラフ（Oracleのグラフ・データベース機能）をローカルPCの[Cytoscape](https://cytoscape.org/)（OSSのgraph visualization tool）から[PGX](https://www.oracle.com/technetwork/oracle-labs/parallel-graph-analytix/overview/index.html)（グラフ分析エンジン、Parallel Graph AnalytiXの略）でページランクアルゴリズムの実行や[PGQL](http://pgql-lang.org/)（Property Graph Query Language）を実行してそれらの結果を元に可視化する手順です。


###動作環境について
- Windows 7のローカルPC
- Cytoscape 3.2.1 （Oracle Pluginを利用する際はCytoscape 3.2.1以上であることが条件、PCにインストール）
- [Cytoscape Plugin for Oracle Database 18c](https://www.oracle.com/technetwork/database/options/spatialandgraph/downloads/index-156999.html)（Cytoscapeにより、Oracle Databaseに格納されたプロパティ・グラフの可視化に必要）
- Teraterm（SSHポート転送のため）
- OCI（Oracle Cloud Infrastructure）上に作成した Database - Virtual Machines
- Oracle Database 18.2 Enterprise Edition High Performance 　（プロパティ・グラフの利用にはHigh Performance以上のEditionが必要）

# Cytoscapeによるプロパティ・グラフの可視化
###事前準備
Oracle Cloudのサービス・コンソールより、Oracle Netリスナー経由でのDatabase接続のため1521ポートへの接続を許可します。対象DB SystemsのVCNへのリンクよりSecurity Listを更新します。
![サービスコンソール.PNG](https://qiita-image-store.s3.amazonaws.com/0/120705/75bb6bcc-e9ca-e762-2ad9-edd068e7ca69.png)


CytoscapeからOCI上のOracle Databaseに接続するため、TeratermでSSHポート転送の設定をします。リモート側ホストには<b>Public IP</b>を指定します。
![ssh_port_1.PNG](https://qiita-image-store.s3.amazonaws.com/0/120705/02d44fbc-65ef-0ccb-ad11-5898a7a8e95d.png)

CytoscapeからOCI上のPGXサーバーに接続するため、TeratermでSSHポート転送の設定をします。リモート側ホストには<b>Private IP</b>を指定します。
![ssh_port_2.PNG](https://qiita-image-store.s3.amazonaws.com/0/120705/9bbe676e-5728-4dae-e1d1-1f2ebbe90ff5.png)

OCI上にてPGXをサーバーモードで起動します。
PGXをサーバーモードで起動のため設定ファイルは以下のように変更しております。ポートは任意です。

```
$ cd $ORACLE_HOME/md/property_graph/pgx/conf
$ cat server.conf
{
  "port": 7008,
  "enable_tls": false,
  "enable_client_authentication": false
}
```
PGXをサーバーモードで起動します。

```
$ cd $ORACLE_HOME/md/property_graph/pgx
$ nohup sh ./bin/start-server &
```

ログに以下メッセージが出力されていましたら、正常に起動ができています。

```
INFO: Starting Protocol Handler [“http-nio-7007]
```

リスナーが接続要求を受け入れるアドレスにlocalhostを許可するため、リスナーのADDRESS_LISTに「(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))」を追記します。localhostを許可しない場合、PGXサーバーからDatabase接続する際に以下エラーが発生します。

```
Caused by: oracle.net.ns.NetException: The Network Adapter could not establish the connection
（略）
Caused by: java.io.IOException: Connection refused, socket connect lapse 1 ms. /127.0.0.1 1521 0 1 true
```


###Cytoscapeを実行しDB接続
ローカルPCにインストールしていたCytoscapeを「startCytoscape.bat」を実行して起動します。Cytoscapeよりオリジナルで提供されている「cytoscape.bat」ではなく、プロパティ・グラフ、PGX機能活用のため「startCytoscape.bat」を利用します。以下、起動画面です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120705/dc4ce93c-3c84-9ea8-6861-405a8d5a9ab5.png)
起動後、「File」タブより辿り「Connect to Oracle Database」を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120705/222a060b-6fd4-be37-4532-d7e5e142f4a3.png)
表示されたダイアログに「JDBC url」（SSHポート転送元として指定したポートを利用）、「Username」、「Passwrd」を入力するとDBに格納済みの「Graph name」を表示できます。以下例では「CONNECTIONS」という名称のプロパティ・グラフが格納済みです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120705/8cee26ca-b555-b77a-cc3d-19b74bc406b7.png)

###Cytoscapeよりプロパティ・グラフ内ノードのページランクを求め、トップ5を描画
「Choose the starting point」欄より「page rank」を選択し、「Analyst service endpoint」にPGXサーバーを指定（SSHポート転送元）、「Top-ranked」に「5」を入力し![image.png](https://qiita-image-store.s3.amazonaws.com/0/120705/22111e7b-375b-cdd9-ae5b-343832767051.png)をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120705/6a2162f6-e016-60ee-135c-6ec06a09c948.png)

以下、出力イメージです。トップ5のノードが出力されますが、ノードidが表示されているため、表示項目を変更しています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120705/edffdb09-5e12-6ebc-ce0f-fb93dc784ed0.png)

ノードの繋がりを可視化するため、全ノードを選択し、各ノードに隣接しているノードを表示します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120705/dea39134-4cb6-3124-f9be-c9de65610f97.png)

以下のように表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120705/415a7033-748f-2605-b46f-e005e6b9d3a4.png)

グラフレイアウトは以下のように用意されているため、グラフの特性や表現したい目的に応じて選択ができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120705/abbdd380-0fe7-6ea5-ba34-de6f47559e18.png)

###CytoscapeよりPGQLを実行し結果を描画
「Start from PGQL」タブを選択し、上記と同様にDB、PGXサーバーへの接続設定をし、画面中部のテキストボックスにPGQLを記載します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120705/2d26c7e5-6306-eaa5-fbea-f0e6f00b275f.png)
画面下部の![image.png](https://qiita-image-store.s3.amazonaws.com/0/120705/83edd8a4-f932-9d7f-e35d-d3e3d5176393.png)をクリックすることで結果が描画されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120705/27fceb2a-d750-0ce5-7fcc-73438d50c5d2.png)

###Oracleフラット・ファイルからの描画
DBに格納されていないプロパティ・グラフでも、フラットファイル（opv, opeファイル）があれば、Cytoscapeで描画できます。
以下のように「View」タブから「Visualize text files (opv and ope files)」を選択し、opv, opeファイルを指定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120705/ff612edd-cac0-f4cf-4166-d10a7a179e1c.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120705/e013a227-5cf6-503c-5290-1eaef459581c.png)


#リファレンス
[Effective Graph Visualization with Cytoscape and Oracle's Property Graph Database](https://blogs.oracle.com/oraclespatial/effective-graph-visualization-with-cytoscape-and-oracles-property-graph-database-3)
[Oracle Cloud Infrastructure 環境へのアクセスにまつわる小ネタ集](https://qiita.com/mikika/items/d2e88748f6754abc1ea2)
[サーバー・モードで起動する](https://github.com/ryotayamanaka/graph-analytics/wiki/%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%83%BB%E3%83%A2%E3%83%BC%E3%83%89%E3%81%A7%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B)