8 プロパティ・グラフの空間サポート
Oracle Spatial and Graphオプションのプロパティ・グラフ・サポートは空間サポートと統合されました。
統合には以下の側面があります: プロパティ・グラフの空間データの表現、その空間データの空間索引の作成、その空間データの問合せ。
8.1 プロパティ・グラフの空間データの表現
空間データは、頂点のプロパティおよびエッジのプロパティの値として使用できます。
たとえば、エンティティは、locationという名前のプロパティの値として、点(経度および緯度)を持つことができます。別の例として、エッジはプロパティの値としてポリゴンを持つことができ、このプロパティはこのリンク(関係)が確立された場所を表現することができます。
次にプロパティ・グラフの空間データをエンコードするための構文の例を示します。
-
Point:
'-122.230 37.560'
-
Point:
'POINT(-122.241 37.567)'
-
SRIDを指定した点:
'srid/8307 POINT(-122.246 37.572)'
-
Polygon: '
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))'
-
Line string:
'LINESTRING (30 10, 10 30, 40 40)'
-
Multiline string:
'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))
親トピック: プロパティ・グラフの空間サポート
8.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_colsをmdsys.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);
親トピック: プロパティ・グラフの空間サポート
8.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"))
親トピック: プロパティ・グラフの空間サポート