4.4 同じSCNでのエンティティ・プロバイダの読取り

複数の頂点表またはエッジ表、あるいはその両方で構成されるグラフがある場合は、同じシステム変更番号(SCN)の頂点とエッジをすべて読み取ることができます。これは、一部のエッジが欠落した頂点を参照している可能性があるため、頂点が読み取られたSCNよりも後のSCNでエッジ・プロバイダが読み取られるなどの問題を克服するのに役立ちます。

Oracle Databaseでフラッシュバックが有効になっていない場合でも、データベースからグラフを読み取ることができることに注意してください。複数のデータベースの場合、SCNを使用して、同じデータベースに属するエンティティ・プロバイダのみの一貫性を維持できます。

グラフ構成でas_ofフラグを使用して、エンティティ・プロバイダを読み取るSCNを指定できます。as_ofフラグの有効な値は次のとおりです。

表4-5 グラフ構成の"as_of"キーの有効な値

説明
正のlong これは解析可能なSCN値です。
"<current-scn>" 現在のSCNは、グラフ・ロードの開始時に決定されます。
"<no-scn>" これは、グラフのロード時にSCNを無効化するためのものです。
null これにより、"<current-scn>"の動作がデフォルトになります。

グラフ構成ファイルの頂点プロバイダまたはエッジ・プロバイダに対して"as_of"を省略すると、"as_of": nullと同じ動作になります。

例4-4 同じデータベース内の頂点プロバイダおよびエッジ・プロバイダに"as_of"を使用したグラフ構成

次の設定例では、3つの頂点プロバイダと1つのエッジ・プロバイダが同じデータベースを指しています。

{
  "name": "employee_graph",
  "vertex_providers": [
    {
      "name": "Department",
      "as_of": "<current-scn>",
      "format": "rdbms",
      "database_table_name": "DEPARTMENTS",
      "key_column": "DEPARTMENT_ID",
      "props": [
        {
          "name": "DEPARTMENT_NAME",
          "type": "string"
        }
      ]
    },
    {
      "name": "Location",
      "as_of": "28924323",
      "format": "rdbms",
      "database_table_name": "LOCATIONS",
      "key_column": "LOCATION_ID",
      "props": [
        {
          "name": "CITY",
          "type": "string"
        }
      ]
    },
    {
      "name": "Region",
      "as_of": "<no-scn>",
      "format": "rdbms",
      "database_table_name": "REGIONS",
      "key_column": "REGION_ID",
      "props": [
        {
          "name": "REGION_NAME",
          "type": "string"
        }
      ]
    }
  ],
  "edge_providers": [
    {
      "name": "LocatedAt",
      "format": "rdbms",
      "database_table_name": "DEPARTMENTS",
      "key_column": "DEPARTMENT_ID",
      "source_column": "DEPARTMENT_ID",
      "destination_column": "LOCATION_ID",
      "source_vertex_provider": "Department",
      "destination_vertex_provider": "Location"
    }
  ]
}

前述の構成ファイルを使用してemployee_graphを読み取る場合、グラフはDepartmentおよびLocatedAtエンティティ・プロバイダの同じSCNで読み取られます。これを次の表に示します。

表4-6 "as_of"を使用したシナリオの例

エンティティ・プロバイダ "as_of" SCN値
Department "<current-scn>" SCNが自動的に決定される
Location "28924323" "28924323"をSCNとして使用
Region "<no-scn>" SCNの使用なし
LocatedAt "as_of"フラグが省略 SCNが自動的に決定される

データベースの現在のSCN値は、次のいずれかのオプションを使用して決定されます。

  • V$DATABASEビューの問合せ:
    SELECT CURRENT_SCN FROM V$DATABASE;
  • DBMS_FLASHBACKパッケージの使用:
    SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL;

前述の操作のいずれかを実行するために必要な権限がない場合は、次を使用できます。

SELECT TIMESTAMP_TO_SCN(SYSDATE) FROM DUAL;

ただし、このオプションは前述の2つのオプションよりも正確ではありません。

次のようにJSON構成ファイルを使用して、グラフをグラフ・サーバーに読み取ることができます。

opg4j> var g = session.readGraphWithProperties("employee_graph.json")
PgxGraph g = session.readGraphWithProperties("employee_graph.json");
g = session.read_graph_with_properties("employee_graph.json")