18.9 UPDATE問合せを実行するためのPython API

Python APIを使用して、グラフ・サーバー(PGX)にロードされるグラフを更新できます。

ただし、グラフを更新する前に、まずグラフをクローニングする必要があります。更新操作は、元のグラフではなく、クローニングされたグラフでのみ実行できます。
次の例は、Python APIを使用してグラフ・サーバー(PGX)のグラフに対してUPDATE問合せを実行するステップを示しています。
  1. グラフ・サーバー(PGX)にPGQLプロパティ・グラフをロードします。
    >>> g1 = session.read_graph_by_name('BANK_GRAPH', 'pg_pgql')
  2. 更新操作のグラフをクローニングします。
    >>> g2 = g1.clone(name="BANK_GRAPH_NEW")
  3. 必要に応じてクローニングされたグラフを更新します。
    たとえば:
    • プロパティを使用した1つ以上の頂点の追加
      >>> g2.execute_pgql(
      ...   "INSERT VERTEX v1 LABELS (Accounts) PROPERTIES (v1.id=1001, v1.name='New account-1') "
      ...   "     , VERTEX v2 LABELS (Accounts) PROPERTIES (v2.id=1002, v2.name='New account-2') "
      ... )
    • プロパティを含む新しいエッジの挿入

      WHERE句と一致するすべての頂点間に新しいエッジが追加されます。

      >>> g2.execute_pgql(
      ...   "INSERT EDGE e1 BETWEEN v1 AND v2 "
      ...   "LABELS (Transfers) "
      ...   "PROPERTIES (e1.from_acct_id=1001, e1.amount=3000, e1.description='Transaction-A', e1.to_acct_id=1002) "
      ...   "FROM MATCH (v1:Accounts), MATCH (v2:Accounts) "
      ...   "WHERE v1.id=1001 AND v2.id=1002"
      ...   )
      

      オプションで、グラフを問い合せて、新しいエッジが追加されていることを確認します。

      >>> g2.execute_pgql(
      ...   "SELECT e.* FROM MATCH (v1:Accounts) -[e:Transfers]-> (v2:Accounts) "
      ...   "WHERE v1.id=1001 AND v2.id=1002"
      ... ).print()
      +----------------------------------------------------+
      | FROM_ACCT_ID | TO_ACCT_ID | DESCRIPTION   | AMOUNT |
      +----------------------------------------------------+
      | 1001         | 1002       | Transaction-A | 3000.0 |
      +----------------------------------------------------+
    • 1つ以上の頂点プロパティの更新

      頂点プロパティは、WHERE句と一致するすべての頂点について更新されます。

      >>> g2.execute_pgql(
      ...   "UPDATE v SET (v.name='Account-1001') "
      ...   "FROM MATCH (v:Accounts) "
      ...   "WHERE v.id=1001"
      ... )
    • 1つ以上のエッジ・プロパティの更新

      WHERE句の頂点を接続するエッジのエッジ・プロパティが更新されます。

      >>> g2.execute_pgql(
      ...   "UPDATE e SET (e.amount=5000) "
      ...   "FROM MATCH (v1:Accounts) -[e:Transfers]-> (v2:Accounts) "
      ...   "WHERE v1.id=1001 AND v2.id=1002"
      ... )

      オプションで、グラフを問い合せて、更新されたエッジ・プロパティを確認します。

      >>> g2.execute_pgql(
      ...   "SELECT e.amount FROM MATCH (v1:Accounts) -[e:Transfers]-> (v2:Accounts) "
      ...   "WHERE v1.id=1001 AND v2.id=1002"
      ... ).print()
      +--------+
      | amount |
      +--------+
      | 5000.0 |
      +--------+
    • 頂点の削除

      頂点を削除すると、頂点を接続するエッジもすべて削除されます。

      >>> g2.execute_pgql("DELETE v FROM MATCH (v:Accounts) WHERE v.id=1001")
    または、次のようにclone_and_execute_pgql()メソッドを使用して、ステップ2とステップ3を組み合せることができます:
    >>> g2 = g1.clone_and_execute_pgql(
    ...   "INSERT VERTEX v1 LABELS (Accounts) PROPERTIES (v1.id=1001, v1.name='New account-1') "
    ...   ",  VERTEX v2 LABELS (Accounts) PROPERTIES (v2.id=1002, v2.name='New account-2') "
    ...   ",  EDGE e1 BETWEEN v1 AND v2 LABELS (Transfers) PROPERTIES (e1.amount=3000) "
    ... )

    オプションで、グラフを問い合せて、新しく追加されたエッジを確認します。

    >>> g2.execute_pgql(
    ...   "SELECT e.amount FROM MATCH (v1:Accounts) -[e:Transfers]-> (v2:Accounts) "
    ...   "WHERE v1.id=1001 AND v2.id=1002"
    ... ).print()
    +--------+
    | amount |
    +--------+
    | 3000.0 |
    +--------+

PgxSessionに対するUPDATE問合せの実行

次のように、PgxSessionに対してUPDATE問合せを実行することもできます:

>>> g1 = session.read_graph_by_name('BANK_GRAPH', 'pg_pgql')
>>> g2 = g1.clone(name="BANK_GRAPH_NEW")
>>> session.execute_pgql(
...   "INSERT INTO BANK_GRAPH_NEW VERTEX v1 LABELS (Accounts) PROPERTIES (v1.id=1001, v1.name='New account-1') "
...   ",  VERTEX v2 LABELS (Accounts) PROPERTIES (v2.id=1002, v2.name='New account-2') "
...   ",  EDGE e1 BETWEEN v1 AND v2 LABELS (Transfers) PROPERTIES (e1.amount=3000) "
... )
>>> session.execute_pgql(
...   "SELECT e.amount FROM MATCH (v1:Accounts) -[e:Transfers]-> (v2:Accounts) ON BANK_GRAPH_NEW "
...   "WHERE v1.id=1001 AND v2.id=1002"
... ).print()
+--------+
| amount |
+--------+
| 3000.0 |
+--------+