1 Spatial and Graphプロパティ・グラフ・サポートの概要

この章では、プロパティ・グラフ機能に対するOracle Spatial and Graphサポートの概要について説明します。

1.1 プロパティ・グラフ・サポートについて

Oracle Spatial and Graphは、Oracle Databaseでの高度な空間およびグラフ分析機能を提供します。

プロパティ・グラフ機能は、グラフ操作、索引付け、問合せ、検索、およびインメモリー分析をサポートします。

1.2 プロパティ・グラフの前提条件

特別な構成操作は必要ありませんが、プロパティ・グラフの機能を使用するために次の要件があります。

  • Oracle Spatial and Graphがインストールされている。

  • max_string_sizeenabledで、

  • AL16UTF16 (UTF8のかわり)がNLS_NCHAR_CHARACTERSETに指定されている。

    AL32UTF8 (UTF8)がデフォルトのキャラクタ・セットであるが、AL16UTF16がNLS_NCHAR_CHARACTERSETである。

  • Java 8以降がインストールされている。

    ただし、JDKは、$ORACLE_HOMEにインストールされるため、個別にインストールする必要はありません。プロパティ・グラフベースのアプリケーションが実行するために、正しいバージョンのJavaが使用されていることを確認するだけです。

  • 「Oracle Databaseのプロパティ・グラフ・スキーマ・オブジェクト」で説明されているように、プロパティ・グラフ・スキーマが使用される場合は、Oracle Partitioningのライセンスが必要です。「2表スキーマを使用したプロパティ・グラフの処理」で説明されているように、2表スキーマが使用される場合、Oracle Partitioningはオプションになりますので注意してください。

  • SolrCloudのテキスト索引が使用されている場合、SolrCloudを別個にダウンロードして手動で構成する必要があります。

    SolrCloudおよびその他の検索エンジンを使用して管理するテキスト索引の詳細は、「プロパティ・グラフ・データのテキスト索引付けの管理」を参照してください。

    Apache Solrのダウンロードおよび使用方法の詳細は、https://lucene.apache.org/solr/guide/を参照してください。

1.3 プロパティ・グラフ機能

グラフは頂点、エッジ、および頂点とエッジのプロパティとしてリンクされたデータのネットワークを管理します。

グラフは一般的に、ソーシャル・ネットワーク、サイバー・セキュリティ、ユーティリティおよび電気通信、ライフサイエンスおよび臨床データ、ナレッジ・ネットワークで検出される関係のモデル化、格納および分析に使用されます。

標準的なグラフ分析には、グラフのトラバース、推奨、コミュニティおよびインフルエンサの検出、パターン一致などがあります。グラフは、電気通信、ライフサイエンスおよびヘルスケア、セキュリティ、メディアおよび出版などの業種に活用できます。

Oracle Special and Graphのプロパティ・グラフ機能は、次の機能でこのようなユースケースをサポートしています。

  • スケーラブルなグラフ・データベース

  • Tinkerpop Blueprintsに基づく開発者ベースのAPI、およびJavaグラフAPI

  • Apache Lucene、SolrCloudおよびOracle Textとの統合によるテキスト検索および問合せ

  • GroovyおよびPythonのスクリプト言語サポート

  • 並列のインメモリー・グラフ分析エンジン

  • ランキング、中心性、レコメンダ、コミュニティ検出、パス検索など、高速でスケーラブルな一連のソーシャル・ネットワーク分析機能

  • Oracle定義のフラット・ファイル形式でのプロパティ・グラフ・データの並列バルク・ロードおよびエクスポート

  • JavaおよびTinkerpop Gremlin APIを実行するためのGroovyベース・コンソールによる管理機能

1.3.1 プロパティ・グラフのサイズ変更の推奨事項

プロパティ・グラフのインストールについての推奨事項を次に示します。

表1-1 プロパティ・グラフのサイズ変更の推奨事項

グラフのサイズ 推奨の専用物理メモリー 推奨のCPUプロセッサ数

10から100Mエッジ

14GB RAMまで

2から4プロセッサ、計算が集中するワークロードの場合は16プロセッサまで

100Mから1Bエッジ

14GBから100GB RAM

4から12プロセッサ、計算が集中するワークロードの場合は16から32プロセッサまで

1Bエッジ以上

100GB RAM以上

12から32プロセッサ、特に計算が集中するワークロードの場合はそれ以上

1.4 プロパティ・グラフの空間サポート

Oracle Spatial and Graphオプションのプロパティ・グラフ・サポートは空間サポートと統合されました。

統合には以下の側面があります: プロパティ・グラフの空間データの表現、その空間データの空間索引の作成、その空間データの問合せ。

1.4.1 プロパティ・グラフの空間データの表現

空間データは、頂点のプロパティおよびエッジのプロパティの値として使用できます。

たとえば、エンティティは、locationという名前のプロパティの値として、点(経度および緯度)を持つことができます。別の例として、エッジはプロパティの値としてポリゴンを持つことができ、このプロパティはこのリンク(関係)が確立された場所を表現することができます。

次にプロパティ・グラフの空間データをエンコードするための構文の例を示します。

  • 点: '-122.230 37.560'

  • 点: 'POINT(-122.241 37.567)'

  • SRIDを指定した点: 'srid/8307 POINT(-122.246 37.572)'

  • ポリゴン: 'POLYGON((-83.6  34.1, -83.6 34.3, -83.4 34.3, -83.4 34.1, -83.6 34.1))'

  • SRIDを指定したポリゴン: 'srid/8307 POLYGON((-83.6 34.1, -83.6 34.3, -83.4 34.3, -83.4 34.1, -83.6 34.1))'

  • 線ストリング: 'LINESTRING (30 10, 10 30, 40 40)'

  • 複数線ストリング: 'MULTILINESTRING ((10 10, 20 20, 10 40), (40 40, 30 30, 40 20, 30 10))'

テスト・プロパティ・グラフの名前をtestとします。次の文は、頂点とそれぞれに指定された座標(経度および緯度)のセットを追加します。

insert into testVT$(vid, k, t, v) values(100, 'geoloc', 20, '-122.230 37.560'); 
insert into testVT$(vid, k, t, v) values(101, 'geoloc', 20, '-122.231 37.561');
insert into testVT$(vid, k, t, v) values(102, 'geoloc', 20, '-122.236 37.562914');
insert into testVT$(vid, k, t, v) values(103, 'geoloc', 20, '-122.241 37.567');
insert into testVT$(vid, k, t, v) values(104, 'geoloc', 20, '-122.246 37.572');
insert into testVT$(vid, k, t, v) values(105, 'geoloc', 20, '-122.251 37.577');
insert into testVT$(vid, k, t, v) values(200, 'geoloc', 20, '-122.256 37.582');
insert into testVT$(vid, k, t, v) values(201, 'geoloc', 20, '-122.261 37.587');

プロパティ・グラフの空間データを使用して、SDO_GEOMETRYオブジェクトを作成できます。たとえば、OPG_APIS.GET_GEOMETRY_FROM_V_T_COLS関数を使用して、指定した値(20など)のすべてのTに対しV列から空間データを読み取り、SDO_GEOMETRYオブジェクトを返すことができます。この関数は、値が2つの数字のようであれば表として解析しようとし、値が単一点でなければSDO_GEOMETRYコンストラクタを使用します。最後に、SRIDが指定されると、SDO_CS_TRANSFORMプロシージャを使用して、指定された座標システムを使用して変換します。

次の例は、OPG_APIS.GET_GEOMETRY_FROM_V_T_COLS関数を使用してtestプロパティ・グラフからジオメトリを取得します。これには一部の出力が含まれます。

SQL> select vid, k, opg_apis.get_geometry_from_v_t_cols 
      from testVT$     
        order by vid, k;
   . . .
       100 geoloc SDO_GEOMETRY(2001, 8307, SDO_POINT_TYPE(-122.23, 37.56, NULL), NULL, NULL)
       101 geoloc SDO_GEOMETRY(2001, 8307, SDO_POINT_TYPE(-122.231, 37.561, NULL), NULL, NULL)
       102 geoloc SDO_GEOMETRY(2001, 8307, SDO_POINT_TYPE(-122.236, 37.562914, NULL), NULL, NULL)
       103 geoloc SDO_GEOMETRY(2001, 8307, SDO_POINT_TYPE(-122.241, 37.567, NULL), NULL, NULL)
   . . .

SDO_GEOMETRYオブジェクトをWKTリテラルから生成できます。次の例は、WKTリテラルを挿入し、次にOPG_APIS.GET_WKTGEOMETRY_FROM_V_T_COLSを使用して、V、T列からSDO_GEOMETRYオブジェクトを作成します。

truncate table testGE$;
truncate table testVT$;
insert into testVT$(vid, k, t, v) values(101, 'geoloc', 20, 'POLYGON((-83.6  34.1, -83.6 34.3, -83.4 34.3, -83.4 34.1, -83.6 34.1))');
insert into testVT$(vid, k, t, v) values(103, 'geoloc', 20, 'POINT(-122.241 37.567)');
insert into testVT$(vid, k, t, v) values(105, 'geoloc', 20, 'POINT(-122.251 37.577)');
insert into testVT$(vid, k, t, v) values(200, 'geoloc', 20, 'MULTILINESTRING ((10 10, 20 20, 10 40), (40 40, 30 30, 40 20, 30 10))');
insert into testVT$(vid, k, t, v) values(201, 'geoloc', 20, 'LINESTRING (30 10, 10 30, 40 40)');

prompt show the geometry info
SQL> select vid, k, opg_apis.get_wktgeometry_from_v_t_cols(v,t) 
       from testVT$
      order by vid, k;
   . . .
       101 geoloc SDO_GEOMETRY(2003, 8307, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 1), SDO_ORDINATE_ARRAY(-83.6, 34.1, -83.6, 34.3, -83.4, 34.3, -83.4, 34.1, -83.6, 34.1))
       103 geoloc SDO_GEOMETRY(2001, 8307, SDO_POINT_TYPE(-122.241, 37.567, NULL), NULL, NULL)
       105 geoloc SDO_GEOMETRY(2001, 8307, SDO_POINT_TYPE(-122.251, 37.577, NULL), NULL, NULL)
       200 geoloc SDO_GEOMETRY(2006, 8307, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1, 7, 2, 1), SDO_ORDINATE_ARRAY(10, 10, 20, 20, 10, 40, 40, 40, 30, 30, 40, 20, 30, 10))
       201 geoloc SDO_GEOMETRY(2002, 8307, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1), SDO_ORDINATE_ARRAY(30, 10, 10, 30, 40, 40))

1.4.2 プロパティ・グラフ・データの空間索引の作成

空間データをプロパティ・グラフに追加した後、OPG_APISパッケージ・サブプログラムを使用してSDO_GEOMETRYオブジェクトを作成できます。さらに、頂点(VT$)またはエッジ(VT$)表にファンクションベースの空間索引を作成できます。

testという名前のプロパティ・グラフの例を使用して、次の文で、必要なメタデータを追加し、ファンクションベースの空間索引を作成します。

SQL> -- In the schema that owns the property graph TEST:
SQL> --
SQL> insert into user_sdo_geom_metadata values('TESTVT$',
 'mdsys.opg_apis.get_geometry_from_v_t_cols(v,t)',
 sdo_dim_array(
   sdo_dim_element('Longitude', -180, 180, 0.005),
   sdo_dim_element('Latitude', -90, 90, 0.005)), 8307);

commit;

SQL> -- Create a function-based spatial index
SQL> create index testVTXGEO$
       on testVT$(mdsys.opg_apis.get_geometry_from_v_t_cols(v, t))
       indextype is mdsys.spatial_index_v2
       parameters ('tablespace=USERS')
       parallel 4
       local;

(独自のプロパティ・グラフに空間索引を作成するには、グラフ名のtestを使用するグラフ名に置き換えます)

WKTリテラルがV列で使用されている場合、前述の2つのSQL文で、mdsys.opg_apis.get_geometry_from_v_t_colsmdsys.opg_apis.get_wktgeometry_from_v_t_colsで置き換えます。

前述のSQL空間索引の作成手順は、oracle.pg.rdbmsパッケージに定義されたOraclePropertyGraphクラスの便利なJavaメソッドに含まれています。

  /**
   * This API creates a default Spatial index on edges. It assumes that
   * the mdsys.opg_apis.get_geometry_from_v_t_cols(v,t) PL/SQL is going to be used
   * to create a function-based Spatial index. In addition, it adds a predefined
   * value into user_sdo_geom_metadata. To customize, please refer to the dev
   * guide for adding a row to user_sdo_geom_metadata and then creating a 
   * Spatial index manually.
   * Note that, a DDL will be executed so expect an implict commit. If you 
   * have changes that do not want to be persisted, run a rollback before calling
   * this method.
   * @param dop degree of parallelism used to create the Spatial index
   */
  public void createDefaultSpatialIndexOnEdges(int dop);

  /**
   * This API creates a default Spatial index on vertices. It assumes that
   * the mdsys.opg_apis.get_geometry_from_v_t_cols(v,t) PL/SQL is going to be used
   * to create a function-based Spatial index. In addition, it adds a predefined
   * value into user_sdo_geom_metadata. To customize, please refer to the dev
   * guide for adding a row to user_sdo_geom_metadata and then creating a 
   * Spatial index manually.
   * Note that a DDL will be executed so expect an implict commit. If you 
   * have changes that do not want to be persisted, run a rollback before calling
   * this method.
   * @param dop degree of parallelism used to create the Spatial index
   */
  public void createDefaultSpatialIndexOnVertices(int dop);

1.4.3 プロパティ・グラフの空間データの問合せ

Oracle Spatial and Graphの地理空間問合せファンクションは、プロパティ・グラフの空間データに適用できます。このトピックでは、いくつかの例を示します。

空間情報に基づく問合せは、ナビゲーションおよびパターン一致と組み合わせることができることに注意してください。

次の例では、位置(点ジオメトリ)の指定した距離(ここでは、1マイル)以内のエンティティ(頂点)を検出します。

SQL> -- use SDO_WITHIN_DISTANCE to filter vertices
SQL>  select vid, k, t, v 
        from testvt$
       where sdo_within_distance(mdsys.opg_apis.get_geometry_from_v_t_cols(v, t),
            mdsys.sdo_geometry(2001, 8307, mdsys.sdo_point_type(-122.23, 37.56, null), null, null), 
            'distance=1 unit=mile') = 'TRUE'
       order by vid, k;

出力および実行計画は次のようになります。新しく作成されたドメインindexTESTVTXGEO$が実行で使用されていることに注意してください。

       100 geoloc       20  -122.230 37.560
       101 geoloc       20  -122.231 37.561
       ..  ...              ...

----------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                               | Name        | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |    TQ  |IN-OUT| PQ Distrib |
----------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                        |             |     1 | 18176 |     2  (50)| 00:00:01 |       |       |        |      |            |
|   1 |  PX COORDINATOR                         |             |       |       |            |          |       |       |        |      |            |
|   2 |   PX SEND QC (ORDER)                    | :TQ10001    |     1 | 18176 |     2  (50)| 00:00:01 |       |       |  Q1,01 | P->S | QC (ORDER) |
|   3 |    SORT ORDER BY                        |             |     1 | 18176 |     2  (50)| 00:00:01 |       |       |  Q1,01 | PCWP |            |
|   4 |     PX RECEIVE                          |             |     1 | 18176 |     1   (0)| 00:00:01 |       |       |  Q1,01 | PCWP |            |
|   5 |      PX SEND RANGE                      | :TQ10000    |     1 | 18176 |     1   (0)| 00:00:01 |       |       |  Q1,00 | P->P | RANGE      |
|   6 |       PX PARTITION HASH ALL             |             |     1 | 18176 |     1   (0)| 00:00:01 |     1 |     8 |  Q1,00 | PCWC |            |
|*  7 |        TABLE ACCESS BY LOCAL INDEX ROWID| TESTVT$     |     1 | 18176 |     1   (0)| 00:00:01 |     1 |     8 |  Q1,00 | PCWP |            |
|*  8 |         DOMAIN INDEX (SEL: 0.000000 %)  | TESTVTXGEO$ |       |       |     1   (0)| 00:00:01 |       |       |  Q1,00 |      |            |
----------------------------------------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   7 - filter(INTERNAL_FUNCTION("K") AND INTERNAL_FUNCTION("V"))
   8 - access("MDSYS"."SDO_WITHIN_DISTANCE"("OPG_APIS"."GET_GEOMETRY_FROM_V_T_COLS"("V","T"),"MDSYS"."SDO_GEOMETRY"(2001,8307,"MDSYS"."SDO_P
              OINT_TYPE"((-122.23),37.56,NULL),NULL,NULL),'distance=1 unit=mile')='TRUE')

次の例では、位置からの距離に基づきエンティティ(頂点)をソートします。

-- Sort based on distance in miles
SQL> select vid, dist from (
       select vid, k, t, v, 
          sdo_geom.sdo_distance(mdsys.opg_apis.get_geometry_from_v_t_cols(v, t),
              mdsys.sdo_geometry(2001, 8307, mdsys.sdo_point_type(-122.23, 37.56, null), null, null), 1.0, 'unit=mile') dist
         from testvt$
        where t = 20
      ) order by dist asc
;

出力および実行計画は次のようになります。

        ...
       101  .088148935
       102  .385863422
       103  .773127682
       104 1.2068052
       105 1.64421947
       200 2.08301065
       ...

-----------------------------------------------------------------------------------------------
| Id  | Operation           | Name    | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
-----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |         |     1 | 15062 |  1366   (1)| 00:00:01 |       |       |
|   1 |  SORT ORDER BY      |         |     1 | 15062 |  1366   (1)| 00:00:01 |       |       |
|   2 |   PARTITION HASH ALL|         |     1 | 15062 |  1365   (1)| 00:00:01 |     1 |     8 |
|*  3 |    TABLE ACCESS FULL| TESTVT$ |     1 | 15062 |  1365   (1)| 00:00:01 |     1 |     8 |
-----------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------

   3 - filter("T"=20 AND INTERNAL_FUNCTION("V"))