1 プロパティ・グラフのサポートの概要
- Oracle Databaseのプロパティ・グラフ機能について
プロパティ・グラフ機能は、Oracle Databaseの高度なグラフ問合せ機能および分析機能を提供します。 - プロパティ・グラフの前提条件
Oracle Databaseのプロパティ・グラフ機能を使用するための要件は次のとおりです。 - プロパティ・グラフ機能
グラフは頂点、エッジ、および頂点とエッジのプロパティとしてリンクされたデータのネットワークを管理します。 - グラフ・データを使用したセキュリティのベスト・プラクティス
一部のセキュリティ関連のベスト・プラクティスは、グラフ・データを操作する場合に適用されます。 - 対話型グラフ・シェル
Oracle Graphサーバーとクライアント・パッケージの両方に、製品のすべてのJava APIをローカルまたはリモート・コンピュータで操作するための対話型コマンドライン・アプリケーションが含まれています。 - Oracle Databaseへのグラフの格納とメモリーへのグラフのロード
2層モード(グラフ・クライアントはOracle Databaseに直接接続)または3層モード(グラフ・クライアントは中間層のグラフ・サーバー(PGX)に接続し、Oracle Databaseに接続)でグラフを操作できます。 - Autonomous DatabaseでのOracle Graphの使用
Oracle Graph Server and Clientは、Oracle Autonomous Databaseのファミリをサポートしています。 - プロパティ・グラフ・アプリケーションのリリース20より前からの移行
Oracle Spatial and Graphの前のバージョンからリリース20に移行する場合、既存のプロパティ・グラフ関連のアプリケーションの変更が必要な場合があります。 - クイック・スタート: グラフ・データの対話形式の分析
このチュートリアルでは、プロパティ・グラフ・データの使用を迅速に開始する方法を示します。
1.1 Oracle Databaseのプロパティ・グラフ機能について
プロパティ・グラフ機能は、Oracle Databaseの高度なグラフ問合せ機能および分析機能を提供します。
この機能は、グラフ操作、索引付け、問合せ、検索およびインメモリー分析をサポートします。
親トピック: プロパティ・グラフのサポートの概要
1.2 プロパティ・グラフの前提条件
Oracle Databaseのプロパティ・グラフ機能を使用するための要件は次のとおりです。
-
このトピックで後述するように、リリース20から有効なOracle Graph Server and Clientをインストールする必要があります。
-
max_string_size
はenabled
である必要があります。 -
AL16UTF16
(UTF8
のかわり)がNLS_NCHAR_CHARACTERSETに指定されている。AL32UTF8 (UTF8)
がデフォルトの文字セットであるが、AL16UTF16
がNLS_NCHAR_CHARACTERSETである。
サブトピック:
グラフ・サーバーのインストール
リリース20.1以降、グラフ・サーバーおよびグラフ・クライアントは、ダウンロード可能な個別のパッケージとして使用可能になります。ライブラリは、$ORACLE_HOMEでは使用できなくなります。
グラフ・サーバーをインストールする前提条件は次のとおりです。
- Oracle Linux 6または7 x64、またはRedHatなどの類似のLinuxディストリビューション
- Oracle JDK 8
- Oracle EdeliveryからOracle Graph Server and Clientをダウンロードします。
- ルートとして、RPMコマンドライン・ユーティリティを使用してRPMファイルをインストールします。
rpm -i oracle-graph-<version>.rpm
<version>
は、ダウンロードしたバージョンを表します。(例:oracle-graph-20.1.0.0.0.x86_64.rpm
).rpm
ファイルはグラフ・サーバーです。 - ルートとして、サーバー・インストールの使用を許可されているオペレーティング・システム・ユーザーを、オペレーティング・システム・グループ
oraclegraph
に追加します。次に例を示します。usermod -a -G oraclegraph <graphuser>
これによって、指定されたグラフ・ユーザーがグループ
oraclegraph
に追加されます。この処理を有効にするには、
<graphuser>
がログアウトしてから再度ログインする必要があることに注意してください。 <graphuser>
として、/etc/oracle/graphにあるファイルを変更してサーバーを構成します。ノート:
デモンストレーション目的でのみ、
/etc/oracle/graph/pgx-server.log
を編集して、enable_tls
をfalse
に変更できます。これにより、次のステップで説明するようにサーバーを起動できるようになります。これは本番環境にはお薦めしません。安全な構成では、enable_tls
をtrue
に設定する必要があります。- PGXのユーザーの認証および認可の説明に従って、グラフ・サーバーに接続するデータベース・ユーザーに対して認証が有効になっていることを確認します。
<graphuser>
として/opt/oracle/graph/pgx/bin/start-server
を実行して、PGXサーバーを起動します。
これで、PGXサーバーでリクエストを受け入れる準備ができました。ログ・ファイルは、/var/log/oracle/graph
にあります。
特定のユースケースでは、次のような追加のインストール操作が必要になります。
- Javaシェル・ツール(JShell).を使用してプロパティ・グラフをローカルで対話的に分析する
- Oracle WebLogic Serverを使用してグラフ・サーバーをWebアプリケーションとしてデプロイする(Oracle WebLogic Serverへのデプロイを参照)。
- Oracle WebLogic ServerでGraphVizをデプロイする(Oracle WebLogic ServerでのGraphVizのデプロイを参照)。
- Apache Tomcatを使用してグラフ・サーバーをWebアプリケーションとしてデプロイする(Apache Tomcatへのデプロイを参照)。
Graph Serverのアップグレード
グラフ・サーバーをアップグレードするには、グラフ・サーバーが停止していることを確認し、新しいRPMファイルを引数として、次のコマンドを実行します。次に例を示します。
rpm -U oracle-graph-20.2.0.0.0.x86_64.rpm
Graph Serverのアンインストール
グラフ・サーバーをアンインストールするには、グラフ・サーバーが停止していることを確認して、次のコマンドを実行します。
rpm -e oracle-graph
グラフ・クライアントのインストール
グラフ・クライアントをインストールする前提条件は次のとおりです。
- Unixベースのオペレーション・システム(Linuxなど)またはmacOSやMicrosoft Windows
- Oracle JDK 11
- Oracle EdeliveryからOracle Graph Client 20.1をダウンロードします。
- 選択したディレクトリに、このファイルを解凍します。
- Jshellを使用してPGXサーバーに接続します。次に例を示します。
cd <client-install-dir>./bin/opg-jshell --base_url https://<host>:7007
特定のユースケースでは、次のような追加のインストール操作が必要になります。
- Apache Zeppelinにクライアントをインストールします。
データベースの互換性と制限事項
Oracle Graph Server and Client は、Oracle Database 12.2以降と連携して機能します。これには、Oracle Autonomous Databaseファミリ(すべてのバージョンのOracle Autonomous Data Warehouse (共有)、Oracle Autonomous Database (共有)およびOracle Autonomous Database (専用))の操作が含まれます。
対処するために実行する必要がある制限事項やアクションなどの詳細は、Database Compatibility Matrix for Oracle Graph Server and Clientを参照してください。
親トピック: プロパティ・グラフのサポートの概要
1.3 プロパティ・グラフ機能
グラフは頂点、エッジ、および頂点とエッジのプロパティとしてリンクされたデータのネットワークを管理します。
グラフは一般的に、ソーシャル・ネットワーク、サイバー・セキュリティ、ユーティリティおよび電気通信、ライフサイエンスおよび臨床データ、ナレッジ・ネットワークで検出される関係のモデル化、格納および分析に使用されます。
標準的なグラフ分析には、グラフのトラバース、推奨、コミュニティおよびインフルエンサの検出、パターン一致などがあります。グラフは、電気通信、ライフサイエンスおよびヘルスケア、セキュリティ、メディアおよび出版などの業種に活用できます。
Oracle Special and Graphのプロパティ・グラフ機能は、次の機能でこのようなユースケースをサポートしています。
-
スケーラブルなグラフ・データベース
-
PGQLに基づく開発者ベースのAPI、およびJavaグラフAPI
-
Oracle Textとの統合によるテキスト検索および問合せ
-
グラフ問合せおよびグラフ分析を実行するためのパラレルなインメモリー・グラフ・サーバー(PGX)
-
ランキング、中心性、レコメンダ、コミュニティ検出、パス検索など、高速でスケーラブルな一連のソーシャル・ネットワーク分析機能
-
Oracle定義のフラット・ファイル形式でのプロパティ・グラフ・データの並列バルク・ロードおよびエクスポート
-
強力なグラフ・ビジュアライゼーション(GraphViz)アプリケーション
-
Apache Zeppelinとの統合によるノートブックのサポート
1.3.1 プロパティ・グラフのサイズ変更の推奨事項
プロパティ・グラフのインストールについての推奨事項を次に示します。
表1-1 プロパティ・グラフのサイズ変更の推奨事項
グラフのサイズ | 推奨の専用物理メモリー | 推奨のCPUプロセッサ数 |
---|---|---|
10から100Mエッジ |
14GB RAMまで |
2から4プロセッサ、計算が集中するワークロードの場合は16プロセッサまで |
100Mから1Bエッジ |
14GBから100GB RAM |
4から12プロセッサ、計算が集中するワークロードの場合は16から32プロセッサまで |
1Bエッジ以上 |
100GB RAM以上 |
12から32プロセッサ、特に計算が集中するワークロードの場合はそれ以上 |
親トピック: プロパティ・グラフの機能
1.4 グラフ・データを使用したセキュリティのベスト・プラクティス
一部のセキュリティ関連のベスト・プラクティスは、グラフ・データを操作する場合に適用されます。
機密情報
グラフ・データには機密情報を含めることができるため、他のタイプのデータと同じように注意して取り扱う必要があります。Oracleでは、グラフ製品を使用する場合、次の考慮事項を検討することをお薦めします。
- 分析に不要な場合は、機密情報をグラフに格納しないでください。既存のデータがある場合は、分析に必要な関連サブセットのみをグラフとしてモデル化します。このためには、前処理ステップを適用するか、グラフ製品の一部であるサブグラフとフィルタリング手法を使用します。
- 頂点識別子およびエッジ識別子が機密情報とみなされないようにグラフをモデル化してください。
- 信頼できない環境に製品をデプロイしたり、信頼できないクライアント接続へのアクセスを提供する方法で製品をデプロイしたりしないでください。
- 信頼できるネットワーク内で実行されている場合であっても、すべての通信チャネルが暗号化されていること、および認証が常に有効になっていることを確認してください。
最小特権アカウント
データを読み取るためにインメモリー・アナリスト(PGX)が使用するデータベース・ユーザー・アカウントは、権限の低い読取り専用アカウントである必要があります。PGXは、データベースの上位で読取り専用キャッシュとして機能するインメモリー・アクセラレータで、データベースにデータを書き戻しません。
アプリケーションでグラフ・データを書き込み、後でPGXを使用して分析する必要がある場合は、各コンポーネントに2つの異なるデータベース・ユーザー・アカウントを必ず使用してください。
親トピック: プロパティ・グラフのサポートの概要
1.5 対話型グラフ・シェル
Oracle Graphサーバーとクライアント・パッケージの両方に、製品のすべてのJava APIをローカルまたはリモート・コンピュータで操作するための対話型コマンドライン・アプリケーションが含まれています。
この対話型グラフ・シェルは、ユーザーからのコマンドライン入力を動的に解釈し、基になる機能を呼び出してこれらを実行し、結果の印刷や結果の追加処理を行うことができます。グラフ・シェルには、Javaアプリケーションを作成することなくグラフ機能を実行する軽量かつ対話型の方法が用意されています。
グラフ・シェルは、特に次のいずれかの操作を行う場合に役立ちます。
- 大規模なアプリケーションを作成するのではなく、特定のデータ・セットに対して個別グラフ分析をすばやく実行する
- データ・セットの様々なグラフ分析を対話形式で試行して、データ・セットを探索する
- 製品の使用方法を学習し、組込みアルゴリズムに適している処理を理解する
- カスタム・グラフ分析アルゴリズムを開発およびテストする
同じグラフシェル実行可能プログラムをローカル・モードとリモート・モードの両方で使用できます。
このグラフ・シェルは、Javaシェル・ツール(JShell)の上位に実装されます。そのため、タブ補完、履歴、逆検索、セミコロン推論、スクリプト・ファイル、内部変数など、JShellが提供するすべての機能を継承します。
グラフ・シェルは、(--base_url
コマンドライン・オプションに応じてリモートまたは埋込みで) PGXインスタンスに自動的に接続し、PGXセッションを作成します。--base_url
を指定しない場合は、新しいローカルPGXインスタンスとセッションが作成されます。
グラフ・シェルの起動
グラフ・シェルはJShellを使用します。つまり、シェルはJava 11以降で実行する必要があります。
インストール後、シェルの実行可能ファイルは、サーバーのインストール後に/opt/oracle/graph/bin
に、またはクライアントのインストール後に<INSTALL_DIR>/bin
にあります。シェルを起動するには、端末に次のコマンドを入力します。
./bin/opg-jshell
これにより、シェルが埋込み(ローカル)モードで起動します。これはグラフ関数がクライアントJVMで実行されることを意味します。
シェルが起動すると、次のコマンドライン・プロンプトが表示されます。
opg-jshell-rdbms>
Javaの複数のバージョンがインストールされている場合、シェルを起動する前にJAVA_HOME変数を設定することにより、インストールを簡単に切り替えることができます。次に例を示します。
export JAVA_HOME=/usr/lib/jvm/java-11-oracle
コマンドライン・オプション
使用可能なコマンドライン・オプションのリストを表示するには、--help
をopg-jshell
コマンドに追加します。
./bin/opg-jshell --help
埋込み(ローカル)モードとリモート・モード
グラフ・シェルは、埋込み(ローカル)モードまたはリモート・モードで起動できます。デフォルトでは、シェルは埋込みモードで起動します。つまり、ローカルPGXインスタンスは、シェルが実行されているものと同じJVMで作成されて実行されます。
埋込みモードは、Graph Serverのインストールでのみサポートされます。グラフ・クライアント・インストールは、リモート・モードのみサポートします。
ローカルPGXインスタンスは、/etc/oracle/graph/pgx.conf
からPGX構成ファイルをロードしようとします。構成ファイルの場所を変更するには、構成ファイルへのパスを後ろに付けて--pgx_conf
コマンドライン・オプションを渡します。
# start local PGX instance with custom config
./bin/opg-jshell --pgx_conf path/to/my/pgx.conf
グラフ・シェルは、ローカル(埋込み)モードまたはリモート・モードでも起動できます。その場合、シェルは、別のJVM (おそらく別のマシン)で実行されているPGXインスタンスに接続します。シェルをリモート・モードで起動するには、--base_url
オプションを使用してサーバーのベースURLを指定します。次に例を示します。
./bin/opg-jshell --base_url https://myserver.com:7007
スクリプトのバッチ実行
グラフ・シェルは、スクリプトへのパスをopg-jshell
コマンドに渡すことで、スクリプトを実行できます。次に例を示します。
./bin/opg-jshell /path/to/script.jsh
事前定義済関数
グラフ・シェルには次のユーティリティ機能があります。
println(String)
: System.out.println(String)の簡略表現。loglevel(String loggerName, String levelName)
: ログレベルを設定する便利な機能。
loglevel
関数では、ロガーに対してログ・レベルを設定できます。たとえば、loglevel("ROOT", "INFO")
はルート・ロガーのレベルをINFO
に設定します。これにより、INFO
および上位のログ(WARN
、ERROR
、FATAL
)がすべてコンソールに出力されます。
スクリプト引数
スクリプトのパラメータは後から指定できます。次に例を示します。
./bin/opg-jshell /path/to/script.jsh script-arg-1 script-arg-2
この例では、スクリプト/path/to/script.jsh
がscriptArgs
システム・プロパティを介して引数にアクセスできます。次に例を示します。
println(System.getProperty("scriptArgs"))// Prints: script-arg-1 script-arg-2
対話方式モードの維持
デフォルトでは、グラフ・シェルは実行の終了後に終了します。スクリプトが正常に終了した後も対話モードのままにするには、--keep_running
フラグをシェルに渡します。次に例を示します。
./bin/opg-jshell -b https://myserver.com:7007/ /path/to/script.jsh --keep_running
親トピック: プロパティ・グラフのサポートの概要
1.6 Oracle Databaseへのグラフの格納とメモリーへのグラフのロード
2層モード(グラフ・クライアントはOracle Databaseに直接接続)または3層モード(グラフ・クライアントは中間層のグラフ・サーバー(PGX)に接続し、Oracle Databaseに接続)でグラフを操作できます。
Oracle Databaseに接続するための両方のモードは、データベースが自律型か非自律型かに関係なく使用できます。
グラフを格納するデータベース・スキーマには、「データベース・ユーザーに必要な権限」にリストされている権限が必要です。
Oracle Autonomous Databaseを使用している場合、2層および3層のデプロイメントの詳細は、「Autonomous DatabaseでのOracle Graphの使用」を参照してください。
- 2層モード
2層モードでは、クライアント・グラフ・アプリケーションがOracle Databaseに直接接続します。 - 3層モード
3層モードでは、クライアントのグラフ・アプリケーションは中間層のグラフ・サーバー(PGX)に接続し、グラフ・サーバーがOracle Databaseに接続します。
親トピック: プロパティ・グラフのサポートの概要
1.6.1 2層モード
2層モードでは、クライアント・グラフ・アプリケーションがOracle Databaseに直接接続します。
グラフはプロパティ・グラフ・スキーマに格納されます(「Oracle Databaseのプロパティ・グラフ・スキーマ・オブジェクト」を参照)。
PGQL DDL文CREATE PROPERTY GRAPHを使用すると、データベース表からグラフを作成してプロパティ・グラフ・スキーマに格納できます。その後、JShellシェル、Javaアプリケーションまたはグラフ・ビジュアライゼーション・ツールから、このグラフにPGQL問合せを実行できます。
処理を高速化したり、分析APIを使用するために、グラフをプロパティ・グラフ・スキーマからグラフ・サーバーのメモリーにロードできます。
1.6.2 3層モード
3層モードでは、クライアントのグラフ・アプリケーションは中間層のグラフ・サーバー(PGX)に接続し、グラフ・サーバーがOracle Databaseに接続します。
グラフは、プロパティ・グラフ・スキーマからグラフ・サーバーにロードしたり、データベース表からグラフ・サーバーに直接ロードすることができます。
-
プロパティ・グラフ・スキーマからのグラフのロード:
グラフ・サーバーでプロパティ・グラフ・スキーマからメモリーへのグラフのロードは、2層モードの場合と同じです。
-
データベース表からのグラフの直接ロード:
グラフ・サーバーでデータベース表からメモリーにグラフをロードする場合は、データベース表からデータを直接読み込むことにより、メモリー内にグラフを作成します。プロパティ・グラフ・スキーマにはグラフを作成しません。
データベース表からメモリーへのグラフのロードの詳細は、「Oracle Databaseからメモリーへのデータの読取り」を参照してください。
グラフがメモリーにロードされたら、JShellシェル、Javaアプリケーションまたはグラフ・ビジュアライゼーション・ツールから、このグラフにPGQL問合せを実行できます。JShellシェルまたはJavaアプリケーションからグラフ分析APIを実行し、グラフ・ビジュアライゼーション(GraphViz)で結果を視覚化できます。
1.7 Autonomous DatabaseでのOracle Graphの使用
Oracle Graph Server and Clientは、Oracle Autonomous Databaseのファミリをサポートしています。
これには、すべてのバージョンのOracle Autonomous Data Warehouse (共有)、Oracle Autonomous Database (共有)およびOracle Autonomous Database (専用)が含まれます。
2層モード(Autonomous Databaseに直接接続)または3層モード(中間層のPGXに接続し、Autonomous Databaseに接続する)で接続できます。(2層および3層の接続モードの基本情報は、「Oracle Databaseへのグラフの格納とメモリーへのグラフのロード」を参照してください)。
グラフを格納するデータベース・スキーマには、「データベース・ユーザーに必要な権限」にリストされている権限が必要です。
- Autonomous Databaseを使用したOracle Graphの2層デプロイメント
2層デプロイメントでは、クライアント・グラフ・アプリケーションがAutonomous Databaseに直接接続します。 - Autonomous Databaseを使用したOracle Graphの3層デプロイメント
3層デプロイメントでは、クライアント・グラフ・アプリケーションが中間層のPGXに接続し、PGXがAutonomous Databaseに接続します。
親トピック: プロパティ・グラフのサポートの概要
1.7.1 Autonomous Databaseを使用したOracle Graphの2層デプロイメント
2層デプロイメントでは、クライアント・グラフ・アプリケーションがAutonomous Databaseに直接接続します。
- 「プロパティ・グラフの前提条件」で説明されているように、Oracle Graph Serverをインストールします。
- Oracle Autonomous Warehouseのドキュメントで説明されているように、JDBC接続を確立します。
Oracle Graphサーバーのインストールには、Autonomous Databaseに接続するために必要なすべてのJDBCクライアント・ライブラリがすでに含まれています。自分でインストールする必要はありません。ウォレットをダウンロードし、セキュアな場所に解凍し、接続の確立時に参照するだけで済みます。
次に例を示します。
opg-jshell-rdbms> var jdbcUrl = "jdbc:oracle:thin:@db201901151442_low?TNS_ADMIN=/etc/wallet" opg-jshell-rdbms> var user = "hr" opg-jshell-rdbms> var pass = "ChangeMe1234#_" opg-jshell-rdbms> var conn = DriverManager.getConnection(jdbcUrl, user, pass) conn ==> oracle.jdbc.driver.T4CConnection@57e6cb01
- グラフ・アプリケーションの接続を使用します。
1.7.2 Autonomous Databaseを使用したOracle Graphの3層デプロイメント
3層デプロイメントでは、クライアント・グラフ・アプリケーションが中間層のPGXに接続し、PGXがAutonomous Databaseに接続します。
Oracle Cloudコンソールからダウンロードしたウォレットは、主にルーティング・ウォレットです。つまり、適切なデータベースに接続をルーティングしたり、接続を暗号化したりするために使用されます。ほとんどの場合、これらは自動ログイン・ウォレットではないため、実際の接続のパスワードは含まれません。通常、パスワードはウォレットの場所に個別に提供する必要があります。
グラフ・サーバーでは、クライアント・ファイル・システムに格納されているウォレットや、リモート・ユーザーが直接提供するウォレットはサポートされていません。これによって生じる高レベルでの影響は次のとおりです。
- サーバー管理者はウォレットを提供して、サーバーのファイル・システムにウォレットを安全に格納します。
- Java EE接続プールと同様に、リモート・ユーザーは接続時にそのウォレットを使用します。これは、サーバー管理者は、すべてのリモート・ユーザーがそのウォレットを使用すると信頼することを意味します。本番デプロイメントと同様に、PGXサーバーも、認証および認可を適用して信頼性を確立するように構成する必要があります。
- リモート・ユーザーは依然として、非自律型データベースと同様に、グラフ読取りリクエストを送信するときにユーザー名とパスワードを指定する必要があります。
- 各PGXサーバーには1つのウォレットのみ構成できます。
同じPGXサーバーを複数のAutonomous Databaseに接続することはサポートされていません。このユースケースがある場合、Autonomous Databaseごとに1つのPGXサーバーを起動します。
事前ロード済グラフ
サーバー起動時にAutonomous DatabaseからPGXにグラフを読み取るには、「Oracle Databaseからメモリーへのデータの読取り」で説明されているステップに従って、次の操作を実行します。
- データベース・パスワードを含むJavaキーストアを作成します
- ロードするグラフの場所およびプロパティを記述したPGXグラフ構成ファイルを作成します
- グラフ構成ファイルを参照するように
/opt/oracle/graph/pgx.conf
ファイルを更新します
次に、未圧縮のOracle Walletの場所を参照するようにサーバーJVMを構成してから、JAVA_OPTS環境を設定して起動します。次に例を示します。
export JAVA_OPTS="-Doracle.net.tns_admin=/etc/wallet -Doracle.jdbc.fanEnabled=false"
cd /opt/oracle/graph
./pgx/bin/start-server --secret-store /etc/keystore.p12
systemd
を使用してPGXサーバーを起動した場合は、/etc/systemd/system/pgx.service
にあるサービス・ファイルを編集し、[Service]ディレクティブの下の環境変数を指定します。
Environment="JAVA_OPTS=-Doracle.net.tns_admin=/etc/wallet"
Oracle Graphユーザー(systemd
の使用時にPGXサーバーを起動するユーザー)がディレクトリ(前の例では/etc/wallet
)を読取り可能なことを確認します。
ファイルを編集したら、次を使用して変更をリロードします。
systemctl daemon-reload
オンデマンド・グラフ・ロード
PGXのリモート・ユーザーが必要に応じてAutonomous Databaseから読み取ることができるようにするには、次の2つのアプローチから選択できます。
-
oracle.net.tns_admin
システム・プロパティを使用して、サーバー起動時にウォレットへのパスを提供します。リモート・ユーザーは、グラフ構成ファイルにTNSアドレス名、ユーザー名およびキーストア別名(パスワード)を提供する必要があります。ウォレットはグラフ・サーバーのファイル・システムに安全に格納され、サーバー管理者は、すべてのリモート・ユーザーがウォレットを使用してAutonomous Databaseに接続することを信頼します。たとえば、サーバー管理者は、次のようにPGXサーバーを起動します。
export JAVA_OPTS="-Doracle.net.tns_admin=/etc/wallet -Doracle.jdbc.fanEnabled=false" cd /opt/oracle/graph ./pgx/bin/start-server --secret-store /etc/keystore.p12
/etc/wallet/tnsnames.ora
ファイルには、次のようなアドレスが含まれています。sombrero_medium = (description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=adb.us-ashburn-1.oraclecloud.com))(connect_data=(service_name=l8lgholga0ujxsa_sombrero_medium.adwc.oraclecloud.com))(security=(ssl_server_cert_dn="CN=adwc.uscom-east-1.oraclecloud.com,OU=Oracle BMCS US,O=Oracle Corporation,L=Redwood City,ST=California,C=US")))
これで、リモート・ユーザーは、次の接続プロパティを持つグラフ構成ファイルを送信することにより、サーバーにデータを読み込むことができます。
{ ... "jdbc_url": "jdbc:oracle:thin:@sombrero_medium", "username": "hr", "keystore_alias": "database1", ... }
キーストアはクライアント側に引き続き存在し、構成オブジェクトで参照される
hr
ユーザーのパスワードを含んでいる必要があることに注意してください(「Oracle Databaseからメモリーへのデータの読取り」を参照)。TomcatまたはWebLogic Serverデプロイメントにも同様のアプローチが適用されます。 -
Webアプリケーション・サーバーでJava EE接続プールを使用します。リモート・ユーザーは、グラフ構成ファイルにデータソース名を指定するだけで済みます。ウォレットおよび接続資格証明はWebアプリケーション・サーバーのファイル・システムに安全に格納され、サーバー管理者は、すべてのリモート・ユーザーがプールから接続を使用してAutonomous Databaseに接続することを信頼します。
このようなデータ・ソースを設定する手順は、次の場所にあります。データソースにadb_dsという名前を付けた場合、次の接続プロパティを持つグラフ構成ファイルを送信してこれらを参照できます。
{ ... "datasource_id": "adb_ds", ... }
1.8 プロパティ・グラフ・アプリケーションのリリース20より前からの移行
Oracle Spatial and Graphの前のバージョンからリリース20に移行する場合、既存のプロパティ・グラフ関連のアプリケーションの変更が必要な場合があります。
セキュリティ関連の変更
Oracle Graphリリース20.1には、製品のプロパティ・グラフ・コンポーネントのセキュリティをさらに強化するための一連の拡張機能が含まれています。次の拡張機能では、既存のグラフ・アプリケーションを引き続き正しく動作させるために手動での変更が必要な場合があります。
- グラフ構成ファイルでは現在、Javaキーストア・ファイルにシークレットを格納する必要があります
以前は、シークレットをプレーン・テキストでグラフ構成ファイルに書き込むことができました。リリース20.1以降では許可されなくなったため、かわりにJavaキーストア・ファイルにシークレットを格納することが必要になりました。これは、グラフ構成ファイルから直接参照できます。(このようなキーストアの作成および参照方法は、Oracle Databaseからメモリーへのデータの読取りを参照してください。)
シークレットを含む既存のすべてのグラフ構成ファイルを、キーストア・ベースの方式に移行する必要があります。
- 3層デプロイメントでは、PGXサーバー・ファイル・システムにアクセスするにはホワイトリストが必要です
デフォルトでは、PGXサーバーはローカル・ファイル・システムへのリモート・アクセスを許可しません。ただし、これは、
/etc/oracle/graph/pgx.conf
でallow_local_filesystem
をtrue
に設定すると、明示的に許可できます。Oracle Graph 20.1以降では、allow_local_filesystem
をtrue
に設定する場合、datasource_dir_whitelist
を設定して、アクセス対象の"ホワイトリストに入れられた"ディレクトリのリストも指定する必要があります。次に例を示します。"allow_local_filesystem": true, "datasource_dir_whitelist": ["/scratch/data1", "/scratch/data2"]
これにより、リモート・ユーザーは、サーバーのファイルシステム上のデータを
/scratch/data1
および/scratch/data2
で読み書きできるようになります。 - 3層デプロイメントでは、リモートの場所からPGXへの読取りはデフォルトでは許可されなくなりました
以前は、PGXでは、FTPまたはHTTPを介してリモートの場所からグラフ・データを読み取ることが許可されていました。Oracle Graph 20.1以降、これはデフォルトでは許可されなくなり、サーバー管理者が明示的にオプトインする必要があります。オプトインするには、
/etc/oracle/graph/pgx.conf
でallowed_remote_loading_locations
構成オプションを指定します。次に例を示します。allowed_remote_loading_locations: ["*"]
また、次のことに注意してください。
- ftpおよびhttpプロトコルは、暗号化されていないために安全ではなく、データのロードまたは格納用としてサポートされなくなりました。
- 構成ファイルはリモートの場所からロードできなくなりましたが、ローカル・ファイル・システムからロードする必要があります。
- シェル・コマンドライン・オプションを削除しました
Groovyベースの
opg
シェルの次のコマンドライン・オプションは削除されたため、機能しなくなります。--attach
- シェルは、コマンドラインを介した既存のセッションへの接続をサポートしなくなりました--password
- シェルは、パスワードを要求するようになりました
また、Groovyベースのシェルは非推奨になったため、かわりに新しいJShellベースのシェルを使用することをお薦めします(「対話型グラフ・シェル」を参照)。
- PGX APIの変更点
次のAPIは、グラフ構成情報を返さなくなりました。
ServerInstance#getGraphInfo()
ServerInstance#getGraphInfos()
ServerInstance#getServerState()
REST APIでは、コレクション、グラフおよびプロパティが名前ではなくUUIDで識別されるようになりました。
グラフとプロパティのネームスペースは、デフォルトでセッションのプライベートになりました。このため、名前の競合が原因で以前は例外をスローしていた操作の一部が成功するようになりました。
PgxGraph#publish()
は、指定された名前のグラフが以前にパブリッシュされていた場合に例外をスローするようになりました。
新規データベース・バージョンへのデータの移行
Oracle Graph 20.1は、旧バージョンのデータベースと連携して動作します。(詳細は、「プロパティ・グラフの前提条件」の「データベースの互換性と制限事項」サブトピックを参照してください)。アップグレードの一部としてOracle Databaseもアップグレードした場合は、アップグレード後にデータベースで次のヘルパー・スクリプトを起動することにより、Oracleプロパティ・グラフ形式を使用して格納された既存のグラフ・データを移行できます。
sqlplus> execute mdsys.opg.migrate_pg_to_current(graph_name=>'mygraph');
前の例では、プロパティ・グラフmygraphを現在のデータベース・バージョンに移行します。
Oracle Spatial and Graphの以前のバージョンのアンインストール
これは、Oracle Databaseバージョン12.2、18cまたは19cを使用している場合にのみ必要です。
Oracle Spatial and Graphでの「グラフ」のサポートのパッケージ化が変更され、Oracle Databaseとは別にインストールされるようになりました。(Oracle Spatial and Graphの「空間」サポートは、Oracle Databaseとは別にはインストールされません。)グラフ・サポートのインストールが完了し、前述の移行ステップ(必要な場合)が完了し、すべて正常に機能していることを確認したら、次のアンインストール・ステップを実行して、Oracle Databaseインストールから古いOracle Spatial and Graphインストールのバイナリを削除することをお薦めします。
-
Spatial and Graphのプロパティ・グラフの中間層コンポーネントが、ターゲット・データベース・ホストで使用されていないことを確認してください。たとえば、
$ORACLE_HOME/md/property_graph
の下にあるファイルを使用するアプリケーションが実行されていないことを確認してください。このようなアプリケーションの例として、データベースと同じホスト上で実行されているPGXサーバーや、$ORACLE_HOME/md/property_graph/lib
の下にあるJARファイルを参照するクライアント・アプリケーションなどがあります。アンインストールを実行するためにデータベースを停止する必要はありません。Oracleデータベース自体は、
$ORACLE_HOME/md/property_graph
の下にあるファイルを参照または使用しません。 - データベース・ホストの
$ORACLE_HOME/md/property_graph
の下にあるファイルを削除します。Linuxでは、次のヘルパー・スクリプトをデータベース・ホストにコピーし、DBAオペレーティング・システム・ユーザーとして実行できます:/opt/oracle/graph/scripts/patch-opg-oracle-home.sh
親トピック: プロパティ・グラフのサポートの概要
1.9 クイック・スタート: グラフ・データの対話的分析
このチュートリアルでは、プロパティ・グラフ・データを使用してすばやく開始する方法を示します。
- 既存のリレーショナル・データをグラフに変換します。
- PGQLを使用してそのデータを問い合せます。
- そのデータおよび表示結果についてグラフ・アルゴリズムを実行します。
サーバーを設定することなく、このすべての操作をローカルの端末で実行できます。必要なものは次のとおりです。
- Oracle Graphサーバーのインストール(プロパティ・グラフの前提条件を参照)
- この例の対話型分析のためのJava 11。Javaのダウンロードについては、https://www.oracle.com/technetwork/java/javase/overview/index.htmlを参照してください。
- Oracle Database 20cへの接続の詳細。(他のバージョンのOracle Databaseも機能しますが、プロパティ・グラフの前提条件に注意してください。)
- Oracle Databaseでコマンドを実行する方法(SQL*PlusやSQL Developerの使用など)に関する基本的な知識です。
このチュートリアルの主なタスク:
- サンプル・データの設定
- シェルの起動
- JDBCデータベース接続を開く
- PGQL接続の作成
- グラフ作成文の作成および実行
- いくつかのPGQL問合せの実行
- メモリーへのグラフのロード
- アルゴリズムの実行およびアルゴリズム結果の問合せ
- リモート・グラフ・サーバーの操作
サンプル・データの設定
この例では、HR (人事)サンプル・データセットを使用します。
- このデータをユーザー管理データベースにインポートする手順は、https://github.com/oracle/db-sample-schemasを参照してください。
- Autonomous Databaseを使用する場合は、https://www.thatjeffsmith.com/archive/2019/07/creating-hr-in-oracle-autonomous-database-w-sql-developer-web/を参照してください
グラフを格納するデータベース・スキーマには、「データベース・ユーザーに必要な権限」にリストされている権限が必要になることに注意してください。
シェルの起動
Oracle Graphサーバーがインストールされているシステムで、次のようにしてシェルを起動します。
cd /opt/oracle/graph
./bin/opg-jshell
これにより、シェルが埋込み(ローカル)モードで起動します。これはグラフ関数がクライアントJVMで実行されることを意味します。
Javaの複数のバージョンがインストールされている場合、シェルを起動する前にJAVA_HOME変数を設定することにより、インストールを簡単に切り替えることができます。次に例を示します。
export JAVA_HOME=/usr/lib/jvm/java-11-oracle
シェルの詳細は、対話型グラフ・シェルを参照してください。
JDBCデータベース接続を開く
シェル・プロンプト内で、標準のJDBC Java APIを使用して、データベース接続オブジェクトを取得します。次に例を示します。
opg-jshell-rdbms> var jdbcUrl = "<jdbc-url>" // for example: jdbc:oracle:thin:@myhost:1521/myservice
opg-jshell-rdbms> var user = "<db-user>" // for example: hr
opg-jshell-rdbms> var pass = "<db-pass>"
opg-jshell-rdbms> var conn = DriverManager.getConnection(jdbcUrl, user, pass)
conn ==> oracle.jdbc.driver.T4CConnection@57e6cb01
Javaの複数のバージョンがインストールされている場合、シェルを起動する前にJAVA_HOME変数を設定することにより、インストールを簡単に切り替えることができます。次に例を示します。
export JAVA_HOME=/usr/lib/jvm/java-11-oracle
Autonomous Databaseへの接続も同様に機能します。ローカル・ウォレットを指すJDBC URLを指定します。例は、Autonomous DatabaseでのOracle Graphの使用を参照してください。
PGQL接続の作成
JDBC接続をPGQL接続オブジェクトに変換します。次に例を示します。
opg-jshell-rdbms> conn.setAutoCommit(false)
opg-jshell-rdbms> var pgql = PgqlConnection.getConnection(conn)
pgql ==> oracle.pg.rdbms.pgql.PgqlConnection@6fb3d3bb
グラフ作成文の作成および実行
テキスト・エディタを使用して、HRサンプル・データをグラフに変換する方法を記述するCREATE PROPERTY GRAPH文を作成します。このファイルをcreate.pgql
として任意の場所に保存します。次に例を示します。
CREATE PROPERTY GRAPH hr
VERTEX TABLES (
employees LABEL employee
PROPERTIES ARE ALL COLUMNS EXCEPT ( job_id, manager_id, department_id ),
departments LABEL department
PROPERTIES ( department_id, department_name ),
jobs LABEL job
PROPERTIES ARE ALL COLUMNS,
job_history
PROPERTIES ( start_date, end_date ),
locations LABEL location
PROPERTIES ARE ALL COLUMNS EXCEPT ( country_id ),
countries LABEL country
PROPERTIES ARE ALL COLUMNS EXCEPT ( region_id ),
regions LABEL region
)
EDGE TABLES (
employees AS works_for
SOURCE employees
DESTINATION KEY ( manager_id ) REFERENCES employees
NO PROPERTIES,
employees AS works_at
SOURCE employees
DESTINATION departments
NO PROPERTIES,
employees AS works_as
SOURCE employees
DESTINATION jobs
NO PROPERTIES,
departments AS managed_by
SOURCE departments
DESTINATION employees
NO PROPERTIES,
job_history AS for_employee
SOURCE job_history
DESTINATION employees
LABEL for
NO PROPERTIES,
job_history AS for_department
SOURCE job_history
DESTINATION departments
LABEL for
NO PROPERTIES,
job_history AS for_job
SOURCE job_history
DESTINATION jobs
LABEL for
NO PROPERTIES,
departments AS department_located_in
SOURCE departments
DESTINATION locations
LABEL located_in
NO PROPERTIES,
locations AS location_located_in
SOURCE locations
DESTINATION countries
LABEL located_in
NO PROPERTIES,
countries AS country_located_in
SOURCE countries
DESTINATION regions
LABEL located_in
NO PROPERTIES
)
次に、グラフ・シェルに戻り、CREATE PROPERTY GRAPH文をPGQL接続に送信して実行します。<path>を、create.pgql
ファイルを含むディレクトリのパスに置き換えます。
opg-jshell-rdbms> pgql.prepareStatement(Files.readString(Paths.get("<path>/create.pgql"))).execute()
$16 ==> false
いくつかのPGQL問合せの実行
これで、hr
というグラフが作成されたので、PGQLを使用して、データベース上で直接そのグラフに対していくつかの問合せを実行できます。次に例を示します。
// define a little helper function that executes the query, prints the results and properly closes the statement
opg-jshell-rdbms> Consumer<String> query = q -> { try(var s = pgql.prepareStatement(q)) { s.execute(); s.getResultSet().print(); } catch(Exception e) { throw new RuntimeException(e); } }
query ==> $Lambda$605/0x0000000100ae6440@6c9e7af2
// print the number of vertices in the graph
opg-jshell-rdbms> query.accept("select count(v) from hr match (v)")
+----------+
| count(v) |
+----------+
| 215 |
+----------+
// print the number of edges in the graph
opg-jshell-rdbms> query.accept("select count(e) from hr match ()-[e]->()")
+----------+
| count(e) |
+----------+
| 433 |
+----------+
// find the highest earning managers
opg-jshell> query.accept("select distinct m.FIRST_NAME, m.LAST_NAME, m.SALARY from hr match (v:EMPLOYEE)-[:WORKS_FOR]->(m:EMPLOYEE) order by m.SALARY desc")
+---------------------------------------+
| m.FIRST_NAME | m.LAST_NAME | m.SALARY |
+---------------------------------------+
| Steven | King | 24000.0 |
| Lex | De Haan | 17000.0 |
| Neena | Kochhar | 17000.0 |
| John | Russell | 14000.0 |
| Karen | Partners | 13500.0 |
| Michael | Hartstein | 13000.0 |
| Alberto | Errazuriz | 12000.0 |
| Shelley | Higgins | 12000.0 |
| Nancy | Greenberg | 12000.0 |
| Den | Raphaely | 11000.0 |
| Gerald | Cambrault | 11000.0 |
| Eleni | Zlotkey | 10500.0 |
| Alexander | Hunold | 9000.0 |
| Adam | Fripp | 8200.0 |
| Matthew | Weiss | 8000.0 |
| Payam | Kaufling | 7900.0 |
| Shanta | Vollman | 6500.0 |
| Kevin | Mourgos | 5800.0 |
+---------------------------------------+
// find the average salary of accountants in the Americas
opg-jshell> query.accept("select avg(e.SALARY) from hr match (e:EMPLOYEE) -[h:WORKS_AT]-> (d:DEPARTMENT) -[:LOCATED_IN]-> (:LOCATION) -[:LOCATED_IN]-> (:COUNTRY) -[:LOCATED_IN]-> (r:REGION) where r.REGION_NAME = 'Americas' and d.DEPARTMENT_NAME = 'Accounting'")
+---------------+
| avg(e.SALARY) |
+---------------+
| 14500.0 |
+---------------+
メモリーへのグラフのロード
次に、グラフをPGXにロードします。これにより、様々な種類の組込みアルゴリズムをグラフで実行できるようになり、より大きなグラフの問合せパフォーマンスも大幅に改善されます。グラフをメモリーにロードするには、PGXグラフ構成ビルダーAPIを使用してPGXグラフ構成オブジェクトを作成し、これをシェルで直接実行します。
ノート:
グラフ・データを使用したセキュリティのベスト・プラクティスで説明されているとおり、PGXには常に低権限の読取り専用データベース・ユーザー・アカウントを使用してください。
次の例では、PGXグラフ構成オブジェクトを作成します。メモリーにロードするプロパティがリストされるため、他のプロパティを除外してメモリー消費を削減できます。
Supplier<GraphConfig> pgxConfig = () -> { return GraphConfigBuilder.forPropertyGraphRdbms()
.setJdbcUrl(jdbcUrl)
.setUsername(user)
.setPassword(pass)
.setName("hr")
.addVertexProperty("COUNTRY_NAME", PropertyType.STRING)
.addVertexProperty("DEPARTMENT_NAME", PropertyType.STRING)
.addVertexProperty("FIRST_NAME", PropertyType.STRING)
.addVertexProperty("LAST_NAME", PropertyType.STRING)
.addVertexProperty("EMAIL", PropertyType.STRING)
.addVertexProperty("PHONE_NUMBER", PropertyType.STRING)
.addVertexProperty("SALARY", PropertyType.DOUBLE)
.addVertexProperty("MIN_SALARY", PropertyType.DOUBLE)
.addVertexProperty("MAX_SALARY", PropertyType.DOUBLE)
.addVertexProperty("STREET_ADDRESS", PropertyType.STRING)
.addVertexProperty("POSTAL_CODE", PropertyType.STRING)
.addVertexProperty("CITY", PropertyType.STRING)
.addVertexProperty("STATE_PROVINCE", PropertyType.STRING)
.addVertexProperty("REGION_NAME", PropertyType.STRING)
.setPartitionWhileLoading(PartitionWhileLoading.BY_LABEL)
.setLoadVertexLabels(true)
.setLoadEdgeLabel(true)
.build(); }
グラフ構成オブジェクトが作成されたので、次のAPIを使用してグラフをPGXに読み取ります。
opg-jshell-rdbms> var graph = session.readGraphWithProperties(pgxConfig.get())
graph ==> PgxGraph[name=hr,N=215,E=433,created=1586996113457]
セッション・オブジェクトは自動的に作成され、シェルで実行されているローカルPGXインスタンスを指します。
アルゴリズムの実行およびアルゴリズム結果の問合せ
メモリー内にグラフがあるので、単一のAPI呼出しを使用して各組込みアルゴリズムを実行できます。たとえば、pagerank
の場合は次のようになります。
opg-jshell-rdbms> analyst.pagerank(graph)
$31==> VertexProperty[name=pagerank,type=double,graph=hr]
前述の出力からわかるように、各アルゴリズムにより、アルゴリズムの出力を保持するグラフに新しい頂点プロパティが作成されました。グラフ内で最も重要な人々を(pagerank
に応じて)印刷するには、次の問合せを実行します。
opg-jshell> session.queryPgql("select m.FIRST_NAME, m.LAST_NAME, m.pagerank from hr match (m:EMPLOYEE) order by m.pagerank desc limit 10").print().close()
+----------------------------------------------------+
| m.FIRST_NAME | m.LAST_NAME | m.pagerank |
+----------------------------------------------------+
| Adam | Fripp | 0.002959240305566317 |
| John | Russell | 0.0028810951120575284 |
| Michael | Hartstein | 0.002181365227465801 |
| Alexander | Hunold | 0.002082616009054747 |
| Den | Raphaely | 0.0020378615199327507 |
| Shelley | Higgins | 0.002028946863425767 |
| Nancy | Greenberg | 0.0017419394483596667 |
| Steven | King | 0.0016622985848193119 |
| Neena | Kochhar | 0.0015252785582170803 |
| Jennifer | Whalen | 0.0014263044976976823 |
+----------------------------------------------------+
リモート・グラフ・サーバーの操作
シェルをリモート・モードで起動するには、--base_urlオプションを使用してサーバーのURLを指定します。次に例を示します。
./bin/opg-jshell --base_url https://myserver.com:7007
グラフを他のクライアント・セッションと共有したり、ビジュアライゼーション・ツールを使用してグラフにアクセスする場合は、サーバーを埋込みモードで使用できません。かわりに次のコマンドを実行して、グラフ・サーバー(PGX)をスタンドアロンで起動する必要があります。
$ /opt/oracle/graph/pgx/bin/start-server
次に、リモート・モードでシェルを使用して、グラフ・サーバーに接続します。
グラフをサーバーにロードした後、publish()
APIを使用して、他のセッションからグラフが見えるようにする必要があります。次に例を示します。
graph.publish(VertexProperty.ALL, EdgeProperty.ALL)
公開されたグラフには、pagerank
などの関数をコールしてグラフに追加した、新しいプロパティがすべて含まれます。
グラフ・ビジュアライゼーション・アプリケーションは、ブラウザで<my-server-name>:7007/ui/
に移動すると使用できます。(このアプリケーションの詳細は、「グラフ・ビジュアライゼーション・アプリケーション(GraphViz)」で説明されています)。
親トピック: プロパティ・グラフのサポートの概要