12.2 Autonomous Databaseグラフ・クライアントの使用

AdbGraphClient APIを使用して、Oracle Graph Clientを使用するかJavaまたはPythonアプリケーションを介して、Autonomous DatabaseのGraph Studio機能にプログラムでアクセスできます。

このAPIには、次の機能があります。

  • Autonomous Databaseで認証する
  • Graph Studio環境を管理する
  • グラフ・サーバー(PGX)に対してグラフ問合せおよびアルゴリズムを実行する
  • Oracle Databaseに対してグラフ問合せを直接実行する

AdbGraphClient APIを使用するには、Oracle Graph Clientインストールへのアクセス権が必要です。APIは、Oracle Graph Server and Clientディストリビューションの一部であるOracle Graph Clientライブラリによって提供されます。JavaまたはPython用のグラフ・クライアント・シェルCLIのインストール方法および開始方法の詳細は、Oracle Graph Clientのインストールを参照してください。

また、Autonomous Databaseグラフ・クライアントを使用する前に、「Autonomous Databaseグラフ・クライアントを使用するための前提条件」で説明されている前提条件をすべて満たしていることを確認してください。
次の例は、AdbGraphClient APIを使用してGraph Studioへの接続を確立し、割り当てられたメモリーで環境を起動し、PGQLプロパティ・グラフをメモリーにロードし、PGQL問合せを実行し、グラフに対してアルゴリズムを実行する方法を示しています。

ノート:

AdbGraphClient APIの詳細は、JavadocおよびPython APIリファレンスを参照してください。
  1. 次のいずれかの方法を使用して、対話型グラフ・シェルCLIを起動し、AdbGraphClientを使用してAutonomous Databaseインスタンスに接続します:
    テナンシ詳細を使用したAdbGraphClientの構成
    cd /opt/oracle/graph
    ./bin/opg4j --no_connect
    For an introduction type: /help intro
    Oracle Graph Server Shell 24.1.0
    opg4j> import oracle.pg.rdbms.*
    opg4j> var config = AdbGraphClientConfiguration.builder()
    opg4j> config.database("<DB_name>")
    opg4j> config.tenancyOcid("<tenancy_OCID>")
    opg4j> config.databaseOcid("<database_OCID>")
    opg4j> config.username("ADBDEV")
    opg4j> config.password("<password_for_ADBDEV>")
    opg4j> config.endpoint("https://<hostname-prefix>.adb.<region>.oraclecloudapps.com/")
    opg4j> var client = new AdbGraphClient(config.build())
    client ==> oracle.pg.rdbms.AdbGraphClient@7b8d1537
    import oracle.pg.rdbms.*;
     
    var config = AdbGraphClientConfiguration.builder();
    config.tenancyOcid("<tenancy_OCID>");
    config.databaseOcid("<database_OCID>");
    config.database("<DB_name>");
    config.username("ADBDEV");
    config.password("<password_for_ADBDEV>");
    config.endpoint("https://<hostname-prefix>.adb.<region>.oraclecloudapps.com/");
     
    var client = new AdbGraphClient(config.build());
    cd /opt/oracle/graph 
    ./bin/opg4py --no_connect
    Oracle Graph Server Shell 24.1.0
    >>> from opg4py.adb import AdbClient
    >>> config = {
    ...          'tenancy_ocid': '<tenancy_OCID>',
    ...          'database': '<DB_name>',
    ...          'database_ocid': '<DB_OCID>',
    ...          'username': 'ADBDEV',
    ...          'password': '<password_for_ADBDEV>',
    ...          'endpoint': 'https://<hostname-prefix>.adb.<region>.oraclecloudapps.com/'
    ... }
    >>> client = AdbClient(config)
    JDBC接続を使用したAdbGraphClientの構成

    JDBC接続を使用してAutonomous Databaseインスタンスに接続するようにAdbGraphClientを構成することもできます(次のコードを参照)。Autonomous Databaseに接続するためのJDBC URLの取得方法については、Oracle Autonomous Database Serverlessの使用JDBC Thinドライバを使用した接続を参照してください。

    ただし、Autonomous Databaseインスタンスのv$pdbsビューへのREADアクセス権があることを確認してください。デフォルトでは、ADMINユーザーにはv$pdbsビューへのREADアクセス権があります。他のすべてのユーザー(管理者以外のユーザー)の場合、READアクセス権はADMIN (GRANT SELECT ON v$pdbs TO <user>)によって付与できます。

    import oracle.pg.rdbms.*
    opg4j> var conn = DriverManager.getConnection(<jdbcUrl>, <username>, <password>)
    opg4j> var config = AdbGraphClientConfiguration.fromConnection(conn, <password>)
    opg4j> var client = new AdbGraphClient(config)
    import oracle.pg.rdbms.*;
    AdbGraphClientConfiguration config = AdbGraphClientConfiguration.fromCredentials(<jdbcUrl>, <username>, <password>);
    AdbGraphClient client = new AdbGraphClient(config);
    >>> from opg4py.adb import AdbClient
    >>> client = AdbClient.from_connection(<jdbcUrl>, <username>, <password>)
  2. 次のコードに示すように、望ましいメモリーでPGXサーバー環境を起動します。
    これにより、Graph Studioで環境作成のためのジョブが発行されます。job.get()は、環境が起動されるまで待機します。環境がclient.isAttached()で正常に起動したかどうかは常に確認できます。環境が稼働中の場合、メソッドはブールtrueを戻します。

    ただし、client.isAttached()がコードの最初のステップでtrueを戻した場合は、環境の作成ステップをスキップできます。

    opg4j> client.isAttached()
    $9 ==> false
    opg4j> var job=client.startEnvironment(10)
    job ==> oracle.pg.rdbms.Job@117e9a56[Not completed]
    opg4j> job.get()
    $11 ==> null
    opg4j> job.getName()
    $11 ==> "Environment Creation - 16 GBs"
    opg4j> job.getType()
    $12 ==> ENVIRONMENT_CREATION
    opg4j> job.getCreatedBy()
    $13 ==> "ADBDEV"
    opg4j> client.isAttached()
    $11 ==> true
     if (!client.isAttached()) {
             var job = client.startEnvironment(10);
             job.get();
             System.out.println("job details: name=" + job.getName() + "type= " + job.getType() +"created_by= " + job.getCreatedBy());
          }
    job details: name=Environment Creation - 16 GBstype= ENVIRONMENT_CREATIONcreated_by= ADBDEV
    >>> client.is_attached()
    False
    >>> job = client.start_environment(10)
    >>> job.get()
    >>> job.get_name()
    'Environment Creation - 16 GBs'
    >>> job.get_created_by()
    'ADBDEV'
    >>> client.is_attached()
    True
    
  3. 次のように、インスタンスおよびセッション・オブジェクトを作成します。
    opg4j> var instance = client.getPgxInstance()
    instance ==> ServerInstance[embedded=false,baseUrl=https://<hostname-prefix>.adb.<region>.oraclecloudapps.com/graph/pgx]
    opg4j> var session = instance.createSession("AdbGraphSession")
    session ==> PgxSession[ID=c403be26-ad0c-45cf-87b7-1da2a48bda54,source=AdbGraphSession]
    ServerInstance instance = client.getPgxInstance();
    PgxSession session = instance.createSession("AdbGraphSession");
    >>> instance = client.get_pgx_instance()
    >>> session = instance.create_session("adb-session")
  4. Autonomous DatabaseインスタンスのPGQLプロパティ・グラフをメモリーにロードします。
    opg4j> var graph = session.readGraphByName("BANK_GRAPH", GraphSource.PG_PGQL)
    graph ==> PgxGraph[name=BANK_GRAPH,N=1000,E=5001,created=1647800790654]
    PgxGraph graph = session.readGraphByName("BANK_GRAPH", GraphSource.PG_PGQL);
    >>> graph = session.read_graph_by_name("BANK_GRAPH", "pg_pgql")
  5. 次のように、アナリストを作成してグラフに対してPagerankアルゴリズムを実行します。
    opg4j> session.createAnalyst().pagerank(graph)
    $16 ==> VertexProperty[name=pagerank,type=double,graph=BANK_GRAPH]
    session.createAnalyst().pagerank(graph);
    >>> session.create_analyst().pagerank(graph)
    VertexProperty(name: pagerank, type: double, graph: BANK_GRAPH)
  6. 次のように、グラフに対してPGQL問合せを実行して結果セットを出力します。
    opg4j> graph.queryPgql("SELECT a.acct_id AS source, a.pagerank, t.amount, b.acct_id AS destination FROM MATCH (a)-[t]->(b) ORDER BY a.pagerank DESC LIMIT 3").print()
    PgqlResultSet rs = graph.queryPgql("SELECT a.acct_id AS source, a.pagerank, t.amount, b.acct_id AS destination FROM MATCH (a)-[t]->(b) ORDER BY a.pagerank DESC LIMIT 3");
    rs.print();
    >>> rs = graph.query_pgql("SELECT a.acct_id AS source, a.pagerank, t.amount, b.acct_id AS destination FROM MATCH (a)-[t]->(b) ORDER BY a.pagerank DESC LIMIT 3").print()
    実行すると、問合せによって次の出力が生成されます。
    +------------------------------------------------------+
    | source | pagerank             | amount | destination |
    +------------------------------------------------------+
    | 387    | 0.007302836252205922 | 1000.0 | 188         |
    | 387    | 0.007302836252205922 | 1000.0 | 374         |
    | 387    | 0.007302836252205922 | 1000.0 | 577         |
    +------------------------------------------------------+
    
  7. 必要に応じて、次のコードに示すように、データベース内のグラフに対してPGQL問合せを直接実行できます。
    データベースへのJDBC接続を確立するために、ウォレットをダウンロードして安全な場所に保存する必要があります。JDBC URL接続文字列の確認方法は、ウォレットを使用したJDBC Thin接続を参照してください。
    opg4j> String jdbcUrl="jdbc:oracle:thin:@<tns_alias>?TNS_ADMIN=<path_to_wallet>"
    opg4j> var conn = DriverManager.getConnection(jdbcUrl,"ADBDEV","<password_for_ADBDEV>")
    conn ==> oracle.jdbc.driver.T4CConnection@36ee8c7b
    opg4j> var pgqlConn = PgqlConnection.getConnection(conn)
    pgqlConn ==> oracle.pg.rdbms.pgql.PgqlConnection@5f27d271
    opg4j> var pgqlStmt = pgqlConn.createStatement()
    pgqlStmt ==> oracle.pg.rdbms.pgql.PgqlExecution@4349f52c
    opg4j> pgqlStmt.executeQuery("SELECT a.acct_id AS source, t.amount, b.acct_id AS destination FROM MATCH (a)-[t]->(b) ON BANK_GRAPH LIMIT 3").print()
    import oracle.pg.rdbms.pgql.PgqlConnection;
    import oracle.pg.rdbms.pgql.PgqlStatement;
    import oracle.pg.rdbms.pgql.PgqlResultSet;
    import oracle.pgx.api.*;
    import oracle.pg.rdbms.GraphServer;
    import oracle.pg.rdbms.pgql.jdbc.PgqlJdbcRdbmsDriver;
    ….
    DriverManager.registerDriver(new PgqlJdbcRdbmsDriver());
    String jdbcUrl="jdbc:oracle:thin:@<tns_alias>?TNS_ADMIN=<path_to_wallet>";
    Connection conn = DriverManager.getConnection(jdbcUrl,"ADBDEV","<password_for_ADBDEV>");
    PgqlConnection pgqlConn = PgqlConnection.getConnection(conn);
    PgqlStatement pgqlStmt = pgqlConn.createStatement();
    PgqlResultSet rs = pgqlStmt.executeQuery("SELECT a.acct_id AS source, t.amount, b.acct_id AS destination FROM MATCH (a)-[t]->(b) ON BANK_GRAPH LIMIT 3");
    rs.print();
    >>> jdbcUrl = "jdbc:oracle:thin:@<tns_alias>?TNS_ADMIN=<path_to_wallet>"
    >>> pgql_conn = opg4py.pgql.get_connection("ADBDEV","<password_for_ADBDEV>", jdbcUrl)
    >>> pgql_statement = pgql_conn.create_statement()
    >>> pgql_statement.execute_query("SELECT a.acct_id AS source, t.amount, b.acct_id AS destination FROM MATCH (a)-[t]->(b) ON BANK_GRAPH LIMIT 3").print()
    実行すると、問合せによって次の出力が生成されます。
    +-------------------------------+
    | SOURCE | AMOUNT | DESTINATION |
    +-------------------------------+
    | 1000   | 1000   | 921         |
    | 1000   | 1000   | 662         |
    | 1000   | 1000   | 506         |
    +-------------------------------+
    
  8. 次のように、すべてのグラフ問合せを実行した後、セッションを閉じます。
    opg4j> session.close()
    opg4j> session.close();
    >>> session.close()

12.2.1 Autonomous Databaseグラフ・クライアントを使用するための前提条件

AdbGraphClient APIの使用を開始するための前提条件として、次を実行する必要があります。

  • Oracle Autonomous DatabaseでAutonomous Databaseインスタンスをプロビジョニングする。
  • テナンシ詳細を使用してAdbGraphClientを構成する場合は、次の情報を取得します。該当しない場合は、このステップを省略します。
    キー 説明 詳細情報
    tenancy OCID テナンシのOracle Cloud ID (OCID) テナンシのOCIDを確認するには、Oracle Cloud InfrastructureドキュメントのテナンシのOCIDを確認する場所に関する項を参照してください。
    database Autonomous Databaseインスタンスのデータベース名
    1. OCIコンソールを開き、左側のナビゲーション・メニューで「Oracle Database」をクリックします。
    2. 「Autonomous Database」をクリックし、「Autonomous Database」ページにナビゲートします。
    3. 「表示名」列で必要なAutonomous Databaseを選択し、「Autonomous Databaseの詳細」ページにナビゲートします。
    4. 「Autonomous Database情報」タブの「一般情報」下の「データベース名」を書き留めます。
    database OCID Autonomous DatabaseのOracle Cloud ID (OCID)
    1. OCIコンソールを開き、左側のナビゲーション・メニューで「Oracle Database」をクリックします。
    2. 「Autonomous Database」をクリックし、「Autonomous Database」ページにナビゲートします。
    3. 「表示名」列で必要なAutonomous Databaseを選択し、「Autonomous Databaseの詳細」ページにナビゲートします。
    4. 「Autonomous Database情報」タブの「一般情報」下の「データベースOCID」を書き留めます。
    username Graph Studioへのログインに使用される、グラフ対応のAutonomous Databaseユーザー名 詳細は、グラフ・ユーザーの作成を参照してください。
    password グラフ・ユーザーのデータベース・パスワード グラフ・ユーザーのパスワードを忘れた場合は、ADMINユーザーとして「データベース・アクション」にログインすることで、グラフ・ユーザーのパスワードをいつでもリセットできます。詳細は、ユーザーの編集を参照してください。
    endpoint Graph StudioのエンドポイントURL
    1. Autonomous Databaseインスタンスを選択し、「Autonomous Databaseの詳細」ページにナビゲートします。
    2. 「ツール」タブをクリックします。
    3. 「Graph Studio」をクリックします。
    4. 「Graph Studio」ログイン画面を開く新しいタブのURLをコピーします。
    5. URLを編集して、oraclecloudapps.comの後の部分を削除し、エンドポイントURLを取得します。

      たとえば、エンドポイントURLのサンプル形式を次に示します。

      https://<hostname_prefix>.adb.<region_identifier>.oraclecloudapps.com
  • Graph Studioにアクセスし、PGQLプロパティ・グラフを作成します。
  • Oracle Graph JavaまたはPythonクライアントをダウンロードしてインストールし、起動する。

12.2.2 AdbGraphClient APIでのPGX JDBCドライバの使用

Graph Server and Clientリリース24.1.0以降では、PGX JDBCドライバをAdbGraphClient APIとともに使用して、Autonomous DatabaseのGraph Studioのグラフ・サーバーのメモリーに格納されているグラフを問い合せることができます。

PGX JDBCドライバを使用してAutonomous Databaseインスタンスに接続するには、次の点に注意してください:

  • PGX JDBCドライバをDriverManagerに登録します:
    import java.sql.DriverManager;
    import oracle.pgx.jdbc.PgxJdbcDriver;
    ...
    DriverManager.registerDriver(new PgxJdbcDriver());
  • PGX JDBCドライバを使用して接続を確立するには、次の2つの方法のいずれかを使用します:
    • プロパティの使用
      properties = new Properties();
      properties.put("tenancy_ocid", "<tenancy_OCID>");
      properties.put("database_ocid", "<database_OCID>");
      properties.put("database", "<database_name>");
      properties.put("username", "<username>");
      properties.put("password", "<password>");
      Connection connection = DriverManager.getConnection("jdbc:oracle:pgx:https://<hostname-prefix>.adb.<region>.oraclecloudapps.com", properties);
    • ウォレットの使用
      Connection connection = DriverManager.getConnection("jdbc:oracle:pgx:@<db_TNS_name>?TNS_ADMIN=<path_to_wallet>", "<ADB_username>", "<ADB_password>")

    前述のコード・サンプルのJDBC URLでは、接頭辞としてJDBC:oracle:pgx:を使用します。

例12-1 PGX JDBCドライバを使用したAutonomous Databaseでのグラフ問合せの実行

次の例では、PGX JDBCドライバを使用してAutonomous Databaseインスタンスへの接続を確立し、Graph Studioでコンピュート環境を開始し、グラフをグラフ・サーバー(PGX)にロードし、文を作成し、グラフでPGQL問合せを実行します。

import java.sql.*;
import oracle.pgx.jdbc.*;
import oracle.pg.rdbms.*;
import oracle.pgx.api.*;

public class AdbPgxJdbc {

  public static void main(String[] args) throws Exception {

    DriverManager.registerDriver(new PgxJdbcDriver());


    try (Connection conn = DriverManager.getConnection("jdbc:oracle:pgx:@<db_TNS_name>?TNS_ADMIN=<path_to_wallet>","ADB_username","<ADB_password>")) {
      AdbGraphClient client = conn.unwrap(AdbGraphClient.class);
      if (!client.isAttached()) {
        var job = client.startEnvironment(10);
         job.get();
         System.out.println("job details: name=" + job.getName() + "type= " + job.getType() +"created_by= " + job.getCreatedBy());
        }
      PgxSession session = conn.unwrap(PgxSession.class);
      PgxGraph graph = session.readGraphByName("BANK_PGQL_GRAPH", GraphSource.PG_PGQL);
      Statement stmt = conn.createStatement();
      ResultSet rs = stmt.executeQuery("SELECT * "+
                                         "FROM GRAPH_TABLE ( BANK_PGQL_GRAPH "+
                                         "MATCH (a IS ACCOUNTS) -[e IS TRANSFERS]-> (b IS ACCOUNTS) "+
                                         "WHERE a.ID = 179 AND b.ID = 688 "+
                                         "COLUMNS (e.AMOUNT AS AMOUNT ))");
      while(rs.next()){
        System.out.println("AMOUNT = " + rs.getLong("AMOUNT"));
      }

    }
  }
}

前述のコードの結果の出力は次のようになります:

AMOUNT = 7562