A.8.2 クイック・スタート: グラフ・サーバー(PGX)でのグラフの作成、問合せおよび分析
このチュートリアルでは、グラフ・サーバー(PGX)の使用時にプロパティ・グラフ・データの使用をすばやく開始する方法を示します。
これは、グラフ・サーバー(PGX)セッションがアクティブであるかぎりグラフを使用できるユースケース用です。グラフはデータベース内に永続化されません。
- 既存のリレーショナル・データから直接、グラフ・サーバー(PGX)にグラフを作成します
- グラフ・サーバー(PGX)でPGQLを使用してこのグラフを問い合せます
- このグラフのグラフ・サーバー(PGX)でグラフ・アルゴリズムを実行し、結果を表示します
-
Oracle Graphサーバーのインストール。
Oracle Graph Serverのダウンロードの詳細は、Oracle Graph Serverのインストールを参照してください。
-
Oracle Graphクライアントのインストール。
Oracle Graph Clientのダウンロードの詳細は、「グラフ・サーバーおよびクライアント・ダウンロードからのJavaクライアントのインストール」を参照してください。
グラフ・サーバーに対してデータベース・ユーザーとして自分自身を認証し、これらのデータベース資格証明を使用してデータベース表にアクセスし、グラフを作成します。
- Java 11
- グラフ・サーバーは、Java 8またはJava 11と連携できます。
- この例で使用するJShellクライアントには、Java 11が必要です。
Javaのダウンロードについては、https://www.oracle.com/technetwork/java/javase/overview/index.htmlを参照してください。
サンプル・データの設定
- このデータをユーザー管理データベースにインポートする手順は、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 Clientがインストールされているシステムで、次のようにシェルを起動します。これは、リモート・モードでシェルを起動し、グラフ・サーバー(PGX)に接続する例です。
./bin/opg4j --base_url https://<graph server host>:7007 --username <graphuser>
<graphuser>
は、PGXサーバー認証に使用するデータベース・ユーザーです。データベース・パスワードの入力を要求されます。
ノート:
デモ目的でのみ、/etc/oracle/graph/server.conf
ファイルでenable_tls
をfalse
に設定した場合にはhttps
接続のかわりにhttp
を使用できます。
./bin/opg4j --base_url http://<graph server host>:7007 --username <graphuser>
これによりシェルが起動し、グラフ・サーバーに接続します。
JAVA_HOME
をJava 11に設定する必要があることに注意してください。たとえば:export JAVA_HOME=/usr/lib/jvm/java-11-oracle
シェルの詳細は、対話型グラフ・シェルのCLIを参照してください。
グラフ作成文の作成および実行
CREATE PROPERTY GRAPH
文を実行して、従業員、部門および"employee works at department
"を含むグラフを作成します。次の文は、グラフ・サーバー(PGX)にグラフを作成します。opg4j> String statement =
"CREATE PROPERTY GRAPH hr_simplified "
+ " VERTEX TABLES ( "
+ " hr.employees LABEL employee "
+ " PROPERTIES ARE ALL COLUMNS EXCEPT ( job_id, manager_id, department_id ), "
+ " hr.departments LABEL department "
+ " PROPERTIES ( department_id, department_name ) "
+ " ) "
+ " EDGE TABLES ( "
+ " hr.employees AS works_at "
+ " SOURCE KEY ( employee_id ) REFERENCES employees (employee_id) "
+ " DESTINATION departments "
+ " PROPERTIES ( employee_id ) "
+ " )"
opg-jshell> session.executePgql(statement)
opg4j> var g = session.getGraph("HR_SIMPLIFIED")
いくつかのPGQL問合せの実行
opg4j> String query =
"SELECT dep.department_name "
+ "FROM MATCH (emp:Employee) -[:works_at]-> (dep:Department) "
+ "WHERE emp.first_name = 'Nandita' AND emp.last_name = 'Sarchand' "
+ "ORDER BY 1"
opg4j> var resultSet = g.queryPgql(query)
opg4j> resultSet.print()
+-----------------+
| department_name |
+-----------------+
| Shipping |
+-----------------+
opg4j> String query =
"SELECT label(n), COUNT(*) "
+ "FROM MATCH (n) "
+ "GROUP BY label(n) "
+ "ORDER BY COUNT(*) DESC"
opg4j> var resultSet = g.queryPgql(query)
opg4j> resultSet.print()
+-----------------------+
| label(n) | COUNT(*) |
+-----------------------+
| EMPLOYEE | 107 |
| DEPARTMENT | 27 |
+-----------------------+
エッジのタイプとその頻度の概要を取得するには、次のコマンドを実行します。
opg4j> String query =
"SELECT label(n) AS srcLbl, label(e) AS edgeLbl, label(m) AS dstLbl, COUNT(*) "
+ "FROM MATCH (n) -[e]-> (m) "
+ "GROUP BY srcLbl, edgeLbl, dstLbl "
+ "ORDER BY COUNT(*) DESC"
opg4j> var resultSet = g.queryPgql(query)
opg4j> resultSet.print()
+---------------------------------------------+
| srcLbl | edgeLbl | dstLbl | COUNT(*) |
+---------------------------------------------+
| EMPLOYEE | WORKS_AT | DEPARTMENT | 106 |
+---------------------------------------------+
アルゴリズムの実行およびアルゴリズム結果の問合せ
pagerank
の場合は次のようになります。opg4j> analyst.pagerank(g)
$31==> VertexProperty[name=pagerank,type=double,graph=hr]
opg4j> session.queryPgql("SELECT m.FIRST_NAME, m.LAST_NAME, m.pagerank FROM MATCH (m:EMPLOYEE) "
...> + "ON hr_simplified WHERE m.FIRST_NAME = 'Nandita' ").print().close()
+---------------------------------------------------+
| m.FIRST_NAME | m.LAST_NAME | m.pagerank |
+---------------------------------------------------+
| Nandita | Sarchand | 0.001119402985074627 |
+---------------------------------------------------+
次の例では、部門をそのpagerank
値で順序付けします。pagerank
の値が高い部門ほど、従業員が多くなります。
opg4j> session.queryPgql("SELECT m.DEPARTMENT_NAME, m.pagerank FROM MATCH (m:DEPARTMENT) ON hr_simplified ORDER BY m.pagerank").print().close()
+----------------------------------------------+
| DEPARTMENT_NAME | pagerank |
+----------------------------------------------+
| Manufacturing | 0.001119402985074627 |
| Construction | 0.001119402985074627 |
| Contracting | 0.001119402985074627 |
| Operations | 0.001119402985074627 |
| IT Support | 0.001119402985074627 |
| NOC | 0.001119402985074627 |
| IT Helpdesk | 0.001119402985074627 |
| Government Sales | 0.001119402985074627 |
| Retail Sales | 0.001119402985074627 |
| Recruiting | 0.001119402985074627 |
| Payroll | 0.001119402985074627 |
| Treasury | 0.001119402985074627 |
| Corporate Tax | 0.001119402985074627 |
| Control And Credit | 0.001119402985074627 |
| Shareholder Services | 0.001119402985074627 |
| Benefits | 0.001119402985074627 |
| Human Resources | 0.0020708955223880596 |
| Administration | 0.0020708955223880596 |
| Public Relations | 0.0020708955223880596 |
| Marketing | 0.003022388059701493 |
| Accounting | 0.003022388059701493 |
| Executive | 0.003973880597014925 |
| IT | 0.005876865671641792 |
| Purchasing | 0.006828358208955224 |
| Finance | 0.006828358208955224 |
| Sales | 0.03347014925373134 |
| Shipping | 0.043936567164179076 |
+----------------------------------------------+
他のセッションとのグラフの共有
publish()
APIを使用して、グラフ・ビジュアライゼーション・セッションなどの他のセッションでグラフを表示できます。たとえば:opg4j> graph.publish(VertexProperty.ALL, EdgeProperty.ALL)
公開されたグラフには、pagerank
などの関数をコールしてグラフに追加した、新しいプロパティがすべて含まれます。
ログインしているユーザーに、グラフを公開する権限があることを確認します。これを行うには、グラフを公開する権限の追加で説明されているように、権限PGX_SESSION_ADD_PUBLISHED_GRAPH
をGRAPH_DEVELOPER
ロールに追加します。Oracle DatabaseでのPL/SQLパッケージのインストールで、データベース・ユーザーにGRAPH_DEVELOPER
ロールを付与しました。
グラフ・ビジュアライゼーション・アプリケーションは、ブラウザで<my-server-name>:7007/ui/
に移動すると使用できます。
グラフ・ビジュアライゼーション・アプリケーションへのログイン時にセッションIDを指定することで、特定のクライアント・セッションに接続できます。公開されていない場合でも、セッション内のすべてのグラフを視覚化できます。
opg4j> session
session ==> PgxSession[ID=5adf83ab-31b1-4a0e-8c08-d6a95ba63ee0,source=pgxShell]
セッションIDは5adf83ab-31b1-4a0e-8c08-d6a95ba63ee0
です。
ノート:
グラフ・ビジュアライゼーション・アプリケーションからグラフ・サーバー(PGX)に接続するには、サーバー証明書を作成する必要があります。詳細は、トランスポート層セキュリティの設定を参照してください。