15.2 グラフ・サーバー(PGX)への接続
このセクションでは、リモート・モードで実行されているか、WebアプリケーションとしてApache TomcatまたはOracle WebLogic Serverにデプロイされているグラフ・サーバー(PGX)に接続する方法について説明します。
グラフ・サーバーに接続するための前提条件として、グラフ・サーバー(PGX)を起動および実行する必要があります。グラフ・サーバーを起動するコマンドの詳細は、コマンドラインを使用したグラフ・サーバー(PGX)の起動と停止を参照してください。
ノート:
グラフ・サーバー(PGX)をライブラリとして使用している場合は、ライブラリとしてのグラフ・サーバー(PGX)の使用を参照してください。15.2.1 グラフ・クライアントCLIによる接続
リモート・グラフ・サーバー(PGX)インスタンスに接続する最も簡単な方法は、次のように、サーバーのベースURLをグラフ・サーバー(PGX)認証に必要なデータベース・ユーザー名とともに指定することです。
cd /opt/oracle/graph
./bin/opg4j --base_url https://<host>:<port> --username <graphuser>
cd /opt/oracle/graph
./bin/opg4py --base_url https://<host>:<port> --username <graphuser>
<host>
: サーバー・ホスト名<port>
: サーバー・ポート<graphuser>
: データベース・ユーザーデータベース・パスワードの入力を要求されます。
関連項目:
- Java APIの詳細は、Java APIリファレンスを参照してください
- Python APIの詳細は、Python APIリファレンスを参照してください
HTTPリクエストのロギングについて
oracle.pgx
のログ・レベルをDEBUG
に設定します。
ノート:
これらのログを有効にすると、パスワードなどの機密情報が画面に出力されます。opg4j> loglevel("oracle.pgx","DEBUG")
===> Log level of oracle.pgx logger set to DEBUG
opg4j> var g = session.readGraphByName("BANK_GRAPH_VIEW", GraphSource.PG_PGQL)
09:19:51,859+0000 DEBUG o.p.c.RemoteUtils - create session cookie (session ID = 82f5cc30-358a-4002-a0bc-80a4ad690a94)
09:19:51,862+0000 DEBUG o.p.c.RemoteUtils - no value for the sticky cookie given
09:19:51,862+0000 DEBUG o.p.c.RemoteUtils - create csrf token cookie (token = d43a5de8-c81c-4361-ae15-81a1867cb2d6)
09:19:51,881+0000 DEBUG o.p.c.HttpRequestExecutor - Requesting POST https://localhost:7007/core/v2/describe
09:19:51,902+0000 DEBUG o.p.c.HttpRequestExecutor - received HTTP status 202
09:19:51,904+0000 DEBUG o.p.c.HttpRequestExecutor - {"futureId":"457025d4-3945-400a-95ed-a1897e6df9ac"}
09:19:51,911+0000 DEBUG o.p.c.PgxRemoteFuture - Requesting GET https://localhost:7007/core/v1/futures/x-future-id/status
09:19:52,322+0000 DEBUG o.p.c.PgxRemoteFuture - Requesting GET https://localhost:7007/core/v1/futures/x-future-id/value
09:19:52,337+0000 DEBUG o.p.c.RemoteUtils - received HTTP status 201
09:19:52,337+0000 DEBUG o.p.c.RemoteUtils - {"source_name":"BANK_GRAPH_VIEW","optimized_for":"UPDATES","attributes":{},"vertex_id_type":"string","edge_id_strategy":"PARTITIONED_IDS","vertex_id_strategy":"PARTITIONED_IDS","error_handling":{"on_missing_vertex":"ERROR"},"source_type":"PG_PGQL","vertex_providers":[{"error_handling":{},"format":"rdbms","key_column":"ID","props":[{"column":"ID","type":"long","name":"ID","dimension":0},{"column":"NAME","type":"string","name":"NAME","dimension":0}],"name":"ACCOUNTS","parallel_hint_degree":-1,"loading":{"create_key_mapping":true},"database_table_name":"BANK_ACCOUNTS","schema":"GRAPHUSER","key_type":"long","label":"ACCOUNTS","attributes":{}}],"edge_id_type":"string","loading":{"snapshots_source":"CHANGE_SET"},"name":"BANK_GRAPH_VIEW","edge_providers":[{"error_handling":{},"format":"rdbms","source_column":"FROM_ACCT_ID","destination_vertex_provider":"ACCOUNTS","props":[{"column":"FROM_ACCT_ID","type":"long","name":"FROM_ACCT_ID","dimension":0},{"column":"TO_ACCT_ID","type":"long","name":"TO_ACCT_ID","dimension":0},{"column":"AMOUNT","type":"long","name":"AMOUNT","dimension":0},{"column":"DESCRIPTION","type":"string","name":"DESCRIPTION","dimension":0}],"name":"TRANSFERS","parallel_hint_degree":-1,"source_vertex_provider":"ACCOUNTS","loading":{"create_key_mapping":false},"database_table_name":"BANK_TXNS","schema":"GRAPHUSER","destination_column":"TO_ACCT_ID","key_type":"long","label":"TRANSFERS","attributes":{}}]}
09:19:52,545+0000 DEBUG o.p.c.RemoteUtils - create session cookie (session ID = 82f5cc30-358a-4002-a0bc-80a4ad690a94)
09:19:52,547+0000 DEBUG o.p.c.RemoteUtils - no value for the sticky cookie given
09:19:52,547+0000 DEBUG o.p.c.RemoteUtils - create csrf token cookie (token = d43a5de8-c81c-4361-ae15-81a1867cb2d6)
09:19:52,673+0000 DEBUG o.p.c.HttpRequestExecutor - Requesting POST https://localhost:7007/core/v1/loadGraph
09:19:52,692+0000 DEBUG o.p.c.HttpRequestExecutor - received HTTP status 202
09:19:52,695+0000 DEBUG o.p.c.HttpRequestExecutor - {"futureId":"854bd093-8b80-437b-82ff-97f691436131"}
09:19:52,695+0000 DEBUG o.p.c.PgxRemoteFuture - Requesting GET https://localhost:7007/core/v1/futures/x-future-id/status
09:19:53,313+0000 DEBUG o.p.c.PgxRemoteFuture - Requesting GET https://localhost:7007/core/v1/futures/x-future-id/value
09:19:53,331+0000 DEBUG o.p.c.RemoteUtils - received HTTP status 201
09:19:53,332+0000 DEBUG o.p.c.RemoteUtils - {"id":"803F9E73-87BD-461E-A11A-A54853E8A4A0","links":[{"href":"core/v1/graphs/x-graph-id","rel":"self","method":"GET","interaction":["async-polling"]},{"href":"core/v1/graphs/x-graph-id","rel":"canonical","method":"GET","interaction":["async-polling"]}],"graphName":"BANK_GRAPH_VIEW","vertexTables":{"ACCOUNTS":{"name":"ACCOUNTS","metaData":{"name":"ACCOUNTS","idType":"long","labels":["ACCOUNTS"],"properties":[{"name":"ID","id":null,"propertyType":"long","dimension":0,"transient":true,"links":null,"propertyId":"6997E486-C525-4C5B-8A1B-8044386CF379"},{"name":"NAME","id":null,"propertyType":"string","dimension":0,"transient":true,"links":null,"propertyId":"F5473583-61AE-4EB8-B397-EF2E4E93DD8F"}],"edgeProviderNamesWhereSource":["TRANSFERS"],"edgeProviderNamesWhereDestination":["TRANSFERS"],"id":null,"links":null},"providerLabels":["ACCOUNTS"],"keyPropertyName":"ID","entityKeyType":"long","isIdentityKeyMapping":false,"vertexProperties":{"05E515A7-CCF7-4A21-BC31-D4444D3B1CF0":{"id":"05E515A7-CCF7-4A21-BC31-D4444D3B1CF0","links":[{"href":"core/v1/graphs/x-graph-id/properties/x-property-name","rel":"self","method":"GET","interaction":["async-polling"]},{"href":"core/v1/graphs/x-graph-id/properties/x-property-name","rel":"canonical","method":"GET","interaction":["async-polling"]}],"dimension":0,"propertyId":"05E515A7-CCF7-4A21-BC31-D4444D3B1CF0","name":"ID","entityType":"vertex","type":"long","namespace":"2C17C639-3771-3E30-88AE-34D6B380C5EC","transient":false},"0DCCD46B-ED5A-4511-865E-65CDCE6C3DFC":{"id":"0DCCD46B-ED5A-4511-865E-65CDCE6C3DFC","links":[{"href":"core/v1/graphs/x-graph-id/properties/x-property-name","rel":"self","method":"GET","interaction":["async-polling"]},{"href":"core/v1/graphs/x-graph-id/properties/x-property-name","rel":"canonical","method":"GET","interaction":["async-polling"]}],"dimension":0,"propertyId":"0DCCD46B-ED5A-4511-865E-65CDCE6C3DFC","name":"NAME","entityType":"vertex","type":"string","namespace":"2C17C639-3771-3E30-88AE-34D6B380C5EC","transient":false}},"vertexLabels":{"id":"13FE312F-18C8-4AFF-A154-AEDC3C5E86FC","links":[{"href":"core/v1/graphs/x-graph-id/properties/x-property-name","rel":"self","method":"GET","interaction":["async-polling"]},{"href":"core/v1/graphs/x-graph-id/properties/x-property-name","rel":"canonical","method":"GET","interaction":["async-polling"]}],"dimension":-1,"propertyId":"13FE312F-18C8-4AFF-A154-AEDC3C5E86FC","name":"__vertex_labels__","entityType":"vertex","type":"ro_string_set","namespace":"2C17C639-3771
09:19:53,457+0000 DEBUG o.p.a.PgxSession - ==> change sets as snapshot source. Returning graph loaded by the engine
g ==> PgxGraph[name=BANK_GRAPH_VIEW,N=1000,E=4993,created=1704705593065]
>>>setloglevel("oracle.pgx","DEBUG")
>>> graph = session.read_graph_by_name('BANK_GRAPH_VIEW', 'pg_pgql')
09:26:26,548+0000 DEBUG o.p.c.RemoteUtils - create session cookie (session ID = 279f1676-9229-4c5d-bc71-473e5ce5afb9)
09:26:26,554+0000 DEBUG o.p.c.RemoteUtils - no value for the sticky cookie given
09:26:26,555+0000 DEBUG o.p.c.RemoteUtils - create csrf token cookie (token = 354b9253-84fb-4689-8d29-79da8ec1e3cf)
09:26:26,617+0000 DEBUG o.p.c.HttpRequestExecutor - Requesting POST https://localhost:7007/core/v2/describe
09:26:26,670+0000 DEBUG o.p.c.HttpRequestExecutor - received HTTP status 202
09:26:26,671+0000 DEBUG o.p.c.HttpRequestExecutor - {"futureId":"95a4da84-ff08-4471-97ac-6a571c68a82f"}
09:26:26,675+0000 DEBUG o.p.c.PgxRemoteFuture - Requesting GET https://localhost:7007/core/v1/futures/x-future-id/status
09:26:26,708+0000 DEBUG o.p.c.PgxRemoteFuture - Requesting GET https://localhost:7007/core/v1/futures/x-future-id/value
09:26:26,716+0000 DEBUG o.p.c.RemoteUtils - received HTTP status 201
09:26:26,717+0000 DEBUG o.p.c.RemoteUtils - {"source_name":"BANK_GRAPH_VIEW","optimized_for":"UPDATES","attributes":{},"vertex_id_type":"string","edge_id_strategy":"PARTITIONED_IDS","vertex_id_strategy":"PARTITIONED_IDS","error_handling":{"on_missing_vertex":"ERROR"},"source_type":"PG_PGQL","vertex_providers":[{"error_handling":{},"format":"rdbms","key_column":"ID","props":[{"column":"ID","type":"long","name":"ID","dimension":0},{"column":"NAME","type":"string","name":"NAME","dimension":0}],"name":"ACCOUNTS","parallel_hint_degree":-1,"loading":{"create_key_mapping":true},"database_table_name":"BANK_ACCOUNTS","schema":"GRAPHUSER","key_type":"long","label":"ACCOUNTS","attributes":{}}],"edge_id_type":"string","loading":{"snapshots_source":"CHANGE_SET"},"name":"BANK_GRAPH_VIEW","edge_providers":[{"error_handling":{},"format":"rdbms","source_column":"FROM_ACCT_ID","destination_vertex_provider":"ACCOUNTS","props":[{"column":"FROM_ACCT_ID","type":"long","name":"FROM_ACCT_ID","dimension":0},{"column":"TO_ACCT_ID","type":"long","name":"TO_ACCT_ID","dimension":0},{"column":"AMOUNT","type":"long","name":"AMOUNT","dimension":0},{"column":"DESCRIPTION","type":"string","name":"DESCRIPTION","dimension":0}],"name":"TRANSFERS","parallel_hint_degree":-1,"source_vertex_provider":"ACCOUNTS","loading":{"create_key_mapping":false},"database_table_name":"BANK_TXNS","schema":"GRAPHUSER","destination_column":"TO_ACCT_ID","key_type":"long","label":"TRANSFERS","attributes":{}}]}
09:26:26,862+0000 DEBUG o.p.c.RemoteUtils - create session cookie (session ID = 279f1676-9229-4c5d-bc71-473e5ce5afb9)
09:26:26,862+0000 DEBUG o.p.c.RemoteUtils - no value for the sticky cookie given
09:26:26,862+0000 DEBUG o.p.c.RemoteUtils - create csrf token cookie (token = 354b9253-84fb-4689-8d29-79da8ec1e3cf)
09:26:26,930+0000 DEBUG o.p.c.HttpRequestExecutor - Requesting POST https://localhost:7007/core/v1/loadGraph
09:26:26,963+0000 DEBUG o.p.c.HttpRequestExecutor - received HTTP status 202
09:26:26,964+0000 DEBUG o.p.c.HttpRequestExecutor - {"futureId":"a6ec1f14-891d-470a-a20a-3e0a4a76c11d"}
09:26:26,965+0000 DEBUG o.p.c.PgxRemoteFuture - Requesting GET https://localhost:7007/core/v1/futures/x-future-id/status
09:26:27,183+0000 DEBUG o.p.c.PgxRemoteFuture - Requesting GET https://localhost:7007/core/v1/futures/x-future-id/value
09:26:27,202+0000 DEBUG o.p.c.RemoteUtils - received HTTP status 201
09:26:27,203+0000 DEBUG o.p.c.RemoteUtils - {"id":"CCA6B5D6-46DB-4DFE-AC60-2FDFBD8631AC","links":[{"href":"core/v1/graphs/x-graph-id","rel":"self","method":"GET","interaction":["async-polling"]},{"href":"core/v1/graphs/x-graph-id","rel":"canonical","method":"GET","interaction":["async-polling"]}],"graphName":"BANK_GRAPH_VIEW","vertexTables":{"ACCOUNTS":{"name":"ACCOUNTS","metaData":{"name":"ACCOUNTS","idType":"long","labels":["ACCOUNTS"],"properties":[{"name":"ID","id":null,"propertyType":"long","dimension":0,"transient":true,"links":null,"propertyId":"5A6A679C-BBD8-4CA9-886C-19D7DA3041F5"},{"name":"NAME","id":null,"propertyType":"string","dimension":0,"transient":true,"links":null,"propertyId":"3B479E88-3441-49EA-95EE-FC14EE0FD318"}],"edgeProviderNamesWhereSource":["TRANSFERS"],"edgeProviderNamesWhereDestination":["TRANSFERS"],"id":null,"links":null},"providerLabels":["ACCOUNTS"],"keyPropertyName":"ID","entityKeyType":"long","isIdentityKeyMapping":false,"vertexProperties":{"9B32DB07-AD6A-47AA-AD7E-56FE417D0423":{"id":"9B32DB07-AD6A-47AA-AD7E-56FE417D0423","links":[{"href":"core/v1/graphs/x-graph-id/properties/x-property-name","rel":"self","method":"GET","interaction":["async-polling"]},{"href":"core/v1/graphs/x-graph-id/properties/x-property-name","rel":"canonical","method":"GET","interaction":["async-polling"]}],"dimension":0,"propertyId":"9B32DB07-AD6A-47AA-AD7E-56FE417D0423","name":"ID","entityType":"vertex","type":"long","namespace":"2C17C639-3771-3E30-88AE-34D6B380C5EC","transient":false},"99C98B32-FD2F-46B5-A89A-BBB043E38F7E":{"id":"99C98B32-FD2F-46B5-A89A-BBB043E38F7E","links":[{"href":"core/v1/graphs/x-graph-id/properties/x-property-name","rel":"self","method":"GET","interaction":["async-polling"]},{"href":"core/v1/graphs/x-graph-id/properties/x-property-name","rel":"canonical","method":"GET","interaction":["async-polling"]}],"dimension":0,"propertyId":"99C98B32-FD2F-46B5-A89A-BBB043E38F7E","name":"NAME","entityType":"vertex","type":"string","namespace":"2C17C639-3771-3E30-88AE-34D6B380C5EC","transient":false}},"vertexLabels":{"id":"85CE5DC4-B2B3-4326-B970-F1A6EB5E0345","links":[{"href":"core/v1/graphs/x-graph-id/properties/x-property-name","rel":"self","method":"GET","interaction":["async-polling"]},{"href":"core/v1/graphs/x-graph-id/properties/x-property-name","rel":"canonical","method":"GET","interaction":["async-polling"]}],"dimension":-1,"propertyId":"85CE5DC4-B2B3-4326-B970-F1A6EB5E0345","name":"__vertex_labels__","entityType":"vertex","type":"ro_string_set","namespace":"2C17C639-3771
09:26:27,357+0000 DEBUG o.p.a.PgxSession - ==> change sets as snapshot source. Returning graph loaded by the engine
親トピック: グラフ・サーバー(PGX)への接続
15.2.2 Javaによる接続
リモート・グラフ・サーバー(PGX)インスタンスへの接続を取得するには、単にリモートPGXインスタンスのベースURLをgetInstance()
メソッドに渡します。これにより、アプリケーションは自動的にPGXクライアント・ライブラリを使用してリモートに配置されたグラフ・サーバー(PGX)に接続します。
Javaを使用してグラフ・サーバー(PGX)インスタンスを初期化する場合、ベースURLを指定できます。この例は次のようになります。グラフ・サーバー(PGX)へのURLがgetInMemAnalyst
APIコールに提供されます。
import oracle.pgx.api.*;
import oracle.pg.rdbms.*;
ServerInstance instance = GraphServer.getInstance("https://<hostname>:<port>","<username>","<password>".toCharArray());
PgxSession session = instance.createSession("my-session");
ノート:
Java APIの詳細は、Java APIリファレンスを参照してください。親トピック: グラフ・サーバー(PGX)への接続
15.2.2.1 PGXエンジンの起動と停止
アプリケーションからグラフ・サーバー(PGX)を起動するには、PGX構成の引数としてJSONオブジェクトを使用するinstance.startEngine()
をコールします。
ノート:
- グラフ・サーバー(PGX)インスタンスへの接続および
ServerInstance
オブジェクトの取得の詳細は、Javaによる接続を参照してください。 - グラフ・サーバー(PGX)の様々な構成オプションは、グラフ・サーバー(PGX)エンジンの構成パラメータを参照してください。
PGXエンジンの停止
次のいずれかのAPIを使用して、PGXエンジンを停止できます。
instance.shutdownEngineNow(); // cancels pending tasks, throws exception if engine is not running
instance.shutdownEngineNowIfRunning(); // cancels pending tasks, only tries to shut down if engine is running
if (instance.shutdownEngine(30, TimeUnit.SECONDS) == false) {
// doesn't accept new tasks but finishes up remaining tasks
// pending tasks didn't finish after 30 seconds
}
ノート:
PGXエンジンをシャットダウンすると、Apache Tomcatサーバーは存続しますが、新しいセッションは作成できません。また、現在のすべてのセッションおよびタスクが取り消され、終了します。親トピック: Javaによる接続
15.2.3 Pythonによる接続
Pythonプログラムでリモート・グラフ・サーバー(PGX)インスタンスに接続できます。次の例に示すように、セッションを作成するには、まずリモート・サーバーで認証する必要があります。
import pypgx
import opg4py
import opg4py.graph_server as graph_server
pgql_conn = opg4py.pgql.get_connection("<username>","<password>", "<jdbc_url>")
pgql_statement = pgql_conn.create_statement()
pgql = """
CREATE PROPERTY GRAPH bank_graph
VERTEX TABLES (
bank_accounts
LABEL ACCOUNTS
PROPERTIES (ID, NAME)
)
EDGE TABLES (
bank_txns
SOURCE KEY (from_acct_id) REFERENCES bank_accounts (ID)
DESTINATION KEY (to_acct_id) REFERENCES bank_accounts (ID)
LABEL TRANSFERS
PROPERTIES (FROM_ACCT_ID, TO_ACCT_ID, AMOUNT, DESCRIPTION)
) OPTIONS(PG_PGQL)
"""
pgql_statement.execute(pgql)
instance = graph_server.get_instance("<base_url>", "<username>", "<password>")
session = instance.create_session("my_session")
graph = session.read_graph_by_name('BANK_GRAPH', 'pg_pgql')
analyst = session.create_analyst()
analyst.pagerank(graph)
rs = graph.query_pgql("SELECT id(x), x.pagerank FROM MATCH (x) LIMIT 5")
rs.print()
実行するには、前述のプログラムをprogram.py
という名前のファイルに保存し、次のコマンドを実行します。
python3 program.py
次の出力が表示されます。
+-------------------------------------------+
| id(x) | pagerank |
+-------------------------------------------+
| BANK_ACCOUNTS(2) | 9.749447313256548E-4 |
| BANK_ACCOUNTS(4) | 0.004584001759076056 |
| BANK_ACCOUNTS(6) | 5.358461393401424E-4 |
| BANK_ACCOUNTS(8) | 0.0013051552434930175 |
| BANK_ACCOUNTS(10) | 0.0015040122009364232 |
+-------------------------------------------+
PGQL結果セットからPandasデータフレームへの変換
to_pandas()
メソッドを使用して、PGQL結果セットをpandas.DataFrame
オブジェクトに変換することもできます。これによって、結果セットに対して様々なデータ・フィルタリング操作をより簡単に実行できるようになるとともに、それをラムダ関数で使用することもできます。たとえば、example_query = (
"SELECT n.name AS name, n.age AS age "
"WHERE (n)"
)
result_set = sample_graph.query_pgql(example_query)
result_df = result_set.to_pandas()
result_df['age_bin'] = result_df['age'].apply(lambda x: int(x)/20) # create age bins based on age ranges
ノート:
使用可能なPython APIの完全なセットを確認するには、OPG4PY Python API リファレンスを参照してください。親トピック: グラフ・サーバー(PGX)への接続