18.8 UPDATE問合せを実行するためのJava API

UPDATE問合せは、INSERTUPDATEおよびDELETE操作を使用して既存のグラフを変更します。

INSERTを使用するとグラフに新しい頂点およびエッジを挿入でき、UPDATEを使用するとプロパティを新しい値に設定して既存の頂点およびエッジを更新でき、DELETEを使用するとグラフから頂点およびエッジを削除できます。

18.8.1 PGQLによるグラフの更新可能性

Oracle RDBMSまたはCSVファイルからPGXにロードされたグラフ・データは、PGQLを介してすぐに更新することはできません。

最初に、PgxGraph.clone()メソッドを使用してデータのコピーを作成する必要があります。結果のグラフは完全に更新可能です。

次のケースについて検討します。

// load a graph from the RDBMS or from CSV
PgxGraph g1 = session.readGraphByName("<graph>",GraphSource.PG_PGQL);

// create an updatable copy of the graph
PgxGraph g2 = g1.clone("new_graph_name");

// insert an additional vertex into the graph
g2.executePgql("INSERT VERTEX v " +
               "         LABELS ( Person ) " +
               "         PROPERTIES ( v.firstName = 'Camille', " +
               "                      v.lastName = ' Mullins')"); 

さらに、前述の例の最後の2つのステップを組み合せて単一のステップにするPgxGraph.cloneAndExecutePgql(String query, String graphName)メソッドもあります。

// create an updatable copy of the graph while inserting a new vertex
PgxGraph g2_copy = g1.cloneAndExecutePgql(
                     "INSERT VERTEX v " +
                     "         LABELS ( Person ) " +
                     "         PROPERTIES ( v.firstName = 'Camille', " +
                     "                      v.lastName = ' Mullins') "
                   , "new_graph_name");

PgxGraph.clone()を介して作成されるグラフは、セッションに対してローカルであることに注意してください。ただし、PgxGraph.publish(..)メソッドを介して他のセッションと共有することはできますが、PGQLを使用して更新することはできなくなりました。セッションローカル・グラフのみが更新可能ですが、永続グラフは更新できません。

18.8.2 グラフ・サーバー(PGX)のグラフに対するUPDATE問合せの実行

グラフに対してUPDATE問合せを実行するには、PgxGraph.executePgql(String query)メソッドを使用します。

次に、INSERT問合せの例を示します。

g.executePgql("INSERT VERTEX v " +
              "         LABELS ( Person ) " +
              "         PROPERTIES ( v.firstName = 'Camille', " +
              "                      v.lastName = ' Mullins' ) "); 

INSERTINTO句は省略できることに注意してください。INTO句を使用する場合、INTO句のグラフ名は、問合せが実行されるPGXグラフ(PgxGraph.getName())の名前に対応している必要があります。

次に、UPDATE問合せの例を示します。

// set the date of birth of Camille to 2014-11-15
g.executePgql("UPDATE v SET ( v.dob = DATE '2014-11-14' ) " +
              "FROM MATCH (v:Person) " +
              "WHERE v.firstName = 'Camille' AND v.lastName = ' Mullins' "); 

次に、DELETE問合せの例を示します。

// delete Camille from the graph
g.executePgql("DELETE v " +
              "FROM MATCH (v:Person) " +
              "WHERE v.firstName = 'Camille' AND v.lastName = 'Mullins' "); 

18.8.3 PGXセッションに対するUPDATE問合せの実行

PgxSessionに対してUPDATE問合せを実行することもできます。

次の例では、グラフをクローニングし、PgxSessionに対してUPDATE問合せを実行します。
//Loads the graph into the graph server (PGX)
PgxGraph g1 = session.readGraphByName("BANK_GRAPH_VIEW",GraphSource.PG_PGQL);
//Clones the graph
PgxGraph g2 = g1.clone("BANK_GRAPH_NEW");
//Get the graph
session.getGraph("BANK_GRAPH_NEW");
//Insert vertices and an edge connecting the vertices into the graph
session.executePgql(
     "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) "
);
//Query the graph to verify the newly added edge
session.executePgql(
     "SELECT e.amount FROM MATCH (v1:Accounts) -[e:Transfers]-> (v2:Accounts) "+
     "ON BANK_GRAPH_NEW "+
     "WHERE v1.id=1001 AND v2.id=1002"
);

18.8.4 グラフの基礎となるスキーマの変更

INSERT操作では、既知のラベルとプロパティを持つ頂点とエッジのみを挿入できます。同様に、UPDATE操作では、既知のプロパティの値のみを設定できます。したがって、新しいデータは常にグラフの既存のスキーマに準拠する必要があります。

ただし、グラフのスキーマを更新するためのPGX APIはいくつか存在します。新しいラベルを追加するためのAPIは存在しませんが、PgxGraph.createVertexProperty(PropertyType type, String name)およびPgxGraph.createEdgeProperty(PropertyType type, String name)メソッドを介して新しいプロパティを追加できます。新しいプロパティは、ラベルに関係なく、グラフ内の各頂点/エッジにアタッチされます。最初はプロパティにデフォルト値が割り当てられますが、その後UPDATE文を介して値を更新できます。

次のケースについて検討します。

// load a graph from the RDBMS or from CSV
PgxGraph g = session.readGraphByName("<graph>",GraphSource.PG_PGQL);

// add a new property to the graph
g.createVertexProperty(PropertyType.LOCAL_DATE, "dob");

// set the date of birth of Camille to 2014-11-15
g.executePgql("UPDATE v SET ( v.dob = DATE '2014-11-14' ) " +
              "FROM MATCH (v:Person) " +
              "WHERE v.firstName = 'Camille' AND v.lastName = ' Mullins' ");