2.1.2 クイック・スタート: インメモリー・グラフ・サーバー(PGX)でのグラフの作成、問合せおよび分析

このチュートリアルでは、インメモリー・グラフ・サーバー(PGX)の使用時にプロパティ・グラフ・データの使用をすばやく開始する方法を示します。

これは、インメモリー・グラフ・サーバー(PGX)セッションがアクティブであるかぎりグラフを使用できるユースケース用です。グラフはデータベース内に永続化されません。

  • 既存のリレーショナル・データから直接、インメモリー・グラフ・サーバー(PGX)にグラフを作成します
  • インメモリー・グラフ・サーバー(PGX)でPGQLを使用してこのグラフを問い合せます
  • このグラフのインメモリー・グラフ・サーバー(PGX)でグラフ・アルゴリズムを実行し、結果を表示します
次のクイック・スタートの前提条件は、次のとおりです。
  • Oracle Graphサーバーのインストール(これがPGX、インメモリー・グラフ・サーバーです)。

    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を参照してください。

サンプル・データの設定

この例では、HR (人事)サンプル・データセットを使用します。

グラフを格納するデータベース・スキーマには、「データベース・ユーザーに必要な権限」にリストされている権限が必要になることに注意してください。

シェルの起動

Oracle Graph Clientがインストールされているシステムで、次のようにシェルを起動します。これは、リモート・モードでシェルを起動し、インメモリー・グラフ・サーバー(PGX)に接続する例です。

./bin/opg4j --base_url https://<graph server host>:7007 --username <graphuser>

<graphuser>は、PGXサーバー認証に使用するデータベース・ユーザーです。データベース・パスワードの入力を要求されます。

ノート:

デモ目的でのみ、/etc/oracle/graph/server.confファイルでenable_tlsfalseに設定した場合には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

シェルの詳細は、対話型グラフ・シェルを参照してください。

グラフ作成文の作成および実行

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 "
    + "      DESTINATION departments "
    + "      PROPERTIES ( employee_id ) "
    + "  )";
opg-jshell> session.executePgql(statement);
グラフへのハンドルを取得するには、次を実行します。
opg4j> PgxGraph g = session.getGraph("HR_SIMPLIFIED");

いくつかのPGQL問合せの実行

このハンドルを使用して、このグラフでPGQL問合せを実行できます。たとえば、Nandita Sarchandが勤務する部門を検索するには、次のように実行します。
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> PgqlResultSet 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> PgqlResultSet 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> PgqlResultSet resultSet = g.queryPgql(query);
opg4j> resultSet.print();

+---------------------------------------------+
| srcLbl   | edgeLbl  | dstLbl     | COUNT(*) |
+---------------------------------------------+
| EMPLOYEE | WORKS_AT | DEPARTMENT | 106      |
+---------------------------------------------+

アルゴリズムの実行およびアルゴリズム結果の問合せ

メモリー内にグラフがあるので、単一のAPI呼出しを使用して各組込みアルゴリズムを実行できます。たとえば、pagerankの場合は次のようになります。
opg4j> analyst.pagerank(g)
$31==> VertexProperty[name=pagerank,type=double,graph=hr]
前述の出力からわかるように、各アルゴリズムにより、アルゴリズムの出力を保持するグラフに新しい頂点プロパティが作成されました。グラフ内で最も重要な人々を(pagerankに応じて)印刷するには、次の問合せを実行します。
opg4j> session.queryPgql("select m.FIRST_NAME, m.LAST_NAME, m.pagerank from HR_SIMPLIFIED match (m:EMPLOYEE) 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 HR_SIMPLIFIED match (m:DEPARTMENT) order by m.pagerank ").print().close();


+----------------------------------------------+
| m.DEPARTMENT_NAME | m.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_GRAPHGRAPH_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)に接続するには、サーバー証明書を作成する必要があります。詳細は、トランスポート層セキュリティの設定を参照してください。