Oracle® Spatial and Graphトポロジ・データ・モデルおよびネットワーク・データ・モデル・グラフ開発者ガイド 12cリリース1 (12.1) B72471-05 |
|
前 |
次 |
この章では、グラフ内のノードおよびリンク(頂点およびエッジ)としてモデル化される機能またはオブジェクトを表すネットワーク・データ・モデルに関連する概念および操作について説明します。このモデルは、Oracle Spatial and Graphネットワーク・データ・モデル・グラフ機能(または単にネットワーク・データ・モデル・グラフ)と呼ばれます。この章では、ユーザーが『Oracle Spatial and Graph開発者ガイド』に記載されているOracle Spatial and Graphの主な概念、データ型および操作を理解していると想定しています。
この章では、Oracle Spatial and Graphに関連するいくつかのネットワーク関連の用語について説明しますが、ユーザーがネットワーク・データ・モデリングの基本的な概念を十分に理解していると想定しています。
この章には次の項が含まれます。
多くのアプリケーションで、機能またはオブジェクトは、ネットワークのノードおよびリンクとしてモデル化されます。ネットワーク・モデルには、ノード間およびリンク間の接続性の関係、リンクの方向、ノードおよびリンクのコストなどの論理情報が含まれます。論理ネットワーク情報を使用して、ネットワークを分析し、質問(多くはパスの計算および追跡に関連する質問)に対する回答を得ることができます。たとえば、生化学パスウェイの場合、2つの化合物間で可能なすべての反応パスウェイを検出できます。または、道路ネットワークの場合、次の情報を検出できます。
2つの都市間の最短(距離)パスまたは最速(移動時間)パス
特定の空港に最も近いホテルおよびそのホテルへのアクセス方法
論理ネットワーク情報の他に、ノードの位置やリンクのジオメトリなどの空間情報をネットワークに関連付けることができます。この情報を使用すると、論理情報をモデル化できます(たとえば、ルートの物理的な長さを空間表現から直接計算できるため、このルートのコストなどの論理情報をモデル化できます)。
Spatial and Graphネットワーク・データ・モデル・グラフ機能は、大規模で複雑なネットワークに対して使用できます。たとえば、図5-1は、ネットワーク分析用のデモのWebベース・アプリケーションに表示された、ネットワーク・データ・モデル・グラフ機能を使用して定義したサンフランシスコ市とリンクを示しています。(「ネットワーク・データ・モデル・グラフのチュートリアルとその他のリソース」で説明しているNDMチュートリアルを使用して、このデモをインストールできます。)
一般的なデータ・モデルおよびネットワーク分析機能を使用すると、従来の地理情報システム(GIS)の他に、多くの種類のネットワーク・アプリケーションをモデル化および分析できます。たとえば、生化学の分野では、アプリケーションで、生物の反応パスウェイ・ネットワークをモデル化する必要がある場合があります。製薬産業では、新薬発見プロセスをモデル化するアプリケーションで、蛋白質間の相互作用をモデル化する必要がある場合があります。
Spatial and Graphのネットワーク・モデリング機能には、スキーマ・オブジェクトおよびApplication Program Interface (API)が含まれます。スキーマ・オブジェクトには、メタデータおよびネットワーク表が含まれます。APIには、データベースでネットワークを作成および管理するためのサーバー側PL/SQL API (SDO_NETパッケージ)、およびネットワークの編集と分析のための中間層(クライアント側) Java APIが含まれます。
この項では、Oracle Spatial and Graphでネットワーク・データ・モデル・グラフ機能を使用するための主な手順の概要を示します。また、重要な概念、構造および操作を示します(詳細は他の項を参照してください)。
ネットワークを作成するには2つの基本的な方法があります。
CREATE_<network-type>_NETWORKという形式の名前を持つプロシージャを使用して、大部分の操作をSpatial and Graphによって実行します。(「Spatialによる操作の実行」を参照してください。)
自分自身で操作を実行します。必要なネットワーク表を作成し、ネットワーク・メタデータを更新します。(「自分自身での操作の実行」を参照してください。)
どちらの方法を使用した場合も、ネットワーク・データをネットワーク表に挿入する必要があります。その後、ネットワーク・データ・モデル・グラフのPL/SQL Application Program Interface (API)およびJava APIを使用してネットワークを更新し、その他の操作を実行できます。(PL/SQLおよびJava APIの詳細は、「ネットワーク・データ・モデル・グラフのApplication Program Interface」を参照してください。)
ネットワークは、接続性を使用してオブジェクト間の関係を表す数学的なグラフです。接続性は、空間の近接性に基づく場合と、基づかない場合があります。たとえば、2つの町が湖の対岸に位置するとき、1つの町からもう1つの町まで車で移動する場合には、空間の近接性に基づく最短パス(湖の中心を通る直線)は適切ではありません。かわりに、最短の運転距離を検出するには、道路と交差点、および個別のリンクのコストに関する接続性情報が必要です。
ネットワークは一連のノードおよびリンクで構成されています。各リンク(エッジまたはセグメントともいう)は、2つのノードを指定します。
ネットワークは、有向(デフォルトでは、リンクの方向は開始ノードと終了ノードによって決まる)または無向(リンクのどちらの方向にも進むことができる)にすることができます。
ネットワーク・データ・モデル・グラフ機能に関連するいくつかの重要な用語を次に示します。
ノード(頂点とも呼ばれます)は、リンクを相互に結合できる点です。孤立ノードとは、どのリンクにも含まれていないノードのことです。(連結ノードは、そのノードを含むすべてのリンクが削除されると、孤立ノードになります。)
リンクは、2つのノード間の関係を表します。有向ネットワーク内のリンクは、無向(開始ノードから終了ノード、終了ノードから開始ノードのどちらの向きにも進むことが可能)または有向(開始ノードから終了ノードの向きにのみ進むことが可能)に設定できます。無向ネットワーク内のリンクは、すべて無向です。
ネットワーク要素は、ノードまたはリンクです。
パスは、ノードおよびリンクを交互につなげたもので、ノードで開始および終了します。通常、同じノードおよびリンクが複数回現れることはありません。(1つのパス内でノードおよびリンクを繰返し使用することもできますが、ほとんどのネットワーク・アプリケーションでは、通常、同じノードおよびリンクが繰返し使用されることはありません。)
サブパスは、パスに沿った部分的なパスであり、ネットワーク分析操作の結果として作成されたり、ユーザーによって明示的に作成されます。サブパスについては、「サブパス」を参照してください。
論理ネットワークには接続性情報が含まれますが、ジオメトリ情報は含まれません。これは、ネットワーク分析に使用されるモデルです。論理ネットワークは、アプリケーションに応じて、有向グラフまたは無向グラフとして処理できます。
空間ネットワークには、接続性情報とジオメトリ情報の両方が含まれます。空間ネットワークでは、ノードおよびリンクは、LRS情報が含まれないSDO_GEOMETRYジオメトリ・オブジェクト(SDOネットワーク)、LRS情報が含まれるSDO_GEOMETRYジオメトリ・オブジェクト(LRSネットワーク)、またはSDO_TOPO_GEOMETRYオブジェクト(トポロジ・ジオメトリ・ネットワーク)になります。
LRSネットワークでは、各ノードにジオメトリID値およびメジャー値が含まれ、各リンクにジオメトリID値および開始メジャー値と終了メジャー値が含まれます。いずれの場合にも、ジオメトリID値は、LRS情報が含まれるSDO_GEOMETRYオブジェクトを参照します。空間ネットワークは、アプリケーションに応じて、有向または無向にすることができます。
フィーチャは、ノードまたはリンクに関連付けられた、ネットワーク・アプリケーションの対象オブジェクトです。(フィーチャおよびフィーチャ・レイヤー・タイプについては、「フィーチャおよびフィーチャ・レイヤー」を参照)
コストは、最低コスト・パスを計算するための、リンクまたはノードに関連付け可能な負でない数値の属性です。最低コスト・パスとは、開始ノードから終了ノードまでの合計コストが最低になるパスです。ネットワーク・メタデータで、リンクの運転時間や運転距離など、単一のコスト因子を指定し、コストを調べるネットワーク分析ファンクションで使用できます。
継続時間は、リンクまたはノードに関連付ける負でない数値の属性で、リンクまたはノードの継続時間の値を指定できます。継続時間の値は、時間(分)や他のユーザー定義項目を示すことができます。ネットワーク・メタデータで、リンクの運転時間など、単一の継続時間因子を指定できます。ただし、コストのかわりに継続時間を使用して経過時間を示す場合、指定した継続時間は、コストを調査するネットワーク分析ファンクションの検討対象になりません。
状態は、リンクまたはノードに関連付けるACTIVE
またはINACTIVE
の文字列属性で、リンクまたはノードをネットワーク分析ファンクションの検討対象にするかどうかを指定します。たとえば、ノードの状態がINACTIVE
の場合、そのノードが起点または終点のリンクは、2ノード間の最短パスの計算時に無視されます。リンクやノードを作成した時点では、状態はデフォルトでACTIVE
ですが、INACTIVE
に設定できます。
タイプは、リンクまたはノードに関連付けることのできる文字列属性で、リンクまたはノードのタイプに対するユーザー定義値を指定します。
一時的なリンク、ノードおよびパスは、ネットワーク・メモリー・オブジェクト内にのみ存在し、ネットワーク・メモリー・オブジェクトをデータベースに書き込むときもデータベースには書き込まれません。たとえば、ネットワークの分析時や編集セッション時には、一時ノードを作成して住所を表し、最短パスの計算で使用することがありますが、編集操作の結果を保存するときは、これらの一時ノードは保存されません。
到達可能ノードは、任意のノードから到達可能なすべてのノードです。到達ノードは、任意のノードに到達可能なすべてのノードです。
ノードの度数は、そのノードへのリンク(ノードに対するインシデント)の数です。イン度数はインバウンド・リンクの数で、アウト度数はアウトバウンド・リンクの数です。
接続されているコンポーネントとは、直接または間接的に接続されたネットワーク・ノードのグループのことです。ノードAがノードBに到達可能な場合、これらのノードは同じ接続されているコンポーネントに属している必要があります。2つのノードが接続されていない場合、これらのノード間で使用可能なパスがないということがわかります。この情報は、不要なパスの計算を避けるためのフィルタとして使用されます。
接続されたグラフのスパニング・ツリー は、グラフのすべてのノードを接続するツリー(サイクルが含まれないグラフ)です。(スパニング・ツリーでは、リンクの方向は無視されます。)最低コスト・スパニング・ツリーは、すべてのノードを接続し、合計コストが最低になるスパニング・ツリーです。
パーティション化されたネットワークとは、複数のパーティションを含むネットワークのことです。大規模なネットワークをパーティション化すると、必要なパーティションのみをオンデマンドでメモリーにロードできるため、全体的なパフォーマンスが向上します。
ネットワーク・パーティションとは、サブネットワークのことです。各パーティションには、ネットワーク全体のノードとリンクのサブセットが含まれます。ネットワーク・パーティションは、ロード・オンデマンド分析を行うための基本的な処理単位です。ネットワーク・パーティションを作成するには、ネットワーク内のすべてのノードを1つのパーティションIDのみに割り当てます。ネットワーク・パーティションの情報は、パーティション表に格納されます。
ロード・オンデマンド(ロード・オンデマンド分析)は、大規模なネットワークを管理可能なパーティションに分割し、分析中に必要なパーティションのみをロードすることによって、考慮事項となっているメモリー制限を排除し、全体的なパフォーマンスを向上させる方法です。
パーティションBLOBは、ネットワーク・パーティションをバイナリで表現したものです。これを使用すると、パーティションのロード時間を短縮できます。パーティションBLOBは、パーティションBLOB表に格納されます。
ロード・オンデマンドのパーティション・キャッシュは、ネットワーク分析中にメモリーにロードされるネットワーク・パーティションに対するインメモリー・プレースホルダです。パーティション・キャッシュは、構成することができます。
ユーザー定義データは、ユーザーがネットワーク表現に関連付ける(接続性とは関係のない)情報です。ユーザー定義データは、ノード、リンク、パスおよびサブパスの各レベルで定義することができ、ノード表、リンク表、パス表およびサブパス表の列に格納されます。
サブパスは、パスに沿った部分的なパスであり、ネットワーク分析操作の結果として作成されたり、ユーザーによって明示的に作成されます。サブパスの開始点および終了点は、図5-2に示すように、リンクの索引と、パスにおける1つ前のノードからの距離の割合として定義されます。
サブパスは、次のパラメータを使用して、既存のパス(参照パス)を参照します。
参照パスID: 参照パスのパスID。
開始リンクの索引: 参照パス上の開始リンクの索引。(リンク索引0は、パス上の最初のノードと2番目のノード間のリンクを示します。)図5-2ではリンク索引0が開始リンクの索引です。
開始の割合: サブパスの開始ノードに対する、開始リンクに沿った距離の割合。図5-2では、サブパスは、リンク索引0の開始から終了までの距離の65%の位置で開始しています。
終了リンクの索引: 参照パス上の終了リンクの索引。図5-2ではリンク索引6が終了リンクの索引です。
終了の割合: サブパスの終了ノードに対する、終了リンクに沿った距離の割合。図5-2では、サブパスは、リンク索引6の開始から終了までの距離の50%の位置で終了しています。
フィーチャは、ノードまたはリンクに関連付けられた、ネットワーク・アプリケーションの対象オブジェクトです。たとえば、輸送ネットワークでは、(ノードにマップされた)出口と交差点、および(リンクにマップされた)高速道路と通りがフィーチャになります。
フィーチャは1つ以上のフィーチャ要素で構成されます。フィーチャ要素は、ネットワークに沿った点または線です。フィーチャ要素が点である場合、要素はノード上または線に沿って存在し、フィーチャ要素が線である場合、要素は完全リンクまたは部分リンクとなります。
フィーチャのフィーチャ要素のタイプに応じて、フィーチャのフィーチャ・タイプは、表5-1に示すタイプのいずれかになります。
表5-1 フィーチャ・タイプ
タイプ番号 | タイプ名 | フィーチャ要素の構成 |
---|---|---|
1 |
SDO_NET.FEAT_TYPE_PON |
ノード上の単一の点 |
2 |
SDO_NET.FEAT_TYPE_POL |
リンク上の単一の点 |
3 |
SDO_NET.FEAT_TYPE_POINT |
単一の点(ただし、点がノード上またはリンク上のいずれにあるのかは不明です) |
4 |
SDO_NET.FEAT_TYPE_LINE |
単一の線 |
5 |
SDO_NET.FEAT_TYPE_MPON |
1つ以上のノード上にある1つ以上の点 |
6 |
SDO_NET.FEAT_TYPE_MPOL |
1つ以上のリンク上にある1つ以上の点 |
7 |
SDO_NET.FEAT_TYPE_MPOINT |
1つ以上の点(ただし、点はノード上またはリンク上あるいは両方の組合せ上にあります) |
8 |
SDO_NET.FEAT_TYPE_MLINE |
1つ以上の線 |
9 |
SDO_NET.FEAT_TYPE_COLL |
点と線両方の集合、またはフィーチャ要素のタイプが不明 |
フィーチャ・レイヤーは、同じ属性セットを持つフィーチャを含む表に対応します。たとえば、道路ネットワークでは、レストランとホテルに対して異なるフィーチャ・レイヤー(および旅行者が興味を示すその他の対象のフィーチャ・レイヤー)が存在する可能性があります。
フィーチャ・レイヤー内にあるフィーチャのタイプに応じて、フィーチャ・レイヤーのフィーチャ・レイヤー・タイプは、表5-2に示すタイプのいずれかになります(表5-2では、各フィーチャ・レイヤー・タイプを、表5-1の関連するフィーチャ・タイプにマップしています)。
表5-2 フィーチャ・レイヤー・タイプ
レイヤー・タイプ番号 | レイヤーのフィーチャ(タイプ): |
---|---|
1 |
タイプ1 (SDO_NET.FEAT_TYPE_PON) |
2 |
タイプ2 (SDO_NET.FEAT_TYPE_POL) |
3 |
タイプ3 (SDO_NET.FEAT_TYPE_POINT) |
4 |
タイプ4 (SDO_NET.FEAT_TYPE_LINE) |
5 |
タイプ5 (SDO_NET.FEAT_TYPE_MPON)または1 (SDO_NET.FEAT_TYPE_PON) |
6 |
タイプ6 (SDO_NET.FEAT_TYPE_MPOL)または2 (SDO_NET.FEAT_TYPE_POL) |
7 |
タイプ1、2、3、5、6または7 |
8 |
タイプ8 (SDO_NET.FEAT_TYPE_MLINE)または4 (SDO_NET.FEAT_TYPE_LINE) |
9 |
任意の数のフィーチャ・タイプが混在する可能性あり |
親フィーチャは、1つ以上のフィーチャ・レイヤーのフィーチャで構成されます。たとえば、電気ネットワークでは、サブステーションは、その関連部分(接合部、スイッチ、ケーブルなど)すべてのフィーチャ・レイヤーに対する親フィーチャです。
ネットワークは、アプリケーションで、異なるオブジェクトが相互に接続されている方法を確認するために使用されます。接続性は、通常、近接性およびパスの関係で表現されます。2つのノードが1つのリンクで接続されている場合、これらのノードは近接しています。多くの場合、任意の2つのノード間には複数のパスが存在し、コストが最低になるパスを検出する必要がある場合があります。
この項では、いくつかの種類のネットワーク・アプリケーションでの一般的な例について説明します。
通常の道路ネットワークでは、道路の交差点がノードになり、2つの交差点間の道路セグメントがリンクになります。道路の空間表現は、ネットワークのノードおよびリンクとは本質的に無関係です。たとえば、(道路の急カーブを反映する)道路の空間表現の形状点は、この形状点が交差点に関連付けられていない場合、ネットワークのノードにはなりません。また、単一の空間オブジェクトが、ネットワークの複数のリンクを構成する場合があります(横断する3つの道路によって交差点が形成された直線セグメントなど)。道路ネットワークに関する重要な操作は、移動時間または移動距離が最短になる、開始点から終了点までのパスを検索することです。パスの計算には、特定のランドマークの通過や特定の交差点の回避など、追加の制約が課せられる場合があります。
大都市の地下鉄ネットワークは、停車駅および線路の正確な空間表現が重要でないと想定すると、最適なモデル化が行われた論理ネットワークであるといえます。このネットワークでは、地下鉄のすべての停車駅がネットワークのノードを構成し、列車が2つの停車駅間を直接移動する場合、これらの2つの停車駅間の接続がリンクになります。鉄道ネットワークに関する重要な操作には、指定された駅から到達可能なすべての駅の検索、指定された2つの駅間の停車駅の数の検索、および2つの駅間の移動時間の検索が含まれます。
マルチモーダル・ネットワークは、複数のモードで構成されるネットワーク(運転ルートと歩行ルートで構成されるネットワークなど)です。マルチモーダル・ネットワークは、通常、(特定のモードの)個別のネットワークとしてモデル化され、集約ネットワークとして処理されるため、単一モードと複数モードのルートを表現して計算することが可能です。一般的に、マルチモーダル・ネットワークは異なるモードのスケジュールによって接続されますが、このような場合、マルチモーダル・ネットワークは時間ネットワークにもなります。例としては、最も近いバス停まで歩き、最速のバス・ルートを選択し、目的地に最も近いバス停で下車し、目的地まで歩く場合の移動工程の計算が挙げられます。また、運転や飛行などのモードの追加を考慮することもできます。
時間のモデリングと分析は、ネットワークのモデリングと分析に時間次元を追加します。時間係数は、静的な(時間以外の)ネットワーク上にコストまたは制約(あるいはその両方)を提供します。例としては、静的な移動時間コストのかわりに、トラフィック・パターン(時間に依存した移動時間コスト)を考慮する場合が挙げられます。
多くの大都市の輸送ネットワークは、バス、地下鉄、通勤路線などの複数のモードで構成され、モード間での乗換え(バスから地下鉄など)が可能です。各輸送モードが、大きな輸送ネットワーク内でのコンポーネント・ネットワークを持ちます。コンポーネント・ネットワークは、ノードとリンクを使用してモデル化することができ、ノード間の乗換えは、乗換え可能な停車駅を接続するリンクとしてモデル化できます。
このようなマルチモーダル輸送ネットワークで重要な機能は、スケジュールベースの操作です。一般的なネットワーク操作(開始点から終了点までの最速ルートの計算など)を実行する場合、スケジュール情報とモード間で可能な乗換えを考慮する必要があります。停車駅のスケジュール情報は、これらの停車駅を表すノードでユーザー定義データとして表現できます。マルチモーダル・ネットワークでスケジュール情報を使用する操作の例としては、(A)指定された開始時間で開始点から終了点までの最速ルートを検出する場合、(B)指定された到着時刻までに終了点に到達できる、開始点での最も遅い出発時刻を検出する場合などが挙げられます。
送電線ネットワークやケーブル・ネットワークなどのライフライン・ネットワークは、多くの場合、コストが最低になるように構成する必要があります。ライフライン・ネットワークに関する重要な操作は、最低コスト・スパニング・ツリー・アルゴリズムを使用してノード間の接続を決定し、必要な品質のサービスを最低コストで提供することです。もう1つの重要な操作は、到達可能性の分析です。たとえば、水道ネットワークの給水拠点が停止した場合、影響を受けるエリアがわかります。
一部のネットワーク・アプリケーションでは、異なる抽象化レベルでの表現が必要です。たとえば、2つの主なプロセスがリンクで接続された最も高い抽象化レベルのノードとして表され、それぞれの主なプロセスがノードおよびリンクで表現された1段階低いレベルの複数の下位プロセスを持つ場合があります。
ネットワーク階層を使用すると、各ノードに階層レベルを割り当てることによって、ネットワークを複数の抽象化レベルで表現できます。(リンクには階層レベルは割り当てられません。リンクは、同じ階層レベルまたは異なる階層レベルのノード間に設定できます。)階層内で最も低い(最も詳細な)レベルはレベル1で、これより高いレベルは順にレベル2、レベル3のように番号が付けられます。
ネットワーク階層で隣接するレベルのノードには、親子関係があります。上位レベルの各ノードは、下位レベルの1つ以上のノードに対する親ノードになります。下位レベルの各ノードは、上位レベルの1つのノードの子ノードになります。同じ親ノードを持つノードは、兄弟ノードになります。
リンクにも、親子関係がある場合があります。ただし、リンクには階層レベルが割り当てられないため、リンクの親子関係とネットワーク階層レベルには関連性がない場合もあります。同じ親リンクを持つリンクは、兄弟リンクになります。
図5-3に、2つのレベルが存在する単純な階層ネットワークを示します。
次に、図5-3について説明します。
上位レベル(レベル2)には、2つのノードが含まれます。各ノードは、下位レベルの複数のノードに対する親ノードです。上位レベルのノード間のリンクは、下位レベルのノード間の2つのリンクに対する親リンクです。
下位レベル(レベル1)は、上位レベルの各ノードを構成するノードを示します。また、上位レベルの各親ノードの子ノードであるノード間のリンク、および異なる親ノードを持つノード間のリンクを示します。
異なる親ノードを持つ下位レベルのノード間のリンクは、太い接続線で示されています。これらのリンクは、階層の上位レベルのノード間の単一のリンクの子リンクです。(ただし、下位レベルでのこれらの2つのリンクを、上位レベルのノード間の親リンクの子リンクとして定義しない場合もあります。)
それぞれの親ノードと親リンク、およびその子ノードと子リンクとの間の親子関係は、両端に矢印がある破線で示されています。
図5-3には示しませんが、異なる階層レベル間にリンクを設定できます。たとえば、上位レベルのノードと下位レベルの任意のノードとの間にリンクを定義できます。この場合、リンク間には親子関係がありません。
ネットワーク内の特定のノード・グループについて、親ネットワークを定義できます。子ネットワーク内のグループIDは、親ネットワーク内のノードIDとして使用されます。子ネットワーク内のグループ間の集約リンクは、親ネットワーク内のリンクを表し、任意のリンクIDが割り当てられます。
ネットワークでは、ノードをグループ化する方法を様々な基準に応じて複数使用することができるため、複数の親ネットワークを持つことができます。また、親ネットワーク内のノードをさらにグループ化して、上位レベルの親ネットワークを形成することもできます。たとえば、ソーシャル・ネットワークでは、メンバーを市、職業、所得などの基準でグループ化できます。たとえば、市でグループ化されたメンバーを、上位レベルの郡、州または国のネットワークにさらにグループ化できます。
ネットワークの親子関係は、ネットワーク・メタデータのCHILD_NETWORK列およびHIERARCHY_TABLE_NAME列を使用して定義されます。
xxx_SDO_NETWORK_USER_DATAビューを介して定義されたユーザー・データについては、ネットワーク分析中にユーザー・データにアクセスする場合、デフォルトのユーザー・データI/O実装(LODUserDataIOSDO
)が使用されます。ただし、一部のユーザー・データは、ノード表またはリンク表に含まれていないため、xxx_SDO_NETWORK_USER_DATAビューを介して登録できません。このようなユーザー・データについては、ユーザーが、ユーザー・データI/Oインタフェースの独自のカスタム実装を提供する必要があります。カスタムのデータI/Oインタフェースを実装する一般的な方法は、ノードおよびリンクのユーザー・データに対応したBLOB (各パーティションごとに1つのBLOB)を生成してから、ネットワーク分析中にBLOBからユーザー・データ情報を取得することです。
ネットワーク・データ・モデル・グラフを使用すると、複数のカテゴリのユーザー定義データ(カテゴリ分けされたユーザー・データ)を単一のネットワークに関連付けることもできます。たとえば、マルチモーダル・ネットワークでは、リンクのマルチモーダル属性の他に、運転に関連する属性(制限速度など)をリンクに関連付ける必要がある場合、ユーザー定義データを2つのカテゴリ(1つは運転に関連する属性用で、もう1つはマルチモーダル属性用)に整理できます。
この項には次のサブセクションが含まれます:
この項では、ネットワークのユーザー定義データの使用例を示します。ユーザー定義データとは、ユーザーがネットワーク表現と関連付ける(接続性とは関係のない)情報です。USER_SDO_NETWORK_USER_DATAメタデータ・ビューとALL_SDO_NETWORK_USER_DATAメタデータ・ビュー(「xxx_SDO_NETWORK_USER_DATAビュー」を参照)のどちらにも、ユーザー定義データに関する情報が含まれます。
ユーザー定義データを使用するには、該当するxxx_SDO_NETWORK_METADATAビュー(「xxx_SDO_NETWORK_METADATAビュー」の項を参照)のUSER_DEFINED_DATA列の値にY
を設定する必要があります。
例5-1では、リンク関連のユーザー定義データをネットワーク・メタデータに挿入します。
例5-1 ユーザー定義データのネットワーク・メタデータへの挿入
-- Insert link user data named 'interaction' of
-- type varchar2 (50) in network 'bi_test'.
--'interaction' is a column of type varchar2(50) in the link table of network 'bi_
test'.
insert into user_sdo_network_user_data (network, table_type, data_name, data_type, data_length, category_id)
values ('bi_test', 'LINK', 'interaction', 'VARCHAR2', 50, 0) ;
-- insert link user data named 'PROB' of type Number.
--'PROB' is a column of type NUMBER in the link table of network 'bi_test'.
insert into user_sdo_network_user_data (network, table_type, data_name, data_type, category_id)
values ('bi_test','LINK','PROB','NUMBER', 0) ;
After a network or network partition is loaded, user-defined data is available in Java representations. You can access user-defined data through the getCategorizedUserData and setCategorizedUserData methods for the Node, Link, Path, and SubPath interfaces. For example:
//The user data index is the sequence number of a user data within a category sorted by data name.
int interactionUserDataIndex = 0;
int probUserDataIndex = 1;
String interaction = (String)link.getCategorizedUserData().getUserData(0).
get(interactionUseDataIndex);
double prob = ((Double)link.getCategorizedUserData().getUserData(0).
get(probUserdataIndex)).doubleValue();
この項では、LODUserDataIO
インタフェースのカスタムのユーザー・データI/O実装(デフォルト以外の実装)の例を示します。例5-2では、リンクに関連付けられたユーザー・データがBLOB (各パーティションごとに1つのBLOB)に書き込まれ、分析中にBLOBから読み込まれます。この例では、各パーティションのマルチモーダル・データに対するユーザー定義データのBLOBには、パーティションIDとパーティションに関連付けられたリンクの数が含まれ、その後に各リンクの<Link ID, link route ID>が含まれていることを前提としています。
例5-2 LODUserDataIOのwriteUserDataメソッドの実装
//Method getLinksInPartition(partitionId) computes a vector that // consists of the ID and the route ID of each link associated with a partition // with ID = partitionId LinkVector = getLinksInPartition(partitionId); ObjectOutputStream dout = null; //Insert an empty blob for the partition with ID = partition_id String insertStr = "INSERT INTO " + MULTIMODAL_USER_DATA + " (partition_id, blob) " + " VALUES " + " (?, EMPTY_LOB())" ; PreparedStatement stmt = conn.prepareStatement(insertStr); stmt.setInt(1,partitionId); int n = stmt.executeUpdate(); stmt.close(); //lock the row for blob update String lockRowStr = "SELECT blob FROM " + MULTIMODAL_USER_DATA + " WHERE partition_id = ? " + " FOR UPDATE"; stmt = conn.prepareStatement(lockRowStr); stmt.setInt(1,partitionId); ResultSet rs = stmt.executeQuery(); rs.next(); oracle.sql.BLOB userDataBlob = (oracle.sql.BLOB) rs.getBlob(1); stmt.close(); OutputStream blobOut = ((oracle.sql.BLOB) userDataBlob).setBinaryStream(1); dout = new ObjectOutputStream(blobOut); //write partition ID dout.writeInt(partitionId); int numLinks = linkVector.size() for (int i=0; i<linkVector.size(); i++) { //MultimodalLink is a class with variables link ID and route ID MultimodalLink link = (MultimodalLink) linkVector.elementAt(i); //write link ID dout.writeLong(link.getLinkId()); // write route ID into file dout.writeInt(link.getRouteId()); } dout.close(); blobOut.close(); rs.close();
後に続く項では、LODUserDataIO
インタフェースのwriteUserData
メソッドとreadUserData
メソッドの実装について説明します。
LODUserDataIOのwriteUserDataメソッドの実装では、ユーザー定義データのBLOB表の名前がMULTIMODAL_USER_DATAであると想定されています。
//Method getLinksInPartition(partitionId) computes a vector that // consists of the ID and the route ID of each link associated with a partition // with ID = partitionId LinkVector = getLinksInPartition(partitionId); ObjectOutputStream dout = null; //Insert an empty blob for the partition with ID = partition_id String insertStr = "INSERT INTO " + MULTIMODAL_USER_DATA + " (partition_id, blob) " + " VALUES " + " (?, EMPTY_BLOB())" ; PreparedStatement stmt = conn.prepareStatement(insertStr); stmt.setInt(1,partitionId); int n = stmt.executeUpdate(); stmt.close(); //lock the row for blob update String lockRowStr = "SELECT blob FROM " + MULTIMODAL_USER_DATA + " WHERE partition_id = ? " + " FOR UPDATE"; stmt = conn.prepareStatement(lockRowStr); stmt.setInt(1,partitionId); ResultSet rs = stmt.executeQuery(); rs.next(); oracle.sql.BLOB userDataBlob = (oracle.sql.BLOB) rs.getBlob(1); stmt.close(); OutputStream blobOut = ((oracle.sql.BLOB) userDataBlob).setBinaryStream(1); dout = new ObjectOutputStream(blobOut); //write partition ID dout.writeInt(partitionId); int numLinks = linkVector.size() for (int i=0; i<linkVector.size(); i++) { //MultimodalLink is a class with variables link ID and route ID MultimodalLink link = (MultimodalLink) linkVector.elementAt(i); //write link ID dout.writeLong(link.getLinkId()); // write route ID into file dout.writeInt(link.getRouteId()); } dout.close(); blobOut.close(); rs.close();
ユーザー定義データにアクセスするには、Node
、Link
、Path
およびSubPath
インタフェースのgetCategorizedUserData
メソッドおよびsetCategorizedUserData
メソッド、およびCategorizedUserData
インタフェースのgetUserData
メソッドおよびsetUserData
メソッドを使用します。
//Read the blob for the required partition from the user data blob table // In this example, // MULTIMODAL_USER_DATA is the name of user –defined data blob table BLOB multimodalBlob = null; String queryStr = "SELECT blob FROM " + MULTIMODAL_USER_DATA " WHERE partition_id = ?"; PreparedStatement stmt = conn.prepareStatement(queryStr); stmt.setInt(1,partitionId); ResultSet rs = stmt.executeQuery(); if (rs.next()) { multimodalBlob = (oracle.sql.BLOB)rs.getBlob(1); } // Materialize the blob value as an input stream InputStream is = multimodalBlob.getBinaryStream(); //Create an ObjectInputStream that reads from the InputStream is ObjectInputStream ois = new ObjectInputStream(is); //Read the values of partition ID and number of links from the blob int partitionId = ois.readInt(); int numLinks = ois.readInt(); for (int i=0; i<numLinks; i++) { //Read link ID and route ID for each link long linkId = ois.readLong(); int routeId = ois.readInt(); //MultimodalLinkUserData is an implementation of NDM LOD UserData interface //Implementation is provided at the end of the example linkUserData = new MultimodalLinkUserData(routeId); //Get the link object corresponding to the link ID LogicalNetLink link = partition.getLink(linkId); //Get the (categorized) user data associated with the link. CategorizedUserData cud = link.getCategorizedUserData(); // If the link does not have categorized user data associated with it, // initialize it to linkUserData // Else, set the user data for category USER_DATA_MULTIMODAL // to linkUserData if (cud == null) { UserData [] userDataArray = {linkUserData}; cud = new CategorizedUserDataImpl(userDataArray); link.setCategorizedUserData(cud); } else { cud.setUserData(USER_DATA_MULTIMODAL,linkUserData); } }
次のセグメントでは、分析中にユーザー定義データ(具体的にはリンクに関連付けられたルートID)を読み取る方法を示します。
//info is an instance of LODAnalysisInfo LogicalLink currentLink = info.getCurrentLink(); //Read the user-defined data (in this case, route ID) int linkRouteId = (Integer)currentLink.getCategorizedUserData(). getUserData(USER_DATA_MULTIMODAL). get(INDEX_LINK_ROUTEID); Implementation of MultimodalLinkUserData : class MultimodalLinkUserData implements UserData { private int routeId; protected MultimodalLinkUserData(int routeId) { this.routeId = routeId; } public Object get(int index) { switch(index) { case INDEX_LINK_ROUTEID: return routeId; } return null; } public void set(int index, Object userData) { switch(index) { case INDEX_LINK_ROUTEID: this.routeId = (Integer) userData; } } public int getNumberOfUserData() { return 1; } public Object clone() { return new MultimodalLinkUserData(routeId); } }
ネットワーク上の対象オブジェクトをフィーチャとしてモデル化できます。フィーチャは1つまたは複数のフィーチャ要素で構成されます。フィーチャ要素は、ネットワークに沿った点、リンクまたは部分リンクです。フィーチャ・レイヤーはネットワークの上に定義できます。たとえば、レストランとホテルをそれぞれ道路ネットワーク上のフィーチャ・レイヤーとして定義したり、スイッチを電気ネットワーク上のフィーチャ・レイヤーとして定義できます。
フィーチャ・モデリングを使用する一般的な手順は次のとおりです。
フィーチャ・レイヤーを作成します。
たとえば、道路ネットワーク上の対象点(POI)をフィーチャとしてモデル化できます。POIの各タイプ(ホテル、レストラン、病院、学校など)は、1つのフィーチャ・レイヤーに対応します。次の例では、ホテルのフィーチャ・レイヤーを追加します。
sdo_net.add_feature_layer( 'US_ROAD_NETWORK', --network name 'HOTEL', --feature layer name 2, --feature layer type: point on link 'HOTEL_TAB', --feature table or view name 'HOTEL_NET_REL', --relation table or view name null); --hierarchy table or view name
フィーチャ・ユーザー・データを登録します(アプリケーション固有のフィーチャ属性がフィーチャ分析で役立つ可能性がある場合)。
フィーチャ・ユーザー・データを登録するには、TABLE_TYPE列をフィーチャ表の名前に設定することを除き、ネットワークのノードまたはリンクのユーザー・データを登録する場合と同じように、XXX_SDO_NETWORK_USER_DATAビューにエントリを追加します。次の例では、ホテル名をホテル・フィーチャのユーザー・データとして追加します。
INSERT INTO USER_SDO_NETWORK_USER_DATA( network, table_type, data_name, data_type, category_id) VALUES( 'US_ROAD_NETWORK', --network name 'HOTEL_TAB', --feature table or view name 'NAME', --user data name, i.e., name of the user data column 'VARCHAR2', --user data type 3); --user data category
フィーチャ・レイヤーのフィーチャの追加、更新または削除を行います。
フィーチャ表、フィーチャ要素関係表およびフィーチャ階層表(すべて「フィーチャ・レイヤー表」を参照)またはこれらの表の組合せの内容は、データ・プロバイダにより管理されますので、この手順は省略できます。省略しない場合は、SDO_NETパッケージに含まれるプロシージャ(ADD_FEATURE、UPDATE_FEATURE、DELETE_FEATURESなど)をコールして、フィーチャ・レイヤー内のフィーチャの追加、更新または削除を行います。(SDO_NETサブプログラムについては、「SDO_NETパッケージ・サブプログラム」を参照してください。)
NetworkAnalyst
を使用してフィーチャ分析を実行します。フィーチャ分析ファンクションには、次のものがあります。
フィーチャ間の最短パス
最も近い(到達)フィーチャ
コスト範囲内の(到達)フィーチャ
この項では、フィーチャ・モデリングに関連する一部のSDO_NETパッケージ・サブプログラムのパラメータおよび戻り値に使用される、次のPL/SQLデータ型について説明します。
SDO_NET_FEAT_ELEM_ARRAY
SDO_NET_FEAT_ELEM
SDO_NET_LAYER_FEAT_ARRAY
SDO_NET_LAYER_FEAT
SDO_NETWORK_NVP_TAB
SDO_NETWORK_NVP
SDO_NET_FEAT_ELEM_ARRAYは、VARRAY(1024) OF MDSYS.SDO_NET_FEAT_ELEM
として定義されます。
SDO_NET_FEAT_ELEMは次のとおり定義されます。
FEAT_ELEM_TYPE NUMBER NET_ELEM_ID NUMBER START_PERCENTAGE NUMBER END_PERCENTAGE NUMBER
SDO_NET_LAYER_FEAT_ARRAYは、VARRAY(1024) OF MDSYS.SDO_NET_LAYER_FEAT
として定義されます。
SDO_NET_LAYER_FEATは次のとおり定義されます。
FEATURE_LAYER_ID NUMBER FEATURE_ID NUMBER
SDO_NETWORK_NVP_TABは、TABLE OF MDSYS.SDO_NETWORK_NVP
として定義されます。
SDO_NETWORK_NVPは次のとおり定義されます。
NAME VARCHAR2(128) VALUE VARCHAR2(1024)
ネットワーク制約は、ネットワーク分析の計算に対して定義される制限事項です。たとえば、道路ネットワークでは、一方通行や「左折禁止」標識などによる右/左折禁止リストがネットワーク制約になります。この場合、それぞれの右/左折禁止は、リンクの組合せ(開始リンクと、その開始リンクから右/左折できない終了リンクの組合せ)で表現されます。また、運転ルートに有料道路や高速道路を含めないという制限もネットワーク制約になります。
ネットワーク制約を作成するには、制約を実装するJavaクラスを作成し、SDO_NET.REGISTER_CONSTRAINTプロシージャを使用して制約を登録する必要があります。ネットワーク分析の操作にネットワーク制約を適用するには、その制約を指定する必要があります。
ネットワーク制約を実装するためのJavaクラスの例は、ネットワーク・データ・モデル・グラフのデモ・ファイルで示されます(「ネットワーク・データ・モデル・グラフのチュートリアルとその他のリソース」を参照)。たとえば、ProhibitedTurns.java
ファイルは、一連の右/左折禁止を定義するネットワーク制約を作成してから、2ノード間の最短パスを戻します(最初に制約を適用しない場合の最短パス、続いて制約を適用した場合の最短パスが戻ります)。
ロード・オンデマンドは、ネットワーク分析時に、ネットワークを探索している間に分析がこのパーティションに到達するまで、ネットワーク・パーティションがメモリーにロードされないということです。ロード・オンデマンドを使用すると、Oracle Spatial and Graphでは、ほとんどのパーティション化とロードの操作が自動的に実行され、これにより、通常は大規模なネットワークでのメモリーの使用効率を高めることができます。
ロード・オンデマンド分析には、次に説明する主要手順(ネットワークの作成、ネットワークのパーティション、パーティション・キャッシュの構成およびネットワーク分析)が含まれます。
「ネットワーク・データ・モデル・グラフを使用するための主な手順」で説明する方法の1つを使用して、ネットワークを作成します。
SDO_NET.SPATIAL_PARTITIONプロシージャを使用してネットワークをパーティション化します(「ネットワークのパーティション化」を参照)。
オプションで、パーティションBLOBを生成します(「パーティションBLOBの生成」を参照)。
パーティション・キャッシュを含む、ロード・オンデマンド環境を構成します(「パーティション・キャッシュの構成」を参照)。
ネットワークを分析します(「ネットワークの分析」を参照)。
注意:
また、ロード・オンデマンド分析は、ネットワーク全体を1つのパーティションとして扱うことによって、パーティション化されていないネットワークでも使用できます。小規模なネットワークでは、ネットワークをパーディション化してもメリットが得られない場合があるため、そのようなケースについてはパーティション化を省略してロード・オンデマンドAPIを使用することができます。
ロード・オンデマンドでのネットワーク分析の実行およびパーティション・キャッシュの構成の例については、「パーティション化とロード・オンデマンド分析の例(PL/SQL、XMLおよびJava)」を参照してください。
パーティション化とロード・オンデマンド分析のその他の例については、Oracle Database Examplesメディアに含まれています(『Oracle Database Examplesインストレーション・ガイド』を参照)。ネットワーク・データ・モデル・グラフの例およびデモ・ファイルの詳細は、「ネットワーク・データ・モデル・グラフのチュートリアルとその他のリソース」を参照してください。
ネットワークをパーティション化するには、SDO_NET.SPATIAL_PARTITIONプロシージャを使用して、各パーティション内のノードの最大数を指定します。パーティション結果は、自動的に生成されるパーティション表に格納され、パーティション・メタデータ情報がネットワーク・メタデータに挿入されます。(このプロシージャを使用するかわりに、パーティション表を作成および移入することによってネットワークをパーティション化することもできます。)他のSDO_NETサブプログラムを使用してパーティション・メタデータを問い合せることもできます。
パーティション化の方法としては、パーティション間のリンク数を最小限に抑える方法をお薦めします。この方法により、ロードする必要のあるパーティションの数および同じパーティションをリロードする必要がある推定回数を減らします。また、パーティションのサイズが小さすぎると、分析中のパーティションのロードおよびアンロードが多くなります。
メモリーを1GBと想定した場合に推奨されるパーティション当たりのノードの最大数は、5,000から10,000の間です。この数を調整して使用中のアプリケーションに最適な数であることを確認するには、使用可能なメモリー、分析のタイプおよびネットワークのサイズを考慮します。また、パーティション・キャッシュのサイズの構成も考慮する必要があります。
ネットワークのロードのパフォーマンスを向上させるために、オプションで、ネットワーク・パーティションBLOB表にBLOBとしてパーティションを格納できます。パーティションのロード時間の短縮というメリットを得るには、この情報をネットワーク・メタデータ・ビューに格納する必要があります。ネットワークまたはパーティションの情報が更新されると、パーティションBLOBも再生成する必要があることに注意してください。
パーティションBLOBは、ノード数、リンク数、各ノードのプロパティ、各リンクのプロパティなどのネットワーク・パーティション情報を含むデータのバイナリ・ストリームです。パーティションBLOBが存在する場合、Spatial and Graphでは、時間のかかるデータベース問合せを実行せずに、このBLOBを使用してロード操作中に情報を読み取ります。
パーティションBLOBを生成するには、SDO_NET.GENERATE_PARTITION_BLOBSプロシージャを使用します。パーティションBLOBおよびそのメタデータは、パーティションBLOB表に格納されます(「パーティションBLOB表」を参照)。
ネットワーク分析を実行する前に、XML構成ファイルを変更してデフォルトの構成をオーバーライドすることにより、パフォーマンスが最適化されるようにネットワーク・パーティション・キャッシュを構成できます。次のものを指定できます。
キャッシュ・サイズ: パーティション・キャッシュ内のノードの最大数。
パーティション・ソース: ネットワーク表またはパーティションBLOB。
常駐パーティション: キャッシュからフラッシュされることなく、一度ロードされるとメモリー内に保持されるパーティションのID。
キャッシュのフラッシュ方針: CachingHandler
の実装のクラス名。
デフォルトのキャッシュ方針はLeastRecentlyUsed
です。この方針では、キャッシュが一杯になると、メモリーから最も古いパーティションがフラッシュされます。他のキャッシュ方針を指定するには、CachingHandler
インタフェースを実装します。
デフォルトのロード・オンデマンド構成ファイルのコピーは補足のドキュメントに含まれています(「ネットワーク・データ・モデル・グラフのチュートリアルとその他のリソース」を参照)。
ネットワークの作成およびパーティション化を行い、オプションでパーティション・キャッシュを構成した後は、分析問合せを発行できます。分析結果は、JavaまたはXML APIのいずれを使用したかによって、Java表現またはXMLの応答で戻されます。詳細は、ロード・オンデマンド(LOD) JavadocおよびXMLスキーマを参照してください(後者は、「ネットワーク・データ・モデル・グラフのチュートリアルとその他のリソース」を参照)。
ロード・オンデマンドのJava APIを使用して分析結果をデータベースに書き込むこともできます。
ロード・オンデマンド方式を使用すると、大規模なネットワークを分析する場合のメモリー制限の影響は小さくなりますが、分析操作の速度が非常に遅いままであることがあります。たとえば、ネットワーク全体を斜めに横切る2つのノードの最短パスの分析では、ネットワーク内のほとんどすべてのリンクを走査することになる可能性があります。そのため、ネットワークに200万個を超えるノードがある場合などは、非常に長い時間がかかります。
ネットワークの分析にかかる時間をさらに短縮するには、異なるリンク・レベルで分析を実行します。リンク・レベルとは、リンクの優先順位のレベルを示す、リンクに割り当てられた正の整数のことです。リンク・レベルが高いほど、優先順位が高くなります。たとえば、道路ネットワークの場合は、2つのリンク・レベル(一般道路に対してはレベル1、高速道路に対してはレベル2)で構成することができます。ネットワーク分析中は、高速道路が一般道路より優先され、最低リンク・レベルが1になります。(リンク・レベルが割り当てられていないリンクには、デフォルトのリンク・レベル1が使用されます。)
リンク・レベルには暗黙的な継承プロパティが含まれています。これは、リンク・レベルの高いネットワークが、リンク・レベルの低いネットワークのサブネットワークとなる必要があるということです。つまり、リンク・レベル2はリンク・レベル1のサブネットワークで、リンク・レベル3はリンク・レベル2のサブネットワークなどのように設定されます。
リンク・レベルはネットワークまたはパーティションのロード時に指定できます。これにより、そのレベルと、そのレベルより高いレベルのリンクがロードされます。一般道路に対してレベル1、および高速道路に対してレベル2が割り当てられている道路ネットワークの例では、ロード操作でリンク・レベル1を指定するとレベルが1および2のリンク(つまり一般道路と高速道路)がロードされますが、ロード操作でリンク・レベル2を指定すると、高速道路のリンクのみがロードされます。高速道路のリンクのみを使用して分析を実行する場合は、ロード操作に対してリンク・レベル2を指定してパフォーマンスを最適化できます。
接続されているコンポーネントの分析などの一部の分析操作には、時間がかかる場合があります。実行時パフォーマンスを向上するには、SDO_NET.FIND_CONNECTED_COMPONENTSプロシージャをコールできます。このプロシージャは、ネットワークの接続されているコンポーネントを計算し、結果を接続されているコンポーネントの表に格納します(「接続されているコンポーネントの表」を参照)。
実行時には、最短パスの分析または到達可能性の分析をコールする前に、接続されているコンポーネント表を問い合せて、対象ノードが同じ接続されているコンポーネントに属しているかどうかを確認できます。計算済のコンポーネント情報が存在しない場合は、最短パスおよび到達可能性の分析で、2つのノードが実際には接続されていないことを検出するまでに長い時間がかかる場合があります。
空間ネットワークの接続性情報は、ノード表およびリンク表の2つの表に格納されます。さらに、パス情報を、パス表およびパスリンク表に格納できます。これらの表は、CREATE_<network-type>_NETWORKプロシージャを使用してネットワークを作成するときに、自動的に作成することができ、また、SDO_NET.CREATE_NODE_TABLE、SDO_NET.CREATE_LINK_TABLE、SDO_NET.CREATE_PATH_TABLEおよびSDO_NET.CREATE_PATH_LINK_TABLEの各プロシージャを使用して作成することもできます。
これらの表には、事前定義の名前を持つ列が含まれます。事前定義の列名は変更できません。ただし、ADD COLUMN句を指定してALTER TABLE文を実行することによって、表に列を追加できます。たとえば、各リンク表およびパス表は1つのCOST列を持つように作成されますが、追加の列を作成し、それらの列をその他の比較可能な属性に関連付けることができます。したがって、各リンクに運転時間、景色のよさ、および危険度を割り当てるには、運転時間にCOST列を使用し、SCENIC_APPEAL列およびDANGER列をリンク表に追加して、アプリケーションによって解釈される値を3つの列すべてに移入します。
次の考慮事項は、スキーマ、表、および任意のOracle Spatial and Graphメタデータ・ビューに格納されている列名に適用されます。たとえば、考慮事項は、ノード、リンク、パスおよびパスリンク表の名前、および「ネットワーク・データ・モデル・グラフのメタデータ・ビュー」で説明しているネットワーク・メタデータ・ビューに格納されているこれらの表の列名に適用されます。
名前には、文字、数字、下線のみが使用できます。たとえば、名前に空白(
)、アポストロフィ('
)、引用符("
)またはカンマ(,
)を使用することはできません。
名前の中の文字はすべて、名前がメタデータ・ビューに格納される前または表がアクセスされる前に大文字に変換されます。表名で指定されるすべてのスキーマ名も、同様に変換されます。
この項のメタデータ表は、フィーチャ・モデリングには関連していません。
各ネットワークには、表5-3で説明する列が含まれるノード表があります。(含まれる列は、ネットワークのタイプ、およびネットワークが階層であるかどうかによって異なります。)
表5-3 ノード表の列
列名 | データ型 | 説明 |
---|---|---|
NODE_ID |
NUMBER |
ネットワーク内でこのノードを一意に識別するID番号です。 |
NODE_NAME |
VARCHAR2(32) |
ノード名です。 |
NODE_TYPE |
VARCHAR2(24) |
ノードのタイプを識別するユーザー定義の文字列です。 |
VARCHAR2(1) |
ノードがアクティブである(ネットワークで認識されている)場合は |
|
PARTITION_ID |
NUMBER |
(使用されていません。かわりに、ノードとパーティションの関係がパーティション表に格納されます(「パーティション表」を参照。)) |
<node_geometry_column>、またはGEOM_IDおよびMEASURE |
SDO_GEOMETRY、SDO_TOPO_GEOMETRYまたはNUMBER |
空間(SDO、非LRS)ネットワークの場合、ノードに関連付けられたSDO_GEOMETRYオブジェクトです。 空間トポロジ・ネットワークの場合、ノードに関連付けられたSDO_TOPO_GEOMETRYオブジェクトです。 空間LRSネットワークの場合、ノードに関連付けられたジオメトリ・オブジェクトのGEOM_ID列およびMEASURE列の値(いずれもNUMBER型)です。 論理ネットワークの場合、この列は使用しません。 空間SDOネットワークまたはトポロジ・ネットワークの場合、実際の列名は、デフォルト名、またはSDO_NET.CREATE_NODE_TABLEプロシージャのコール時に |
<node_cost_column> |
NUMBER |
ノードに関連付けられるコスト値で、ネットワークを使用するアプリケーションによって使用されます。実際の列名は、デフォルト名、またはSDO_NET.CREATE_NODE_TABLEプロシージャのコール時に |
HIERARCHY_LEVEL |
NUMBER |
階層ネットワークでのみ使用されます。このノードのネットワーク階層でのレベルを示す数値です。(「ネットワークの階層」では、ネットワークの階層を説明します。) |
PARENT_NODE_ID |
NUMBER |
階層ネットワークでのみ使用されます。このノードの親ノードのノードIDです。(「ネットワークの階層」では、ネットワークの階層を説明します。) |
各ネットワークには、表5-4で説明する列が含まれるリンク表があります。
表5-4 リンク表の列
列名 | データ型 | 説明 |
---|---|---|
LINK_ID |
NUMBER |
ネットワーク内でこのリンクを一意に識別するID番号です。 |
LINK_NAME |
VARCHAR2(32) |
リンク名です。 |
START_NODE_ID |
NUMBER |
リンクの開始ノードのノードIDです。 |
END_NODE_ID |
NUMBER |
リンクの終了ノードのノードIDです。 |
LINK_TYPE |
VARCHAR2(24) |
リンクのタイプを識別するユーザー定義の文字列です。 |
VARCHAR2(1) |
リンクがアクティブである(ネットワークで認識されている)場合は |
|
LINK_LEVEL |
NUMBER |
リンクの優先順位です。ネットワーク分析に使用すると、パスの計算時に優先順位の高いリンクが最初に考慮されます。 |
<link_geometry_column>、またはGEOM_ID、START_MEASUREおよびEND_MEASURE |
SDO_GEOMETRY、SDO_TOPO_GEOMETRYまたはNUMBER |
空間(SDO、非LRS)ネットワークの場合、リンクに関連付けられたSDO_GEOMETRYオブジェクトです。 空間トポロジ・ネットワークの場合、リンクに関連付けられたSDO_TOPO_GEOMETRYオブジェクトです。 空間LRSネットワークの場合、リンクに関連付けられたジオメトリ・オブジェクトのGEOM_ID列、START_MEASURE列およびEND_MEASURE列の値(すべてNUMBER型)です。 論理ネットワークの場合、この列は使用しません。 空間SDOネットワークまたはトポロジ・ネットワークの場合、実際の列名は、デフォルト名、またはSDO_NET.CREATE_LINK_TABLEプロシージャのコール時に |
<link_cost_column> |
NUMBER |
リンクに関連付けられるコスト値で、ネットワークを使用するアプリケーションによって使用されます。実際の列名は、デフォルト名、またはSDO_NET.CREATE_LINK_TABLEプロシージャのコール時に |
PARENT_LINK_ID |
NUMBER |
階層ネットワークでのみ使用されます。このリンクの親リンクのリンクIDです。(「ネットワークの階層」では、ネットワークの階層の親子関係を説明します。) |
BIDIRECTED |
VARCHAR2(1) |
有向ネットワークの場合のみ使用されます。リンクが無向(開始ノードから終了ノード、終了ノードから開始ノードのどちらの方向にも進むことが可能)の場合は |
各ネットワークにパス表を作成できます。パスは、リンクを順につなげたもので、通常、ネットワーク分析の結果として作成されます。パス表は、この分析の結果を格納する方法を提供します。各パス表について、関連パスリンク表を作成する必要があります(「パスリンク表」を参照)。各パス表には、表5-5で説明する列が含まれます。
表5-5 パス表の列
列名 | データ型 | 説明 |
---|---|---|
PATH_ID |
NUMBER |
ネットワーク内でこのパスを一意に識別するID番号です。 |
PATH_NAME |
VARCHAR2(32) |
パス名です。 |
PATH_TYPE |
VARCHAR2(24) |
パスのタイプを識別するユーザー定義の文字列です。 |
START_NODE_ID |
NUMBER |
パスの最初のリンクを開始するノードのノードIDです。 |
END_NODE_ID |
NUMBER |
パスの最後のリンクを終了するノードのノードIDです。 |
COST |
NUMBER |
パスに関連付けられるコスト値で、ネットワークを使用するアプリケーションによって使用されます。コスト値は、パスの推定運転時間など、必要な任意の値を表すことができます。 |
SIMPLE |
VARCHAR2(1) |
単純なパスの場合は |
<path_geometry_column> |
SDO_GEOMETRY |
論理ネットワークを除くすべてのネットワーク・タイプの場合、パスに関連付けられたジオメトリ・オブジェクトです。実際の列名は、デフォルト名、またはSDO_NET.CREATE_PATH_TABLEプロシージャのコール時に 論理ネットワークの場合、この列は使用しません。 |
各パス表(「パスリンク表」を参照)について、パスリンク表を作成する必要があります。パスリンク表の各行は、ネットワークのパス内でリンクを一意に識別します。つまり、PATH_ID、LINK_IDおよびSEQ_NOの値の組合せが、ネットワーク内で一意である必要があります。パスリンク表での行の順序は、重要ではありません。各パスリンク表には、表5-6で説明する列が含まれます。
表5-6 パスリンク表の列
列名 | データ型 | 説明 |
---|---|---|
PATH_ID |
NUMBER |
ネットワークのパスのID番号です。 |
LINK_ID |
NUMBER |
ネットワークのリンクのID番号です。 |
SEQ_NO |
NUMBER |
パスでのリンクの一意の順序番号です。(順序番号は、1から始まります。)順序番号を使用すると、同じノードおよびリンクをパスに繰り返し含めることができます。 |
各パスには、1つ以上の対応するサブパスを作成できます。ネットワーク内のすべてのサブパスに関する情報は、サブパス表に格納されます。サブパスは、パスに沿った部分的なパスです(「ネットワーク・データ・モデル・グラフの概念」を参照)。サブパス表には、表5-7で説明する列が含まれます。
表5-7 サブパス表の列
列名 | データ型 | 説明 |
---|---|---|
SUBPATH_ID |
NUMBER |
このサブパスを参照パス内で一意に識別するID番号です。 |
SUBPATH_NAME |
VARCHAR2(32) |
サブパス名です。 |
SUBPATH_TYPE |
VARCHAR2(24) |
サブパスのタイプを識別するユーザー定義の文字列です。 |
REFERENCE_PATH_ID |
NUMBER |
このサブパスを含むパスのパスID番号です。 |
START_LINK_INDEX |
NUMBER |
サブパスの開始を定義するために使用するリンクのリンクIDです。たとえば、「ネットワーク・データ・モデル・グラフの概念」の図5-2では、START_LINK_INDEXは0で、START_PERCENTAGEは0.65です。 |
END_LINK_INDEX |
NUMBER |
サブパスの終了を定義するために使用するリンクのリンクIDです。たとえば、「ネットワーク・データ・モデル・グラフの概念」の図5-2では、END_LINK_INDEXは6で、END_PERCENTAGEは0.5です。 |
START_PERCENTAGE |
NUMBER |
パスのSTART_LINK_INDEXとその次のリンクの間の距離の割合で、サブパスの開始点を表します。正の数値または負の数値となります。たとえば、「ネットワーク・データ・モデル・グラフの概念」の図5-2では、START_LINK_INDEXは0で、START_PERCENTAGEは0.65です。(この場合の割合の値は0から1.0の範囲で表されるので、0.65は65パーセントです。) |
END_PERCENTAGE |
NUMBER |
パスのEND_LINK_INDEXとその次のリンクの間の距離の割合で、サブパスの終了点を表します。正の数値または負の数値となります。たとえば、「ネットワーク・データ・モデル・グラフの概念」の図5-2では、END_LINK_INDEXは6で、END_PERCENTAGEは0.5です。(この場合の割合の値は0から1.0の範囲で表されるので、0.5は50パーセントです。) |
COST |
NUMBER |
サブパスに関連付けられるコスト値で、ネットワークを使用するアプリケーションによって使用されます。コスト値は、パスの推定運転時間など、必要な任意の値を表すことができます。 |
GEOM |
SDO_GEOMETRY |
論理ネットワークを除くすべてのネットワーク・タイプの場合、サブパスに関連付けられたジオメトリ・オブジェクトです。実際の列名は、デフォルト名、またはSDO_NET.CREATE_SUBPATH_TABLEプロシージャのコール時に 論理ネットワークの場合、この列は使用しません。 |
パーティション化された各ネットワークには、パーティション表があります。パーティション化されたネットワークの詳細は、「ロード・オンデマンドを使用したネットワーク分析」を参照してください。各パーティション表には、表5-8で説明する列が含まれます。
表5-8 パーティション表の列
列名 | データ型 | 説明 |
---|---|---|
NODE_ID |
NUMBER |
ノードのID番号です。 |
PARTITION_ID |
NUMBER |
パーティションのID番号です。ネットワーク内で一意である必要があります。 |
LINK_LEVEL |
NUMBER |
リンク・レベルです(リンク・レベルは、リンクの優先順位です。ネットワーク分析に使用すると、パスの計算時に優先順位の高いリンクが最初に考慮されます)。 |
パーティション化された各ネットワークには、パーティションBLOB表があります。この表には、ネットワークのリンク・レベルとパーティションIDの組合せごとのバイナリ・ラージ・オブジェクト(BLOB)表現が格納されます。パーティションのBLOB表現を使用すると、ネットワークのロード・オンデマンド分析操作でパフォーマンスが向上します。パーティションBLOB表を作成するには、SDO_NET.GENERATE_PARTITION_BLOBSプロシージャを使用します。このプロシージャでは、パーティションBLOB表の名前をパラメータの1つとして指定します。パーティション化されたネットワークの詳細は、「ロード・オンデマンドを使用したネットワーク分析」を参照してください。
注意:
パーティションBLOB表を直接変更することはできません。この表は、SDO_NET.GENERATE_PARTITION_BLOBSプロシージャおよびSDO_NET.GENERATE_PARTITION_BLOBプロシージャへのコールの結果として自動的に更新されます。
各パーティション表には、表5-9で説明する列が含まれます。
表5-9 パーティションBLOB表の列
列名 | データ型 | 説明 |
---|---|---|
LINK_LEVEL |
VARCHAR2(32) |
リンク・レベルです(リンク・レベルは、リンクの優先順位です。ネットワーク分析に使用すると、パスの計算時に優先順位の高いリンクが最初に考慮されます)。 |
PARTITION_ID |
NUMBER |
パーティションのID番号です。 |
BLOB |
BLOB |
指定したパーティション内の指定したリンク・レベルを表すバイナリ・ラージ・オブジェクト(BLOB)です。 |
NUM_INODES |
NUMBER |
BLOBの内部ノード数(BLOB内の合計ノード数)です。 |
NUM_ENODES |
NUMBER |
外部ノードの数です。外部ノードとは、BLOB外にあるノードで、このノードが一端を構成するリンクのもう一端のノードがBLOB内にあるものを指します。 |
NUM_ILINKS |
NUMBER |
BLOBの内部リンク(完全にBLOB内にあるリンク)の数です。 |
NUM_ELINKS |
NUMBER |
外部リンクの数です。外部リンクとは、1つのノードが内部(BLOB内)で、1つのノードが外部(BLOB外)となっているリンクです。 |
NUM_INLINKS |
NUMBER |
外部からのリンクの数です。外部からのリンクとは、開始ノードがBLOB外にあり、終了ノードがBLOB内にある外部リンクです。 |
NUM_OUTLINKS |
NUMBER |
外部へのリンクの数です。外部へのリンクとは、開始ノードがBLOB内にあり、終了ノードがBLOB外にある外部リンクです。 |
USER_DATA_INCLUDED |
VARCHAR2(1) |
BLOBにユーザー・データを含めることができる場合は |
各ネットワークには、接続されているコンポーネント表を作成できます。この表には各ノードのコンポーネントIDが格納されます。同じ接続されているコンポーネントのノードは、同じコンポーネントIDを持ちます。この情報が表に格納されていると、ネットワーク分析の多くの操作でパフォーマンスが向上します。接続されているコンポーネント表を作成し、後から表の内容を更新するには、SDO_NET.FIND_CONNECTED_COMPONENTSプロシージャを使用します。このプロシージャでは、接続されているコンポーネント表の名前をパラメータの1つとして指定します。接続されているコンポーネントに関する計算済情報の使用の詳細は、「計算済分析結果」を参照してください。
各接続されているコンポーネント表には、表5-10で説明する列が含まれます。
表5-10 接続されているコンポーネント表の列
列名 | データ型 | 説明 |
---|---|---|
LINK_LEVEL |
NUMBER |
コンポーネントの割当てのリンク・レベルです。(リンク・レベルは、リンクの優先順位です。ネットワーク分析に使用すると、パスの計算時に優先順位の高いリンクが最初に考慮されます。) |
NODE_ID |
NUMBER |
到達可能なその他すべてのコンポーネントの算出元となるノードのID番号です。 |
COMPONENT_ID |
NUMBER |
指定したノードから到達可能なコンポーネントのID番号です。 |
各ネットワークにノード階層表を持つことができ、この表には、ネットワークに階層がある場合には親子関係が格納されます(「ネットワークの階層」を参照)。
ノード階層表が存在する場合、この表には表5-11で説明する列が含まれます。
表5-11 ノード階層表の列
列名 | データ型 | 説明 |
---|---|---|
PARENT_ID |
NUMBER |
親ノードID (親ネットワーク内のノードID、あるいは子ネットワーク内のグループID、クラスタIDまたはパーティションID)です。 |
CHILD_ID |
NUMBER |
子ID (子ネットワーク内のノードID)です。 |
LINK_LEVEL |
NUMBER |
親子関係が定義されるリンク・レベルです。リンク・レベルの高いネットワークは、リンク・レベルの低いネットワークのサブネットワークとなります。リンク・レベルnのネットワークは、nより大きいか等しいリンク・レベルを持つリンクのみで構成されます。 |
各ネットワークに、各上位レベル・ノード(最大リンク・レベルが1より大きいノード)の最大リンク・レベルに関する情報を格納するノード・レベル表を作成できます。ノード・レベル表は、マルチレベル・ネットワークでのみ役立ち、この表を使用すると、ノード表とリンク表からのパーティションのロード時間を短縮できます。
ノード・レベル表が存在する場合、この表には表5-12で説明する列が含まれます。
表5-12 ノード・レベル表の列
列名 | データ型 | 説明 |
---|---|---|
NODE_ID |
NUMBER |
最大リンク・レベルが1より大きいノードのIDです。 |
LINK_LEVEL |
NUMBER |
ノードが接続されている最大リンク・レベルです。 |
この項の表は、フィーチャ・モデリングに関連しています(「フィーチャ・モデリング」を参照)。これらの表は、登録された各フィーチャ・レイヤーを説明するために使用されます。
ほとんどのアプリケーションには、フィーチャ・エンティティ情報、フィーチャとネットワークの関係またはフィーチャ階層関係を含む表がすでに存在していますが、これらの表のスキーマがNDM表のスキーマと異なる場合があります。このような場合は、既存の表のスキーマをNDM表のスキーマにマップするビューを作成できます。
フィーチャ表には、フィーチャ・エンティティ情報が含まれます。各フィーチャ表には、FEATURE_ID列が含まれている必要があります。フィーチャ分析で役立つ可能性があるその他のフィーチャ属性は、ユーザー・データとして登録できます。
各フィーチャ表には、表5-13で説明する列が含まれます。
表5-13 フィーチャ表の列
列名 | データ型 | 説明 |
---|---|---|
FEATURE_ID |
NUMBER |
フィーチャのIDです。 |
(必要に応じた追加の列) |
(必要に応じて) |
(フィーチャ分析で役立つ可能性があるその他のフィーチャ属性) |
フィーチャ要素関係表には、フィーチャ要素とネットワーク要素(ノードとリンク)間の関係に関する情報が含まれます。
フィーチャ要素関係表には、表5-14で説明する列が含まれます。
表5-14 フィーチャ要素関係表の列
列名 | データ型 | 説明 |
---|---|---|
FEATURE_ID |
NUMBER |
フィーチャのIDです。 |
FEAT_ELEM_TYPE |
NUMBER |
フィーチャ要素タイプです。次のいずれかです: 1 (SDO_NET.FEAT_ELEM_TYPE_PON (ノード上の点))、2 (SDO_NET.FEAT_ELEM_TYPE_POL (リンク上の点))、3 (SDO_NET.FEAT_ELEM_TYPE_LINE (線))。 |
NET_ELEM_ID |
NUMBER |
このフィーチャ要素に関連付けられているネットワーク要素(ノードまたはリンク)のIDです。 |
START_PERCENTAGE |
NUMBER |
このフィーチャ要素のNET_ELEM_IDに沿った開始の割合です(ノード上の点であるフィーチャ要素に対しては無視されます)。 |
END_PERCENTAGE |
NUMBER |
このフィーチャ要素のNET_ELEM_IDに沿った終了の割合です(ノード上の点および線上の点であるフィーチャ要素に対しては無視されます)。 |
SEQUENCE |
NUMBER |
フィーチャ要素の順序番号です。 |
フィーチャ階層表には、フィーチャ階層情報が含まれます。子フィーチャは異なるフィーチャ・レイヤーに属することができます。
フィーチャ階層表には、表5-15で説明する列が含まれます。
表5-15 フィーチャ階層表の列
列名 | データ型 | 説明 |
---|---|---|
PARENT_ID |
NUMBER |
親フィーチャのIDです。 |
CHILD_LAYER_ID |
NUMBER |
子フィーチャのフィーチャ・レイヤーIDです。 |
CHILD_ID |
NUMBER |
子フィーチャのIDです。 |
SEQUENCE |
NUMBER |
子フィーチャの順序番号です。 |
スキーマ(ユーザー)ごとに、xxx_SDO_NETWORK_METADATAという一連のネットワーク・メタデータ・ビューがあります。xxxは、USERまたはALLです。これらのビューは、Spatial and Graphによって作成されます。
次のビューには、ネットワークに関する情報が含まれます。
USER_SDO_NETWORK_METADATAには、ユーザーが所有するすべてのネットワークに関する情報が含まれます。
ALL_SDO_NETWORK_METADATAには、ユーザーがSELECT権限を持つすべてのネットワークに関する情報が含まれます。
CREATE_<network-type>_NETWORKプロシージャの1つを使用してネットワークを作成すると、これらのビューの情報が、新しいネットワークを反映するように自動的に更新されます。このプロシージャを使用してネットワークを作成しない場合、ネットワークに関する情報をUSER_SDO_NETWORK_METADATAビューに挿入する必要があります。
USER_SDO_NETWORK_METADATAビューとALL_SDO_NETWORK_METADATAビューのどちらにも表5-16に示す列が含まれますが、USER_SDO_NETWORK_METADATAビューにはOWNER列は含まれません。列をビュー定義の順に示します。
表5-16 xxx_SDO_NETWORK_METADATAビューの列
列名 | データ型 | 目的 |
---|---|---|
OWNER |
VARCHAR2(32) |
ネットワークの所有者です(ALL_SDO_NETWORK_METADATAビューのみ)。 |
NETWORK |
VARCHAR2(24) |
ネットワーク名です。 |
NETWORK_ID |
NUMBER |
ネットワークのID番号です(Spatial and Graphによって割り当てられます)。 |
NETWORK_CATEGORY |
VARCHAR2(12) |
ネットワークのノードおよびリンクが空間ジオメトリに関連付けられている場合は |
GEOMETRY_TYPE |
VARCHAR2(24) |
|
NETWORK_TYPE |
VARCHAR2(24) |
ネットワークのタイプを識別するユーザー定義の文字列です。 |
NO_OF_HIERARCHY_LEVELS |
NUMBER |
ネットワーク階層のレベルの数です。階層がない場合は1が含まれます。(ネットワークの階層については、「ネットワークの階層」を参照してください。) |
NO_OF_PARTITIONS |
NUMBER |
(現在は使用されていません) |
LRS_TABLE_NAME |
VARCHAR2(32) |
|
LRS_GEOM_COLUMN |
VARCHAR2(32) |
|
NODE_TABLE_NAME |
VARCHAR2(32) |
|
NODE_GEOM_COLUMN |
VARCHAR2(32) |
|
VARCHAR2(1024) |
|
|
NODE_PARTITION_COLUMN |
VARCHAR2(32) |
(現在は使用されていません)。 |
VARCHAR2(32) |
|
|
LINK_TABLE_NAME |
VARCHAR2(32) |
|
LINK_GEOM_COLUMN |
VARCHAR2(32) |
|
LINK_DIRECTION |
VARCHAR2(12) |
ネットワークのすべてのリンクのタイプを示す値です。 |
VARCHAR2(1024) |
|
|
LINK_PARTITION_COLUMN |
VARCHAR2(32) |
(現在は使用されていません) |
VARCHAR2(32) |
|
|
PATH_TABLE_NAME |
VARCHAR2(32) |
パスに関する情報が含まれるオプションの表の名前です。(パス表については、「パス表」を参照してください。) |
PATH_GEOM_COLUMN |
VARCHAR2(32) |
|
PATH_LINK_TABLE_NAME |
VARCHAR2(32) |
各パスのリンクに関する情報が含まれるオプションの表の名前です。(パスリンク表については、「パスリンク表」を参照してください。) |
SUBPATH_TABLE_NAME |
VARCHAR2(32) |
サブパスに関する情報が含まれるオプションの表の名前です。(サブパス表については、「サブパス表」を参照してください。) |
SUBPATH_GEOM_COLUMN |
VARCHAR2(32) |
|
PARTITION_TABLE_NAME |
VARCHAR2(32) |
パーティション化されたネットワークの場合: パーティション表の名前です。(パーティション表については、「パーティション表」を参照してください。) |
PARTITION_BLOB_TABLE_NAME |
VARCHAR2(32) |
パーティションBLOBが生成されているパーティション化されたネットワークの場合: パーティションBLOB表の名前です。(パーティションBLOB表については、「パーティションBLOB表」を参照してください。) |
COMPONENT_TABLE_NAME |
VARCHAR2(32) |
計算済の接続されているコンポーネント(「計算済分析結果」を参照)に関する情報を含む表の名前です。(接続されているコンポーネント表については、「接続されているコンポーネント表」を参照してください。) |
NODE_LEVEL_TABLE_NAME |
VARCHAR2(32) |
マルチレベル・ネットワークのノード・レベルに関する情報を含む表の名前です。この表は、SDO_NET.GENERATE_NODE_LEVELSプロシージャで |
TOPOLOGY |
VARCHAR2(32) |
(SDO_NET.CREATE_TOPO_NETWORKプロシージャで作成した)SDO_TOPO_GEOMETRYオブジェクトが含まれる空間ネットワークの場合、トポロジの名前です。 |
USER_DEFINED_DATA |
VARCHAR2(1) |
ネットワークにユーザー定義データが含まれる場合はY、ネットワークにユーザー定義のデータが含まれない場合はNです。 |
EXTERNAL_REFERENCES |
VARCHAR2(1) |
(現在は使用されていません) |
CHILD_NETWORK |
VARCHAR2(32) |
子ネットワークの名前です(ネットワーク階層が関係している場合)。 |
HIERARCHY_TABLE_NAME |
VARCHAR2(32) |
階層表の名前です(ネットワーク階層が関係している場合)。 |
次のビューには、ネットワーク制約(「ネットワーク制約」を参照)に関する情報が含まれます。
USER_SDO_NETWORK_CONSTRAINTSには、ユーザーが所有するすべてのネットワーク制約に関する情報が含まれます。
ALL_SDO_NETWORK_CONSTRAINTSには、ユーザーがSELECT権限を持つすべてのネットワーク制約に関する情報が含まれます。
これらのビューは、SDO_NET.REGISTER_CONSTRAINTプロシージャおよびSDO_NET.DEREGISTER_CONSTRAINTプロシージャによって自動的に保持されます。これらのビューの内容を直接変更することはできません。
USER_SDO_NETWORK_CONSTRAINTSビューとALL_SDO_NETWORK_CONSTRAINTSビューのどちらにも表5-17に示す列が含まれますが、USER_SDO_NETWORK_CONSTRAINTSビューにはOWNER列は含まれません。列をビュー定義の順に示します。
表5-17 xxx_SDO_NETWORK_CONSTRAINTSビューの列
列名 | データ型 | 目的 |
---|---|---|
OWNER |
VARCHAR2(32) |
ネットワーク制約の所有者です(ALL_SDO_NETWORK_CONSTRAINTSビューのみ)。 |
CONSTRAINT |
VARCHAR2(32) |
ネットワーク制約の名前です。 |
DESCRIPTION |
VARCHAR2(200) |
ネットワーク制約に関する説明(目的、使用上の注意など)です。 |
CLASS_NAME |
VARCHAR2(4000) |
ネットワーク制約を実装するJavaクラスの名前です。 |
CLASS |
BINARY FILE LOB |
ネットワーク制約を実装するJavaクラスです。 |
次のビューには、ネットワークのユーザー定義データに関する情報が含まれます。これは、ユーザーがネットワーク表現と関連付ける(接続性とは関係のない)情報です。
USER_SDO_NETWORK_USER_DATAには、ユーザーが所有するすべてのネットワークのユーザー定義データに関する情報が含まれます。
ALL_SDO_NETWORK_USER_DATAには、ユーザーがSELECT権限を持つすべてのネットワークのユーザー定義データに関する情報が含まれます。
USER_SDO_NETWORK_USER_DATAビューとALL_SDO_NETWORK_USER_DATAビューのどちらにも表5-17に示す列が含まれますが、USER_SDO_NETWORK_USER_DATAビューにはOWNER列は含まれません。列をビュー定義の順に示します。
表5-18 xxx_SDO_NETWORK_USER_DATAビューの列
列名 | データ型 | 目的 |
---|---|---|
OWNER |
VARCHAR2(32) |
ネットワーク制約の所有者です(ALL_SDO_NETWORK_USER_DATAビューのみ)。 |
NETWORK |
VARCHAR2(32) |
ネットワーク名です。 |
TABLE_TYPE |
VARCHAR2(12) |
ユーザー定義データを含む表のタイプ: xxx_SDO_USER_NETWORK_USER_DATAビューを介してフィーチャ・ユーザー・データが登録されている場合、TABLE_TYPEはフィーチャ表の名前に設定されます。 |
DATA_NAME |
VARCHAR2(32) |
ユーザー定義データを含む列の名前です。 |
DATA_TYPE |
VARCHAR2(12) |
ユーザー定義データのデータ型: |
DATA_LENGTH |
NUMBER(38) |
DATA_TYPEが |
CATEGORY_ID |
NUMBER |
ユーザー・データ・カテゴリID (負でない数値、デフォルト値は0)です。カテゴリIDを使用すると、アプリケーションごとにユーザー・データをグループ化できます。カテゴリ0は、すべてのアプリケーションに有効な汎用ユーザー・データに使用するために予約されています。ユーザー・データを目的ごとに異なるカテゴリにグループ化できますので、ネットワーク分析中は、関連するユーザー・データ・カテゴリのみがメモリーにロードされ、実行時のメモリー使用量が削減されます。 たとえば、道路ネットワークの場合、カテゴリ0のユーザー・データには、リンクの制限速度およびファンクション・クラスと、ノードの(x, y)座標を含めることができ、トラック輸送関連のユーザー・データをカテゴリ1に、またトラフィック関連のユーザー・データをカテゴリ2に含めることができます。 |
ユーザー定義データを使用するには、該当するxxx_SDO_NETWORK_METADATAビュー(「xxx_SDO_NETWORK_METADATAビュー」を参照)のUSER_DEFINED_DATA列の値にY
を設定する必要があります。
ユーザー定義データの使用例については、「ユーザー定義データの例(PL/SQLおよびJava)」を参照してください。
xxx_SDO_NETWORK_USER_DATAビューを介して定義されたユーザー・データについては、ネットワーク分析中にユーザー・データにアクセスする場合、デフォルトのユーザー・データI/O実装(LODUserDataIOSDO
)が使用されます。ただし、一部のユーザー・データは、ノード表またはリンク表に含まれていないため、xxx_SDO_NETWORK_USER_DATAビューを介して登録できません。このようなユーザー・データについては、ユーザー・データI/Oインタフェースの独自の実装を提供する必要があります。カスタムのユーザー・データI/Oインタフェースを実装する一般的な方法は、ノードおよびリンクのユーザー・データに対応したBLOB (各パーティションごとに1つのBLOB)を生成し、次にネットワーク分析中にBLOBからユーザー・データ情報を取得することです。
ユーザー定義データ(カテゴリ分けされたユーザー・データ)の複数のカテゴリを単一のネットワークに関連付けることもできます。たとえば、マルチモーダル・ネットワーク(「マルチモーダル・ネットワークと時間の例」を参照)では、リンクのマルチモーダル属性の他に、運転に関連する属性(制限速度など)をリンクに関連付ける必要がある場合、ユーザー定義データを2つのカテゴリ(1つは運転に関連する属性用で、もう1つはマルチモーダル属性用)に整理できます。
次のビューには、ネットワーク・フィーチャ・レイヤー(「フィーチャおよびフィーチャ・レイヤー」を参照)に関する情報が含まれます。
USER_SDO_NETWORK_FEATUREには、ユーザーが所有するすべてのネットワーク・フィーチャ・レイヤーに関する情報が含まれます。
ALL_SDO_NETWORK_FEATUREには、ユーザーがSELECT権限を持つすべてのネットワーク・フィーチャ・レイヤーに関する情報が含まれます。
USER_SDO_NETWORK_FEATUREビューとALL_SDO_NETWORK_FEATUREビューのどちらにも表5-17に示す列が含まれますが、USER_SDO_NETWORK_FEATUREビューにはOWNER列は含まれません。列をビュー定義の順に示します。
表5-19 xxx_SDO_NETWORK_FEATUREビューの列
列名 | データ型 | 目的 |
---|---|---|
OWNER |
VARCHAR2(32) |
ネットワーク・フィーチャ・レイヤーの所有者です(ALL_SDO_NETWORK_FEATUREビューのみ)。 |
NETWORK |
VARCHAR2(32) |
フィーチャ・レイヤーが定義されているネットワークの名前です。 |
FEATURE_LAYER_NAME |
VARCHAR2(32) |
フィーチャ・レイヤーの名前です。 |
FEATURE_LAYER_ID |
NUMBER |
フィーチャ・レイヤーのIDです(Oracle Spatial and Graphによって割り当てられます)。 |
FEATURE_LAYER_TYPE |
NUMBER |
フィーチャ・レイヤーのタイプです(「フィーチャおよびフィーチャ・レイヤー」の表 5-2を参照) |
FEATURE_TABLE_NAME |
VARCHAR2(32) |
フィーチャ表の名前です(「フィーチャ表」を参照) |
RELATION_TABLE_NAME |
VARCHAR2(32) |
フィーチャ要素をネットワーク要素(ノードとリンク)にマップするフィーチャ要素関係表の名前です(「フィーチャ要素関係表」を参照) |
HIERRCHY_TABLE_NAME |
VARCHAR2(32) |
フィーチャ間の親子関係を定義するフィーチャ階層表の名前です(「フィーチャ階層表」を参照) |
ユーザー定義データを使用するには、該当するxxx_SDO_NETWORK_METADATAビュー(「xxx_SDO_NETWORK_METADATAビュー」を参照)のUSER_DEFINED_DATA列の値にY
を設定する必要があります。
ユーザー定義データの使用例については、「ユーザー定義データの例(PL/SQLおよびJava)」を参照してください。
xxx_SDO_NETWORK_USER_DATAビューを介して定義されたユーザー・データについては、ネットワーク分析中にユーザー・データにアクセスする場合、デフォルトのユーザー・データI/O実装(LODUserDataIOSDO
)が使用されます。ただし、一部のユーザー・データは、ノード表またはリンク表に含まれていないため、xxx_SDO_NETWORK_USER_DATAビューを介して登録できません。このようなユーザー・データについては、ユーザー・データI/Oインタフェースの独自の実装を提供する必要があります。カスタムのユーザー・データI/Oインタフェースを実装する一般的な方法は、ノードおよびリンクのユーザー・データに対応したBLOB (各パーティションごとに1つのBLOB)を生成し、次にネットワーク分析中にBLOBからユーザー・データ情報を取得することです。
ユーザー定義データ(カテゴリ分けされたユーザー・データ)の複数のカテゴリを単一のネットワークに関連付けることもできます。たとえば、マルチモーダル・ネットワーク(「マルチモーダル・ネットワークと時間の例」を参照)では、リンクのマルチモーダル属性の他に、運転に関連する属性(制限速度など)をリンクに関連付ける必要がある場合、ユーザー定義データを2つのカテゴリ(1つは運転に関連する属性用で、もう1つはマルチモーダル属性用)に整理できます。
Oracle Spatial and Graphのネットワーク・データ・モデル・グラフには、2つのクライアントApplication Program Interface (API)として、SDO_NETパッケージによって提供されるPL/SQLインタフェースと、Javaインタフェースが含まれます。両方のインタフェースを使用してネットワーク・データの作成と更新を、またJavaインタフェースを使用してネットワークの分析を実行できます。ネットワーク表の移入および索引の作成にはPL/SQLのみまたはSQLのみを使用し、アプリケーション開発には主にJavaを使用することをお薦めします。
PL/SQL APIとJava APIには、次のパフォーマンス上の注意事項があります。
空間ネットワークの空間に関係しない内容について分析または編集を行う場合は、これらの処理を開始する前にUSER_SDO_NETWORK_METADATAビュー(「xxx_SDO_NETWORK_METADATAビュー」を参照)のNETWORK_CATEGORY列の値をLOGICAL
に設定し、処理が完了してから値をSPATIAL
に戻すことで、パフォーマンスを向上できます。
たとえば、2ノード間の最短パスの計算で検討されるのはコスト値であるため、この方法は最短パスを探す場合に利用できます。ただし、リンクに対して空間ジオメトリ・オブジェクトまたは終了メジャー値を設定する場合は、この方法を利用できません。
ネットワーク・オブジェクトを変更しない場合(ネットワークの分析操作または情報取得のみを実行する場合)は、ネットワーク・メモリー・オブジェクトを読取り専用で(更新不可を指定して)作成することで、パフォーマンスを向上できます。
SDO_NETパッケージは、データベース・サーバー上でネットワークの作成、アクセスおよび管理を行うためのサブプログラムを提供します。SDO_NETのファンクションとプロシージャの使用例は、「ネットワークの例」の例5-5に示しています。
SDO_NETサブプログラムは、次の論理カテゴリにグループ化できます。
ネットワークの作成
ネットワークのコピーおよび削除
ネットワーク表の作成
ネットワーク・オブジェクトの検証
情報の取得(ネットワークに関する情報の取得、特性の確認)
SDO_NETの各ファンクションおよびプロシージャのリファレンス情報については、「SDO_NETパッケージ・サブプログラム」を参照してください。
ネットワーク・データ・モデル・グラフの機能には、ロード・オンデマンドのJavaインタフェースが含まれています。このインタフェースに関する完全なリファレンス情報については、『Oracle Spatial and Graph Java API Reference』を参照してください。ロード・オンデマンドのJavaインタフェースのクラスは、oracle.spatial.network.lod
パッケージとそのサブパッケージに含まれています。
Spatial and Graph Javaクラス・ライブラリは、<ORACLE_HOME>/md/jlib/
ディレクトリの下の.jarファイルにあります。
Java APIを使用して、次のようなネットワーク・メタデータとデータの管理操作を実行できます。
ノードおよびリンクのデータの挿入、削除および変更
データベースからのネットワークのロード
データベースへのネットワークの格納
データベースへのネットワーク・メタデータの格納
ネットワーク・メタデータの属性の変更
oracle.spatial.network.lod.NetworkAnalyst
クラスを使用し、ロード・オンデマンド方式を使用して次のようなネットワーク分析操作を実行できます。
最短パス: グラフ理論の一般的な推移閉包問題です。任意の開始ノードおよび終了ノードについて、最短パスを検索します。
到達可能性: 任意のノードについて、このノードに到達可能なすべてのノードを検索するか、またはこのノードから到達可能なすべてのノードを検索します。
コスト内分析: 任意のターゲット・ノードおよびコストについて、任意のコスト内でターゲット・ノードから到達可能なすべてのノードを検索します。
最近隣分析: 任意のターゲット・ノードおよび近くにある複数のノードについて、近くにあるノードおよびそのノードから任意のターゲット・ノードに移動するためのコストを検索します。
動的データ入力: ネットワーク更新情報を使用してNetworkUpdate
オブジェクトを作成して使用します。
ユーザー定義のリンクおよびノードのコスト計算表: リンクまたはノードのコストを計算する方法を定義します。
ネットワーク・データ・モデル・グラフのXML APIを使用してネットワーク分析を実行できます。Webサービス・リクエストは、Oracle Spatial and GraphのWebサービスを介してサポートされています(『Oracle Spatial and Graph開発者ガイド』を参照)。
HTTPリクエストは、Java、PLSQLまたは.NETプログラムから、あるいは単純にHTMLフォームからWebサービスに送信できます。SDO_NET.POST_XMLファンクション(「SDO_NETパッケージ・サブプログラム」を参照)を使用すると、PL/SQLユーザーはWebサービスをコールできます。
ネットワーク・データ・モデル・グラフのXML APIのXMLスキーマについては、$ORACLE_HOME/md/doc/sdondmxml.zip
を参照してください。
XML APIは、LODインタフェースを実装するJavaクラスの指定を可能にすることで、ユーザー指定の制約、コスト計算またはネットワーク分析アルゴリズムの設定を取得できます。入力パラメータ(トラック輸送制約の実装でのトラックの重量または高さなど)が必要な実装については、Javaクラスがoracle.spatial.network.lod.XMLConfigurable
インタフェース(つまり、次の2つのメソッド)を実装する必要があります。
void init(Element parameter);
String getXMLSchema();
init
メソッドでは、入力パラメータをXML要素として渡すことができます(XML要素は、getXMLSchema
メソッドから返されるスキーマに従う必要があります)。
次のXMLコード・セグメントは、最短パス分析リクエストに対して最短パス・アルゴリズムを構成する方法の例です。
<startPoint> <nodeID>123</nodeID> </startPoint> <endPoint> <nodeID>456</nodeID> </endPoint> <shortestPathAlgorithm> <className>oracle.spatial.network.lod.AStar</className> <parameters> <heuristicCostFunction> <className>oracle.spatial.network.lod.GeodeticCostFunction</className> <parameters> <userDataCategory>0</userDataCategory> <xCoordUserDataIndex>0</xCoordUserDataIndex> <yCoordUserDataIndex>1</yCoordUserDataIndex> </parameters> </heuristicCostFunction> <linkLevelSelector> <className>oracle.spatial.network.lod.DynamicLinkLevelSelector</className> <parameters> <maxLinkLevel>2</maxLinkLevel> <costThreshold linkLevel="1">40000</costThreshold> <numHighLevelNeighbors>8</numHighLevelNeighbors> <costMultiplier>1.5</costMultiplier> <costFunction> <className>oracle.spatial.network.lod.GeodeticCostFunction</className> <parameters> <userDataCategory>0</userDataCategory> <xCoordUserDataIndex>0</xCoordUserDataIndex> <yCoordUserDataIndex>1</yCoordUserDataIndex> </parameters> </costFunction> </parameters> </linkLevelSelector> </parameters> </shortestPathAlgorithm>
XML APIのその他の例については、NDMのチュートリアル(「ネットワーク・データ・モデルのチュートリアルとその他のリソース」を参照)を参照してください。
ネットワーク所有者以外のデータベース・ユーザーがメモリーにネットワークを読み込む場合は、次のいずれかを実行する必要があります。
所有者以外のユーザーごとに、USER_SDO_NETWORK_METADATAビューのネットワーク表をネットワーク所有者のスキーマで修飾します(「複数のスキーマが関係している場合のネットワーク・メタデータでの所有者の指定によるアクセス」を参照)。
所有者以外のユーザーごとに、ネットワーク・データ・モデル・グラフ表に対するビューを作成し、USER_SDO_NETWORK_METADATAビューを更新します(「複数のスキーマが関係している場合のビューを使用したアクセス」を参照)。
2つ目の方法では、ビューの作成という追加の手順が必要ですが、このビューによって、ネットワークにおけるアクセス可能な部分を柔軟に制御できるようになります。各ビューでは、ネットワークのすべての部分にアクセスできるようにすることも、WHERE句を使用してアクセスを一部分のみに制限することもできます(たとえば、WHERE STATE_CODE='NY'
では、ビュー・ユーザーをNew Yorkの行に制限します)。
例として、次のシナリオについて考えてみます。
User1がNetwork1を作成します(したがって、所有者になります)。
User2がSDO_NET_MEM.NETWORK_MANAGER.READ_NETWORKプロシージャをコールしてNetwork1を読み込もうとしますが、エラーが発生します。このエラーは、User2がNetwork1のネットワーク・データ・モデル・グラフ表に対する適切な権限を所有していても発生します。
この問題に対処するには、「複数のスキーマが関係している場合のネットワーク・メタデータでの所有者の指定によるアクセス」または「複数のスキーマが関係している場合のビューを使用したアクセス」のいずれかの方法を使用する必要があります。
(適切な権限のある)所有者以外のユーザーがネットワークにアクセスできるように、ネットワーク・メタデータでネットワーク所有者を指定します。ネットワークへのアクセスを許可する所有者以外のユーザーごとに、次の手順を実行します。
ユーザーに、必要なネットワーク・データ・モデル・グラフ表へのSELECTまたはREADアクセス権が付与されていることを確認します。このアクセス権がユーザーに付与されていない場合は、ネットワーク所有者として接続し、アクセス権を付与します。たとえば、User1として接続し、次の文を実行します。
GRANT select ON network1_node$ TO user2; GRANT select ON network1_link$ TO user2; GRANT select ON network1_path$ TO user2; GRANT select ON network1_plink$ TO user2;
所有者以外のユーザーとして接続します。たとえば、User2として接続します。
USER_SDO_NETWORK_METADATAビュー(「xxx_SDO_NETWORK_METADATAビュー」を参照)におけるネットワークについて、ネットワーク所有者のスキーマ名を使用してネットワーク・データ・モデル・グラフ表を修飾します。たとえば、ネットワークがこのビューにまだ定義されていない場合は、User2としての接続中に次を実行します。
INSERT INTO user_sdo_network_metadata (network, network_category, geometry_type, node_table_name,node_geom_column, link_table_name, link_geom_column, link_direction, path_table_name, path_geom_column, path_link_table_name) VALUES ('NETWORK1','SPATIAL', 'SDO_GEOMETRY', 'USER1.NETWORK1_NODE$', 'GEOMETRY', 'USER1.NETWORK1_LINK$', 'GEOMETRY', 'DIRECTED', 'USER1.NETWORK1_PATH$', 'GEOMETRY', 'USER1.NETWORK1_PLINK$');
ネットワークがこのビューにすでに定義されている場合は、定義を更新して、各表名をスキーマ名で修飾します。次に例を示します。
UPDATE USER_SDO_NETWORK_METADATA SET node_table_name = 'USER1.NETWORK1_NODE$', link_table_name = 'USER1.NETWORK1_LINK$', path_table_name = 'USER1.NETWORK1_PATH$', path_link_table_name = 'USER1.NETWORK1_PLINK$' WHERE network = 'NETWORK1';
このシナリオでは、これでUser2がNETWORK1をメモリーに読み込めるようになります。
(適切な権限のある)所有者以外のユーザーがネットワークまたはネットワークの特定の部分にアクセスできるように、ビューを作成します。ネットワークへのアクセスを許可する所有者以外のユーザーごとに、次の手順を実行します。
ユーザーに、必要なネットワーク・データ・モデル・グラフ表へのSELECTまたはREADアクセス権が付与されていることを確認します。このアクセス権がユーザーに付与されていない場合は、ネットワーク所有者として接続し、アクセス権を付与します。たとえば、User1として接続し、次の文を実行します。
GRANT select ON network1_node$ TO user2; GRANT select ON network1_link$ TO user2; GRANT select ON network1_path$ TO user2; GRANT select ON network1_plink$ TO user2;
所有者以外のユーザーとして接続します。たとえば、User2として接続します。
必要な各ネットワーク・データ・モデル・グラフ・ノードに対するビューを作成し、各ビューでは対応する表の列をすべて選択するようにします。表名をネットワーク所有者のスキーマ名で修飾します。たとえば、User2としての接続中に次のようにします。
CREATE VIEW network1_node$ AS select * from user1.network1_node$; CREATE VIEW network1_link$ AS select * from user1.network1_link$; CREATE VIEW network1_path$ AS select * from user1.network1_path$; CREATE VIEW network1_plink$ AS select * from user1.network1_plink$;
注意:
この例では、基礎となる表のすべてのデータを含むビューを示していますが、各ビューの定義でWHERE句(WHERE STATE_CODE='NY'
など)を使用することで、ネットワークの使用可能な部分を制限できます。
新しく作成したビューを指定する行をUSER_SDO_NETWORK_METADATAビュー(「xxx_SDO_NETWORK_METADATAビュー」を参照)に追加します。たとえば、User2としての接続中に次のようにします。
INSERT INTO user_sdo_network_metadata (network, network_category, geometry_type, node_table_name,node_geom_column, link_table_name, link_geom_column, link_direction, path_table_name, path_geom_column, path_link_table_name) VALUES ('NETWORK1','SPATIAL', 'SDO_GEOMETRY', 'NETWORK1_NODE$', 'GEOMETRY', 'NETWORK1_LINK$', 'GEOMETRY', 'DIRECTED', 'NETWORK1_PATH$', 'GEOMETRY', 'NETWORK1_PLINK$');
このシナリオでは、これでUser2が作成されたビューを介してNETWORK1の使用可能な部分をメモリーに読み込めるようになります。
この項では、複数のネットワーク・データ・モデル・グラフの例を示します。ほとんどは簡単な例です。すべての例でPL/SQL APIを使用し、一部の例では他のAPIも使用しています。この項では、次の内容について説明します。
この項の例では、この章で説明した概念を示しています。また、「SDO_NETパッケージ・サブプログラム」に示すPL/SQLのファンクションおよびプロシージャを使用しています。
この項では、3つのノードおよび各ノード間のリンクが含まれる非常に単純な空間(SDO、非LRS)ネットワークの例を示します。図5-4に、このネットワークを示します。
図5-4に示すとおり、ノードN1
は点1,1、ノードN2
は点15,1、ノードN3
は点9,4に存在します。リンクL1
はノードN1
とノードN2
を結ぶ直線、リンクL2
はノードN2
とノードN3
を結ぶ直線、リンクL3
はノードN3
とノードN1
を結ぶ直線です。リンクにはその他のノードまたは形状点は含まれません。
例5-3では、次の処理を行います。
SDO_NET.CREATE_SDO_NETWORKプロシージャのコール時に、SDO_NET1
有向ネットワークを作成し、SDO_NET1_NODE$、SDO_NET1_LINK$、SDO_NET1_PATH$およびSDO_NET1_PLINK$の各表を作成して、xxx_SDO_NETWORK_METADATAビューを更新します。すべてのジオメトリ列は、GEOMETRYという名前になります。ノード表とリンク表の両方に、COSTという名前のコスト列が含まれます。
ノード表、リンク表、パス表およびパスリンク表を移入します。これによって、ノード表に3つの行、リンク表に3つの行、パス表に2つの行、パスリンク表に4つの行が挿入されます。
Oracle Spatial and Graphメタデータを更新し、ノード表およびリンク表のGEOMETRY列に空間索引を作成します。(このアクションは、ネットワーク管理には直接関係ありませんが、アプリケーションでこれらのジオメトリ列の空間索引を利用する場合に必要です。)
例5-3には、SDO_NETのファンクションおよびプロシージャの使用が多くは示されていません(これらについては、「空間(LRS)ネットワークの例(PL/SQL)」の例5-5を参照してください)。
例5-3 単純な空間(SDO)ネットワークの例(PL/SQL)
-- Create the SDO_NET1 directed network. Also creates the SDO_NET1_NODE$, -- SDO_NET1_LINK$, SDO_NET1_PATH$, SDO_NET1_PLINK$ tables, and updates -- USER_SDO_NETWORK_METADATA. All geometry columns are named GEOMETRY. -- Both the node and link tables contain a cost column named COST. EXECUTE SDO_NET.CREATE_SDO_NETWORK('SDO_NET1', 1, TRUE, TRUE); -- Populate the SDO_NET1_NODE$ table. -- N1 INSERT INTO sdo_net1_node$ (node_id, node_name, active, geometry, cost) VALUES(1, 'N1', 'Y', SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(1,1,NULL), NULL, NULL), 5); -- N2 INSERT INTO sdo_net1_node$ (node_id, node_name, active, geometry, cost) VALUES(2, 'N2', 'Y', SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(15,1,NULL), NULL, NULL), 8); -- N3 INSERT INTO sdo_net1_node$ (node_id, node_name, active, geometry, cost) VALUES(3, 'N3', 'Y', SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(9,4,NULL), NULL, NULL), 4); -- Populate the SDO_NET1_LINK$ table. -- L1 INSERT INTO sdo_net1_link$ (link_id, link_name, start_node_id, end_node_id, active, geometry, cost, bidirected) VALUES(1, 'L1', 1, 2, 'Y', SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,2,1), SDO_ORDINATE_ARRAY(1,1, 15,1)), 14, 'Y'); -- L2 INSERT INTO sdo_net1_link$ (link_id, link_name, start_node_id, end_node_id, active, geometry, cost, bidirected) VALUES(2, 'L2', 2, 3, 'Y', SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,2,1), SDO_ORDINATE_ARRAY(15,1, 9,4)), 10, 'Y'); -- L3 INSERT INTO sdo_net1_link$ (link_id, link_name, start_node_id, end_node_id, active, geometry, cost, bidirected) VALUES(3, 'L3', 3, 1, 'Y', SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,2,1), SDO_ORDINATE_ARRAY(9,4, 1,1)), 10, 'Y'); -- Do not populate the SDO_NET1_PATH$ and SDO_NET1_PLINK$ tables now. -- Do this only when you need to create any paths. --------------------------------------------------------------------------- -- REMAINING STEPS NEEDED TO USE SPATIAL INDEXES -- --------------------------------------------------------------------------- -- Update the USER_SDO_GEOM_METADATA view. This is required before the -- spatial index can be created. Do this only once for each layer -- (that is, table-column combination). INSERT INTO user_sdo_geom_metadata (TABLE_NAME, COLUMN_NAME, DIMINFO, SRID) VALUES ( 'SDO_NET1_NODE$', 'GEOMETRY', SDO_DIM_ARRAY( -- 20X20 grid SDO_DIM_ELEMENT('X', 0, 20, 0.005), SDO_DIM_ELEMENT('Y', 0, 20, 0.005) ), NULL -- SRID (spatial reference system, also called coordinate system) ); INSERT INTO user_sdo_geom_metadata (TABLE_NAME, COLUMN_NAME, DIMINFO, SRID) VALUES ( 'SDO_NET1_LINK$', 'GEOMETRY', SDO_DIM_ARRAY( -- 20X20 grid SDO_DIM_ELEMENT('X', 0, 20, 0.005), SDO_DIM_ELEMENT('Y', 0, 20, 0.005) ), NULL -- SRID (spatial reference system, also called coordinate system) ); -- Create the spatial indexes CREATE INDEX sdo_net1_nodes_idx ON sdo_net1_node$(geometry) INDEXTYPE IS MDSYS.SPATIAL_INDEX; CREATE INDEX sdo_net1_links_idx ON sdo_net1_link$(geometry) INDEXTYPE IS MDSYS.SPATIAL_INDEX;
この項では、3つのノードおよびノード間のリンクが含まれる非常に単純な論理ネットワークの例を示します。図5-5に、このネットワークを示します。
図5-5に示すとおり、リンクL1
はノードN1
とノードN2
を結ぶ直線、リンクL2
はノードN2
とノードN3
を結ぶ直線、リンクL3
はノードN3
とノードN1
を結ぶ直線です。リンクにはその他のノードは含まれません。
例5-4では、SDO_NET.CREATE_LOGICAL_NETWORKプロシージャをコールし、これによって、LOG_NET1
有向ネットワークの作成、LOG_NET1_NODE$、LOG_NET1_LINK$、LOG_NET1_PATH$およびLOG_NET1_PLINK$の各表の作成、およびxxx_SDO_NETWORK_METADATAビューの更新が行われます。ノード表とリンク表の両方に、COSTという名前のコスト列が含まれます。(これは論理ネットワークであるため、ジオメトリ列は含まれません。)この例では、ノード表およびリンク表の移入も行われます。
例5-4には、SDO_NETのファンクションおよびプロシージャの使用が多くは示されていません(これらについては、「論理階層ネットワークの例(PL/SQL)」の論理階層ネットワークの例(例5-6)を参照してください)。
例5-4 単純な論理ネットワークの例(PL/SQL)
-- Creates the LOG_NET1 directed logical network. Also creates the -- LOG_NET1_NODE$, LOG_NET1_LINK$, LOG_NET1_PATH$, -- and LOG_NET1_PLINK$ tables, and updates USER_SDO_NETWORK_METADATA. -- Both the node and link tables contain a cost column named COST. EXECUTE SDO_NET.CREATE_LOGICAL_NETWORK('LOG_NET1', 1, TRUE, TRUE); -- Populate the LOG_NET1_NODE$ table. -- N1 INSERT INTO log_net1_node$ (node_id, node_name, active, cost) VALUES (1, 'N1', 'Y', 2); -- N2 INSERT INTO log_net1_node$ (node_id, node_name, active, cost) VALUES (2, 'N2', 'Y', 3); -- N3 INSERT INTO log_net1_node$ (node_id, node_name, active, cost) VALUES (3, 'N3', 'Y', 2); -- Populate the LOG_NET1_LINK$ table. -- L1 INSERT INTO log_net1_link$ (link_id, link_name, start_node_id, end_node_id, active, link_level, cost) VALUES (1, 'L1', 1, 2, 'Y', 1, 10); -- L2 INSERT INTO log_net1_link$ (link_id, link_name, start_node_id, end_node_id, active, link_level, cost) VALUES (2, 'L2', 2, 3, 'Y', 1, 7); -- L3 INSERT INTO log_net1_link$ (link_id, link_name, start_node_id, end_node_id, active, link_level, cost) VALUES (3, 'L3', 3, 1, 'Y', 1, 8); -- Do not populate the LOG_NET1_PATH$ and LOG_NET1_PLINK$ tables now. -- Do this only when you need to create any paths.
この項では、図5-6に示す道路(ルート)を使用する空間(LRS)ネットワークの例を示します。それぞれの道路は、1つ以上の道路セグメント・ジオメトリ(図を参照)から抜き出された、(リンクに関連付けられた)個々の線セグメントで作成されています。
次に、図5-6について説明します。
Route1
は、点2,2から開始し、点5,14で終了します。このルートには、N1
、N2
、N3
、N4
、N5
、N6
およびN7
の各ノードが含まれます。このルートには、R1L1
、R1L2
、R1L3
、R1L4
、R1L5
およびR1L6
の各リンクが含まれます。
Route2
は、点8,4から開始し、点8,13で終了します。これには、N3
、N6
およびN8
の各ノードが含まれます。これには、R2L1
およびR2L2
の各リンクが含まれます。
Route3
は、点12,10から開始し、点5,14で終了します。これには、N5
、N8
およびN7
の各ノードが含まれます。これには、R3L1
およびR3L2
の各リンクが含まれます。
図の右側には、4つの道路セグメント・ジオメトリが個別に示されています。(各セグメント上の点には、対応するノード名がラベル付けされ、各セグメント・ジオメトリが、左側の図のどの部分に相当するかわかりやすくなっています。)
例5-5では、次の処理を行います。
道路セグメント・ジオメトリを格納する表を作成します。
4つの道路セグメント・ジオメトリを表に挿入します。
USER_SDO_GEOM_METADATAビューに空間メタデータを挿入します。
ROAD_SEGMENTS表のジオメトリ列に空間索引を作成します。
ノード表を作成および移入します。
リンク表を作成および移入します。
将来使用する場合に備えて、パス表およびパスリンク表を作成および移入します。(アプリケーションでパスを使用できるようにするには、これらの2つの表を移入する必要があります。)
USER_SDO_NETWORK_METADATAビューにネットワーク・メタデータを挿入します。
例5-5 空間(LRS)ネットワークの例(PL/SQL)
--------------------------------------------------------------------------- -- CREATE AND POPULATE TABLE -- --------------------------------------------------------------------------- -- Create a table for road segments. Use LRS. CREATE TABLE road_segments ( segment_id NUMBER PRIMARY KEY, segment_name VARCHAR2(32), segment_geom SDO_GEOMETRY, geom_id NUMBER); -- Populate the table with road segments. INSERT INTO road_segments VALUES( 1, 'Segment1', SDO_GEOMETRY( 3302, -- line string, 3 dimensions (X,Y,M), 3rd is measure dimension NULL, NULL, SDO_ELEM_INFO_ARRAY(1,2,1), -- one line string, straight segments SDO_ORDINATE_ARRAY( 2,2,0, -- Starting point - Node1; 0 is measure from start. 2,4,2, -- Node2; 2 is measure from start. 8,4,8, -- Node3; 8 is measure from start. 12,4,12) -- Node4; 12 is measure from start. ), 1001 ); INSERT INTO road_segments VALUES( 2, 'Segment2', SDO_GEOMETRY( 3302, -- line string, 3 dimensions (X,Y,M), 3rd is measure dimension NULL, NULL, SDO_ELEM_INFO_ARRAY(1,2,1), -- one line string, straight segments SDO_ORDINATE_ARRAY( 8,4,0, -- Node3; 0 is measure from start. 8,10,6, -- Node6; 6 is measure from start. 8,13,9) -- Ending point - Node8; 9 is measure from start. ), 1002 ); INSERT INTO road_segments VALUES( 3, 'Segment3', SDO_GEOMETRY( 3302, -- line string, 3 dimensions (X,Y,M), 3rd is measure dimension NULL, NULL, SDO_ELEM_INFO_ARRAY(1,2,1), -- one line string, straight segments SDO_ORDINATE_ARRAY( 12,4,0, -- Node4; 0 is measure from start. 12,10,6, -- Node5; 6 is measure from start. 8,13,11, -- Node8; 11 is measure from start. 5,14,14.16) -- Ending point - Node7; 14.16 is measure from start. ), 1003 ); INSERT INTO road_segments VALUES( 4, 'Segment4', SDO_GEOMETRY( 3302, -- line string, 3 dimensions (X,Y,M), 3rd is measure dimension NULL, NULL, SDO_ELEM_INFO_ARRAY(1,2,1), -- one line string, straight segments SDO_ORDINATE_ARRAY( 12,10,0, -- Node5; 0 is measure from start. 8,10,4, -- Node6; 4 is measure from start. 5,14,9) -- Ending point - Node7; 9 is measure from start. ), 1004 ); --------------------------------------------------------------------------- -- UPDATE THE SPATIAL METADATA -- --------------------------------------------------------------------------- -- Update the USER_SDO_GEOM_METADATA view. This is required before the -- spatial index can be created. Do this only once for each layer -- (that is, table-column combination; here: road_segment and segment_geom). INSERT INTO user_sdo_geom_metadata (TABLE_NAME, COLUMN_NAME, DIMINFO, SRID) VALUES ( 'ROAD_SEGMENTS', 'SEGMENT_GEOM', SDO_DIM_ARRAY( -- 20X20 grid SDO_DIM_ELEMENT('X', 0, 20, 0.005), SDO_DIM_ELEMENT('Y', 0, 20, 0.005), SDO_DIM_ELEMENT('M', 0, 20, 0.005) -- Measure dimension ), NULL -- SRID (spatial reference system, also called coordinate system) ); ------------------------------------------------------------------- -- CREATE THE SPATIAL INDEX -- ------------------------------------------------------------------- CREATE INDEX road_segments_idx ON road_segments(segment_geom) INDEXTYPE IS MDSYS.SPATIAL_INDEX; -------------------------------- -- USE SDO_NET SUBPROGRAMS -------------------------------- -- This procedure does not use the CREATE_LRS_NETWORK procedure. Instead, -- the user creates the network tables and populates the network metadata view. -- Basic steps: -- 1. Create and populate the node table. -- 2. Create and populate the link table. -- 3. Create the path table and paths and links table (for possible -- future use, before which they will need to be populated). -- 4. Populate the network metadata (USER_SDO_NETWORK_METADATA). -- Note: Can be done before or after Steps 1-3. -- 5. Use various SDO_NET functions and procedures. -- 1. Create and populate the node table. EXECUTE SDO_NET.CREATE_NODE_TABLE('ROADS_NODES', 'LRS_GEOMETRY', 'NODE_GEOMETRY', 'COST', 1); -- Populate the node table. -- N1 INSERT INTO roads_nodes (node_id, node_name, active, geom_id, measure) VALUES (1, 'N1', 'Y', 1001, 0); -- N2 INSERT INTO roads_nodes (node_id, node_name, active, geom_id, measure) VALUES (2, 'N2', 'Y', 1001, 2); -- N3 INSERT INTO roads_nodes (node_id, node_name, active, geom_id, measure) VALUES (3, 'N3', 'Y', 1001, 8); -- N4 INSERT INTO roads_nodes (node_id, node_name, active, geom_id, measure) VALUES (4, 'N4', 'Y', 1001, 12); -- N5 INSERT INTO roads_nodes (node_id, node_name, active, geom_id, measure) VALUES (5, 'N5', 'Y', 1004, 0); -- N6 INSERT INTO roads_nodes (node_id, node_name, active, geom_id, measure) VALUES (6, 'N6', 'Y', 1002, 6); -- N7 INSERT INTO roads_nodes (node_id, node_name, active, geom_id, measure) VALUES (7, 'N7', 'Y', 1004, 9); -- N8 INSERT INTO roads_nodes (node_id, node_name, active, geom_id, measure) VALUES (8, 'N8', 'Y', 1002, 9); -- 2. Create and populate the link table. EXECUTE SDO_NET.CREATE_LINK_TABLE('ROADS_LINKS', 'LRS_GEOMETRY', 'LINK_GEOMETRY', 'COST', 1); -- Populate the link table. -- Route1, Link1 INSERT INTO roads_links (link_id, link_name, start_node_id, end_node_id, active, cost, geom_id, start_measure, end_measure) VALUES (101, 'R1L1', 1, 2, 'Y', 3, 1001, 0, 2); -- Route1, Link2 INSERT INTO roads_links (link_id, link_name, start_node_id, end_node_id, active, cost, geom_id, start_measure, end_measure) VALUES (102, 'R1L2', 2, 3, 'Y', 15, 1001, 2, 8); -- Route1, Link3 INSERT INTO roads_links (link_id, link_name, start_node_id, end_node_id, active, cost, geom_id, start_measure, end_measure) VALUES (103, 'R1L3', 3, 4, 'Y', 10, 1001, 8, 12); -- Route1, Link4 INSERT INTO roads_links (link_id, link_name, start_node_id, end_node_id, active, cost, geom_id, start_measure, end_measure) VALUES (104, 'R1L4', 4, 5, 'Y', 15, 1003, 0, 6); -- Route1, Link5 INSERT INTO roads_links (link_id, link_name, start_node_id, end_node_id, active, cost, geom_id, start_measure, end_measure) VALUES (105, 'R1L5', 5, 6, 'Y', 10, 1004, 0, 4); -- Route1, Link6 INSERT INTO roads_links (link_id, link_name, start_node_id, end_node_id, active, cost, geom_id, start_measure, end_measure) VALUES (106, 'R1L6', 6, 7, 'Y', 7, 1004, 4, 9); -- Route2, Link1 (cost = 30, a slow drive) INSERT INTO roads_links (link_id, link_name, start_node_id, end_node_id, active, cost, geom_id, start_measure, end_measure) VALUES (201, 'R2L1', 3, 6, 'Y', 30, 1002, 0, 6); -- Route2, Link2 INSERT INTO roads_links (link_id, link_name, start_node_id, end_node_id, active, cost, geom_id, start_measure, end_measure) VALUES (202, 'R2L2', 6, 8, 'Y', 5, 1002, 6, 9); -- Route3, Link1 INSERT INTO roads_links (link_id, link_name, start_node_id, end_node_id, active, cost, geom_id, start_measure, end_measure) VALUES (301, 'R3L1', 5, 8, 'Y', 5, 1003, 6, 11); -- Route3, Link2 INSERT INTO roads_links (link_id, link_name, start_node_id, end_node_id, active, cost, geom_id, start_measure, end_measure) VALUES (302, 'R3L2', 8, 7, 'Y', 5, 1003, 11, 14.16); -- 3. Create the path table (to store created paths) and the path-link -- table (to store links for each path) for possible future use, -- before which they will need to be populated. EXECUTE SDO_NET.CREATE_PATH_TABLE('ROADS_PATHS', 'PATH_GEOMETRY'); EXECUTE SDO_NET.CREATE_PATH_LINK_TABLE('ROADS_PATHS_LINKS'); -- 4. Populate the network metadata (USER_SDO_NETWORK_METADATA). INSERT INTO user_sdo_network_metadata (NETWORK, NETWORK_CATEGORY, GEOMETRY_TYPE, NETWORK_TYPE, NO_OF_HIERARCHY_LEVELS, NO_OF_PARTITIONS, LRS_TABLE_NAME, LRS_GEOM_COLUMN, NODE_TABLE_NAME, NODE_GEOM_COLUMN, NODE_COST_COLUMN, LINK_TABLE_NAME, LINK_GEOM_COLUMN, LINK_DIRECTION, LINK_COST_COLUMN, PATH_TABLE_NAME, PATH_GEOM_COLUMN, PATH_LINK_TABLE_NAME) VALUES ( 'ROADS_NETWORK', -- Network name 'SPATIAL', -- Network category 'LRS_GEOMETRY', -- Geometry type 'Roadways', -- Network type (user-defined) 1, -- No. of levels in hierarchy 1, -- No. of partitions 'ROAD_SEGMENTS', -- LRS table name 'SEGMENT_GEOM' , -- LRS geometry column 'ROADS_NODES', -- Node table name 'NODE_GEOMETRY', -- Node geometry column 'COST', -- Node cost column 'ROADS_LINKS', -- Link table name 'LINK_GEOMETRY', -- Link geometry column 'DIRECTED', -- Link direction 'COST', -- Link cost column 'ROADS_PATHS', -- Path table name 'PATH_GEOMETRY', -- Path geometry column 'ROADS_PATHS_LINKS' -- Paths and links table ); -- 5. Use various SDO_NET functions and procedures. -- Validate the network. SELECT SDO_NET.VALIDATE_NETWORK('ROADS_NETWORK') FROM DUAL; -- Validate parts or aspects of the network. SELECT SDO_NET.VALIDATE_LINK_SCHEMA('ROADS_NETWORK') FROM DUAL; SELECT SDO_NET.VALIDATE_LRS_SCHEMA('ROADS_NETWORK') FROM DUAL; SELECT SDO_NET.VALIDATE_NODE_SCHEMA('ROADS_NETWORK') FROM DUAL; SELECT SDO_NET.VALIDATE_PATH_SCHEMA('ROADS_NETWORK') FROM DUAL; -- Retrieve various information (GET_xxx and some other functions). SELECT SDO_NET.GET_CHILD_LINKS('ROADS_NETWORK', 101) FROM DUAL; SELECT SDO_NET.GET_CHILD_NODES('ROADS_NETWORK', 1) FROM DUAL; SELECT SDO_NET.GET_GEOMETRY_TYPE('ROADS_NETWORK') FROM DUAL; SELECT SDO_NET.GET_IN_LINKS('ROADS_NETWORK', 3) FROM DUAL; SELECT SDO_NET.GET_INVALID_LINKS('ROADS_NETWORK') FROM DUAL; SELECT SDO_NET.GET_INVALID_NODES('ROADS_NETWORK') FROM DUAL; SELECT SDO_NET.GET_INVALID_PATHS('ROADS_NETWORK') FROM DUAL; SELECT SDO_NET.GET_ISOLATED_NODES('ROADS_NETWORK') FROM DUAL; SELECT SDO_NET.GET_LINK_COST_COLUMN('ROADS_NETWORK') FROM DUAL; SELECT SDO_NET.GET_LINK_DIRECTION('ROADS_NETWORK') FROM DUAL; SELECT SDO_NET.GET_LINK_GEOM_COLUMN('ROADS_NETWORK') FROM DUAL; SELECT SDO_NET.GET_LINK_GEOMETRY('ROADS_NETWORK', 103) FROM DUAL; SELECT SDO_NET.GET_LINK_TABLE_NAME('ROADS_NETWORK') FROM DUAL; SELECT SDO_NET.GET_LRS_GEOM_COLUMN('ROADS_NETWORK') FROM DUAL; SELECT SDO_NET.GET_LRS_LINK_GEOMETRY('ROADS_NETWORK', 103) FROM DUAL; SELECT SDO_NET.GET_LRS_NODE_GEOMETRY('ROADS_NETWORK', 3) FROM DUAL; SELECT SDO_NET.GET_LRS_TABLE_NAME('ROADS_NETWORK') FROM DUAL; SELECT SDO_NET.GET_NETWORK_CATEGORY('ROADS_NETWORK') FROM DUAL; SELECT SDO_NET.GET_NETWORK_ID('ROADS_NETWORK') FROM DUAL; SELECT SDO_NET.GET_NETWORK_NAME(3) FROM DUAL; SELECT SDO_NET.GET_NETWORK_TYPE('ROADS_NETWORK') FROM DUAL; SELECT SDO_NET.GET_NO_OF_HIERARCHY_LEVELS('ROADS_NETWORK') FROM DUAL; SELECT SDO_NET.GET_NO_OF_LINKS('ROADS_NETWORK') FROM DUAL; SELECT SDO_NET.GET_NO_OF_NODES('ROADS_NETWORK') FROM DUAL; SELECT SDO_NET.GET_NODE_DEGREE('ROADS_NETWORK', 3) FROM DUAL; SELECT SDO_NET.GET_NODE_GEOM_COLUMN('ROADS_NETWORK') FROM DUAL; SELECT SDO_NET.GET_NODE_GEOMETRY('ROADS_NETWORK', 3) FROM DUAL; SELECT SDO_NET.GET_NODE_IN_DEGREE('ROADS_NETWORK', 3) FROM DUAL; SELECT SDO_NET.GET_NODE_OUT_DEGREE('ROADS_NETWORK', 3) FROM DUAL; SELECT SDO_NET.GET_NODE_TABLE_NAME('ROADS_NETWORK') FROM DUAL; SELECT SDO_NET.GET_NODE_COST_COLUMN('ROADS_NETWORK') FROM DUAL; SELECT SDO_NET.GET_NODE_HIERARCHY_LEVEL('ROADS_NETWORK', 3) FROM DUAL; SELECT SDO_NET.GET_OUT_LINKS('ROADS_NETWORK', 3) FROM DUAL; SELECT SDO_NET.GET_PATH_GEOM_COLUMN('ROADS_NETWORK') FROM DUAL; SELECT SDO_NET.GET_PATH_TABLE_NAME('ROADS_NETWORK') FROM DUAL; SELECT SDO_NET.IS_COMPLEX('ROADS_NETWORK') FROM DUAL; SELECT SDO_NET.IS_HIERARCHICAL('ROADS_NETWORK') FROM DUAL; SELECT SDO_NET.IS_LOGICAL('ROADS_NETWORK') FROM DUAL; SELECT SDO_NET.IS_SIMPLE('ROADS_NETWORK') FROM DUAL; SELECT SDO_NET.IS_SPATIAL('ROADS_NETWORK') FROM DUAL; SELECT SDO_NET.LRS_GEOMETRY_NETWORK('ROADS_NETWORK') FROM DUAL; SELECT SDO_NET.NETWORK_EXISTS('ROADS_NETWORK') FROM DUAL; SELECT SDO_NET.SDO_GEOMETRY_NETWORK('ROADS_NETWORK') FROM DUAL; SELECT SDO_NET.TOPO_GEOMETRY_NETWORK('ROADS_NETWORK') FROM DUAL; -- Copy a network. EXECUTE SDO_NET.COPY_NETWORK('ROADS_NETWORK', 'ROADS_NETWORK2'); -- Create a trigger. EXECUTE SDO_NET.CREATE_DELETE_TRIGGER('ROADS_NETWORK');
この項では、図5-7に示すノードおよびリンクが含まれる論理ネットワークの例を示します。論理ネットワークであるため、空間ジオメトリは関連付けられません。(図5-7は、基本的に「ネットワークの階層」の図5-3と同じですが、ノードおよびリンクがラベル付けされています。)
次に、図5-7について説明します。
ネットワークは階層ネットワークで、2つのレベルがあります。上位レベル(レベル2)は、2つのノード(HN1
とHN2
)で構成されており、残りのノードおよびリンクは、階層の下位レベル(レベル1)に含まれます。
レベル1の各ノードは、レベル2のいずれかのノードの子ノードです。ノードHN1
は、子ノードN1
、N2
、N3
、N4
、N5
およびN6
を持ちます。ノードHN2
は、子ノードN7
、N8
、N9
、N10
、N11
、N12
、N13
およびN14
を持ちます。
1つのリンク(HN1HN2
)がノードHN1
およびHN2
をリンクし、2つのリンク(N5N8
およびN6N7
)は、親リンクHN1HN2
の子リンクとなります。ただし、リンクは特定のネットワーク階層レベルには関連付けられていません。
例5-6では、次の処理を行います。
ノード表を作成および移入します。
リンク表を作成および移入します。
将来使用する場合に備えて、パス表およびパスリンク表を作成および移入します。(アプリケーションでパスを使用できるようにするには、これらの2つの表を移入する必要があります。)
USER_SDO_NETWORK_METADATAビューにネットワーク・メタデータを挿入します。
SDO_NETの様々なファンクションおよびプロシージャを使用します。
例5-6 論理ネットワークの例(PL/SQL)
-- Basic steps: -- 1. Create and populate the node table. -- 2. Create and populate the link table. -- 3. Create the path table and paths and links table (for possible -- future use, before which they will need to be populated). -- 4. Populate the network metadata (USER_SDO_NETWORK_METADATA). -- Note: Can be done before or after Steps 1-3. -- 5. Use various SDO_NET functions and procedures. -- 1. Create and populate the node table. EXECUTE SDO_NET.CREATE_NODE_TABLE('XYZ_NODES', NULL, NULL, NULL, 2); -- Populate the node table, starting with the highest level in the hierarchy. -- HN1 (Hierarchy level=2, highest in this network) INSERT INTO xyz_nodes (node_id, node_name, active, hierarchy_level) VALUES (1, 'HN1', 'Y', 2); -- HN2 (Hierarchy level=2, highest in this network) INSERT INTO xyz_nodes (node_id, node_name, active, hierarchy_level) VALUES (2, 'HN2', 'Y', 2); -- N1 (Hierarchy level 1, parent node ID = 1 for N1 through N6) INSERT INTO xyz_nodes (node_id, node_name, active, hierarchy_level, parent_node_id) VALUES (101, 'N1', 'Y', 1, 1); -- N2 INSERT INTO xyz_nodes (node_id, node_name, active, hierarchy_level, parent_node_id) VALUES (102, 'N2', 'Y', 1, 1); -- N3 INSERT INTO xyz_nodes (node_id, node_name, active, hierarchy_level, parent_node_id) VALUES (103, 'N3', 'Y', 1, 1); -- N4 INSERT INTO xyz_nodes (node_id, node_name, active, hierarchy_level, parent_node_id) VALUES (104, 'N4', 'Y', 1, 1); -- N5 INSERT INTO xyz_nodes (node_id, node_name, active, hierarchy_level, parent_node_id) VALUES (105, 'N5', 'Y', 1, 1); -- N6 INSERT INTO xyz_nodes (node_id, node_name, active, hierarchy_level, parent_node_id) VALUES (106, 'N6', 'Y', 1, 1); -- N7 (Hierarchy level 1, parent node ID = 2 for N7 through N14) INSERT INTO xyz_nodes (node_id, node_name, active, hierarchy_level, parent_node_id) VALUES (107, 'N7', 'Y', 1, 2); -- N8 INSERT INTO xyz_nodes (node_id, node_name, active, hierarchy_level, parent_node_id) VALUES (108, 'N8', 'Y', 1, 2); -- N9 INSERT INTO xyz_nodes (node_id, node_name, active, hierarchy_level, parent_node_id) VALUES (109, 'N9', 'Y', 1, 2); -- N10 INSERT INTO xyz_nodes (node_id, node_name, active, hierarchy_level, parent_node_id) VALUES (110, 'N10', 'Y', 1, 2); -- N11 INSERT INTO xyz_nodes (node_id, node_name, active, hierarchy_level, parent_node_id) VALUES (111, 'N11', 'Y', 1, 2); -- N12 INSERT INTO xyz_nodes (node_id, node_name, active, hierarchy_level, parent_node_id) VALUES (112, 'N12', 'Y', 1, 2); -- N13 INSERT INTO xyz_nodes (node_id, node_name, active, hierarchy_level, parent_node_id) VALUES (113, 'N13', 'Y', 1, 2); -- N14 INSERT INTO xyz_nodes (node_id, node_name, active, hierarchy_level, parent_node_id) VALUES (114, 'N14', 'Y', 1, 2); -- 2. Create and populate the link table. EXECUTE SDO_NET.CREATE_LINK_TABLE('XYZ_LINKS', NULL, NULL, 'COST', 2); -- Populate the link table. -- HN1HN2 (single link in highest hierarchy level: link level = 2) INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, link_level) VALUES (1001, 'HN1HN2', 1, 2, 'Y', 2); -- For remaining links, link level = 1 and cost (10, 20, or 30) varies among links. -- N1N2 INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, link_level, cost) VALUES (1101, 'N1N2', 101, 102, 'Y', 1, 10); -- N1N3 INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, link_level, cost) VALUES (1102, 'N1N3', 101, 103, 'Y', 1, 20); -- N2N3 INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, link_level, cost) VALUES (1103, 'N2N3', 102, 103, 'Y', 1, 30); -- N3N4 INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, link_level, cost) VALUES (1104, 'N3N4', 103, 104, 'Y', 1, 10); -- N4N5 INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, link_level, cost) VALUES (1105, 'N4N5', 104, 105, 'Y', 1, 20); -- N4N6 INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, link_level, cost) VALUES (1106, 'N4N6', 104, 106, 'Y', 1, 30); -- N5N6 INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, link_level, cost) VALUES (1107, 'N5N6', 105, 106, 'Y', 1, 10); -- N5N8 (child of the higher-level link: parent ID = 1001) INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, link_level, cost, parent_link_id) VALUES (1108, 'N5N8', 105, 108, 'Y', 1, 20, 1001); -- N6N7 (child of the higher-level link: parent ID = 1001) INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, link_level, cost, parent_link_id) VALUES (1109, 'N6N7', 106, 107, 'Y', 1, 30, 1001); -- N7N8 INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, link_level, cost) VALUES (1110, 'N7N8', 107, 108, 'Y', 1, 10); -- N7N9 INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, link_level, cost) VALUES (1111, 'N7N9', 107, 109, 'Y', 1, 20); -- N8N9 INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, link_level, cost) VALUES (1112, 'N8N9', 108, 109, 'Y', 1, 30); -- N9N10 INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, link_level, cost) VALUES (1113, 'N9N10', 109, 110, 'Y', 1, 30); -- N9N13 INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, link_level, cost) VALUES (1114, 'N9N13', 109, 113, 'Y', 1, 10); -- N10N11 INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, link_level, cost) VALUES (1115, 'N10N11', 110, 111, 'Y', 1, 20); -- N11N12 INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, link_level, cost) VALUES (1116, 'N11N12', 111, 112, 'Y', 1, 30); -- N12N13 INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, link_level, cost) VALUES (1117, 'N12N13', 112, 113, 'Y', 1, 10); -- N12N14 INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, link_level, cost) VALUES (1118, 'N12N14', 112, 114, 'Y', 1, 20); -- N13N14 INSERT INTO xyz_links (link_id, link_name, start_node_id, end_node_id, active, link_level, cost) VALUES (1119, 'N13N14', 113, 114, 'Y', 1, 30); -- 3. Create the path table (to store created paths) and the path-link -- table (to store links for each path) for possible future use, -- before which they will need to be populated. EXECUTE SDO_NET.CREATE_PATH_TABLE('XYZ_PATHS', NULL); EXECUTE SDO_NET.CREATE_PATH_LINK_TABLE('XYZ_PATHS_LINKS'); -- 4. Populate the network metadata (USER_SDO_NETWORK_METADATA). INSERT INTO user_sdo_network_metadata (NETWORK, NETWORK_CATEGORY, NO_OF_HIERARCHY_LEVELS, NO_OF_PARTITIONS, NODE_TABLE_NAME, LINK_TABLE_NAME, LINK_DIRECTION, LINK_COST_COLUMN, PATH_TABLE_NAME, PATH_LINK_TABLE_NAME) VALUES ( 'XYZ_NETWORK', -- Network name 'LOGICAL', -- Network category 2, -- No. of levels in hierarchy 1, -- No. of partitions 'XYZ_NODES', -- Node table name 'XYZ_LINKS', -- Link table name 'BIDIRECTED', -- Link direction 'COST', -- Link cost column 'XYZ_PATHS', -- Path table name 'XYZ_PATHS_LINKS' -- Path-link table name ); -- 5. Use various SDO_NET functions and procedures. -- Validate the network. SELECT SDO_NET.VALIDATE_NETWORK('XYZ_NETWORK') FROM DUAL; -- Validate parts or aspects of the network. SELECT SDO_NET.VALIDATE_LINK_SCHEMA('XYZ_NETWORK') FROM DUAL; SELECT SDO_NET.VALIDATE_LRS_SCHEMA('XYZ_NETWORK') FROM DUAL; SELECT SDO_NET.VALIDATE_NODE_SCHEMA('XYZ_NETWORK') FROM DUAL; SELECT SDO_NET.VALIDATE_PATH_SCHEMA('XYZ_NETWORK') FROM DUAL; -- Retrieve various information (GET_xxx and some other functions). SELECT SDO_NET.GET_CHILD_LINKS('XYZ_NETWORK', 1001) FROM DUAL; SELECT SDO_NET.GET_CHILD_NODES('XYZ_NETWORK', 1) FROM DUAL; SELECT SDO_NET.GET_CHILD_NODES('XYZ_NETWORK', 2) FROM DUAL; SELECT SDO_NET.GET_IN_LINKS('XYZ_NETWORK', 104) FROM DUAL; SELECT SDO_NET.GET_LINK_COST_COLUMN('XYZ_NETWORK') FROM DUAL; SELECT SDO_NET.GET_LINK_DIRECTION('XYZ_NETWORK') FROM DUAL; SELECT SDO_NET.GET_LINK_TABLE_NAME('XYZ_NETWORK') FROM DUAL; SELECT SDO_NET.GET_NETWORK_TYPE('XYZ_NETWORK') FROM DUAL; SELECT SDO_NET.GET_NO_OF_HIERARCHY_LEVELS('XYZ_NETWORK') FROM DUAL; SELECT SDO_NET.GET_NO_OF_LINKS('XYZ_NETWORK') FROM DUAL; SELECT SDO_NET.GET_NO_OF_NODES('XYZ_NETWORK') FROM DUAL; SELECT SDO_NET.GET_NODE_DEGREE('XYZ_NETWORK', 104) FROM DUAL; SELECT SDO_NET.GET_NODE_IN_DEGREE('XYZ_NETWORK', 104) FROM DUAL; SELECT SDO_NET.GET_NODE_OUT_DEGREE('XYZ_NETWORK', 104) FROM DUAL; SELECT SDO_NET.GET_OUT_LINKS('XYZ_NETWORK', 104) FROM DUAL; SELECT SDO_NET.GET_PATH_TABLE_NAME('XYZ_NETWORK') FROM DUAL; SELECT SDO_NET.IS_HIERARCHICAL('XYZ_NETWORK') FROM DUAL; SELECT SDO_NET.IS_LOGICAL('XYZ_NETWORK') FROM DUAL; SELECT SDO_NET.IS_SPATIAL('XYZ_NETWORK') FROM DUAL; SELECT SDO_NET.NETWORK_EXISTS('XYZ_NETWORK') FROM DUAL; -- Copy a network. EXECUTE SDO_NET.COPY_NETWORK('XYZ_NETWORK', 'XYZ_NETWORK2'); -- Create a trigger. EXECUTE SDO_NET.CREATE_DELETE_TRIGGER('XYZ_NETWORK');
この項では、関連する操作を含むネットワークのパーティション化の例、およびロード・オンデマンドでのネットワーク分析の実行の例を示します。この例では、「ロード・オンデマンドを使用したネットワーク分析」で説明した概念と方法を示します。
パーティション化したネットワークでのロード・オンデマンド分析のその他の使用例は、デモ・ファイル(「ネットワーク・データ・モデル・グラフのチュートリアルとその他のリソース」を参照)に含まれています。
例5-7 空間ネットワークのパーティション化
例5-7では、NYC_NET
という名前の空間ネットワークをパーティション化します。(このネットワークはすでに存在し、そのメタデータ表、ノード表およびリンク表は移入済であると想定します。)
例5-7および例5-8では、NYC_NET
ネットワークに必要なパーティション表を生成します。これらの例の実行後に、.logファイルで現行の状態またはパーティション化やBLOB生成中に発生したエラーをチェックできます。
exec sdo_net.spatial_partition( network->'NYC_NET', -- network name partition_table_name->'NYC_PART$', -- partition table name max_num_nodes->5000, -- max. number of nodes per partition log_loc->'MDDIR', -- partition log directory log_file->'nyc_part.log', --partition log file name open_mode->'w', -- partition log file open mode link_level->1); -- link level
例5-8 パーティションBLOBの生成
例5-8では、ネットワークのパーティションBLOBを生成します。
exec sdo_net.generate_partition_blobs( network->'NYC_NET', ,-- network name link_level ->1, -- link level partition_blob_table_name->'NYC_PBLOB$', -- partition blob table name includeUserdata->FALSE, -- include user data in partition blobs? log_loc->'MYDIR', -- partition log directory log_file->'nyc_part.log', --partition log file name open_mode->'a'); -- partition log file open mode
例5-9 パーティション・キャッシュを含むロード・オンデマンド環境の構成
例5-9には、パーティション・キャッシュを含む、ロード・オンデマンド環境の構成を行うXMLを示します。
<?xml version="1.0" encoding="UTF-8" ?>
<LODConfigs xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns ="http://xmlns.oracle.com/spatial/network"
version = "12.1">
<!--The new xml configuration schema takes the version number. If the version attribute is missing, then we assume it is 11.2 or lower. -->
<!-- default configuration for networks not configured -->
<LODConfig globalNetworkName="$DEFAULT$" networkName="$DEFAULT$">
<networkIO>
<geometryTolerance>0.000001</geometryTolerance>
<readPartitionFromBlob>false</readPartitionFromBlob>
<partitionBlobTranslator>
<className>oracle.spatial.network.lod.PartitionBlobTranslator11gR2</className>
<parameters></parameters>
</partitionBlobTranslator>
<userDataIO categoryId="0">
<className>oracle.spatial.network.lod.LODUserDataIOSDO</className>
<parameters></parameters>
</userDataIO>
<cachingPolicy linkLevel="1">
<maxNodes>500000</maxNodes>
<residentPartitions></residentPartitions>
<flushRule>
<className>oracle.spatial.network.lod.LRUCachingHandler</className>
<parameters></parameters>
</flushRule>
</cachingPolicy>
</networkIO>
<networkAnalysis>
<linkLevelSelector>
<className>oracle.spatial.network.lod.DummyLinkLevelSelector</className>
<parameters></parameters>
</linkLevelSelector>
<withinCostPolygonTolerance>0.05</withinCostPolygonTolerance>
</networkAnalysis>
</LODConfig>
<LODConfig globalNetworkName="SAMPLE_NETWORK" networkName="SAMPLE_NETWORK">
<networkIO>
<geometryTolerance>0.000001</geometryTolerance>
<readPartitionFromBlob>true</readPartitionFromBlob>
<partitionBlobTranslator>
<className>oracle.spatial.router.ndm.RouterPartitionBlobTranslator11gR2</className>
<parameters></parameters>
</partitionBlobTranslator>
<userDataIO categoryId="0">
<className>oracle.spatial.network.lod.LODUserDataIOSDO</className>
<parameters></parameters>
</userDataIO>
<userDataIO categoryId="1">
<className>oracle.spatial.router.ndm.RouterUserDataIO</className>
<parameters></parameters>
</userDataIO>
<cachingPolicy linkLevel="1">
<maxNodes>200000</maxNodes>
<residentPartitions></residentPartitions>
<flushRule>
<className>oracle.spatial.network.lod.LRUCachingHandler</className>
<parameters></parameters>
</flushRule>
</cachingPolicy>
<cachingPolicy linkLevel="2">
<maxNodes>800000</maxNodes>
<residentPartitions>0</residentPartitions>
<flushRule>
<className>oracle.spatial.network.lod.LRUCachingHandler</className>
<parameters></parameters>
</flushRule>
</cachingPolicy>
</networkIO>
<networkAnalysis>
</networkAnalysis>
</LODConfig>
</LODConfigs>
例5-10 ロード・オンデマンド構成のリロード(Java API)
例5-10および例5-11には、それぞれロード・オンデマンド構成のリロードに使用するJava APIおよびPL/SQL APIを示します。
InputStream config = ClassLoader.getSystemResourceAsStream( "netlodcfg.xml"); LODNetworkManager.getConfigManager().loadConfig(config);
例5-11 ロード・オンデマンド構成のリロード(PL/SQL API)
EXECUTE SDO_NET.LOAD_CONFIG('WORK_DIR', 'netlodcfg.xml');
例5-12 推定パーティション・サイズの取得
例5-12では、指定したネットワーク・パーティションの推定サイズ(バイト単位)を戻します。
SELECT SDO_NET.GET_PARTITION_SIZE ( NETWORK->'NYC_NET', PARTITION_ID->1, LINK_LEVEL ->1, INCLUDE_USER_DATA->'FALSE', INCLUDE_SPATIAL_DATA->'TRUE') FROM DUAL;
例5-13 ネットワーク分析: 最短パス(LOD Java API)
例5-13では、ロード・オンデマンドのJava API (oracle.spatial.network.lod)を使用して、ネットワーク上の最短パスの問合せを発行します。
Connection conn = LODNetworkManager.getConnection(dbUrl, dbUser, dbPassword); // get LOD network IO Adapter String networkName = "NYC_NET"; NetworkIO reader = LODNetworkManager.getCachedNetworkIO(conn, networkName, networkName, null); // get analysis module NetworkAnalyst analyst = LODNetworkManager.getNetworkAnalyst(reader); // compute the shortest path LogicalSubPath path = analyst.shortestPathDijkstra(new PointOnNet(startNodeId), new PointOnNet(endNodeId), null); // print path result PrintUtility.print(System.out, path, false, 0, 0); . . .
例5-14 ネットワーク分析: 最短パス(XML API)
例5-14では、XML API (oracle.spatial.network.xml)を使用して、ネットワーク上の最短パスの問合せを発行します。これには、要求と応答が含まれます。
<?xml version="1.0" encoding="UTF-8"?> <ndm:networkAnalysisRequest xmlns:ndm="http://xmlns.oracle.com/spatial/network" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml"> <ndm:networkName>NYC_NET</ndm:networkName> <ndm:shortestPath> <ndm:startPoint> <ndm:nodeID>65</ndm:nodeID> </ndm:startPoint> <ndm:endPoint> <ndm:nodeID>115</ndm:nodeID> </ndm:endPoint> <ndm:subPathRequestParameter> <ndm:isFullPath> true </ndm:isFullPath> <ndm:startLinkIndex> true </ndm:startLinkIndex> <ndm:startPercentage> true </ndm:startPercentage> <ndm:endLinkIndex> true </ndm:endLinkIndex> <ndm:endPercentage> true </ndm:endPercentage> <ndm:geometry>false</ndm:geometry> <ndm:pathRequestParameter> <ndm:cost> true </ndm:cost> <ndm:isSimple> true </ndm:isSimple> <ndm:startNodeID>true</ndm:startNodeID> <ndm:endNodeID>true</ndm:endNodeID> <ndm:noOfLinks>true</ndm:noOfLinks> <ndm:linksRequestParameter> <ndm:onlyLinkID>true</ndm:onlyLinkID> </ndm:linksRequestParameter> <ndm:nodesRequestParameter> <ndm:onlyNodeID>true</ndm:onlyNodeID> </ndm:nodesRequestParameter> <ndm:geometry>true</ndm:geometry> </ndm:pathRequestParameter> </ndm:subPathRequestParameter> </ndm:shortestPath> </ndm:networkAnalysisRequest> <?xml version = '1.0' encoding = 'UTF-8'?> <ndm:networkAnalysisResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ndm="http://xmlns.oracle.com/spatial/network" xmlns:gml="http://www.opengis.net/gml"> <ndm:networkName>NYC_NET</ndm:networkName> <ndm:shortestPath> <ndm:subPathResponse> <ndm:isFullPath>true</ndm:isFullPath> <ndm:startLinkIndex>0</ndm:startLinkIndex> <ndm:startPercentage>0.0</ndm:startPercentage> <ndm:endLinkIndex>17</ndm:endLinkIndex> <ndm:endPercentage>1.0</ndm:endPercentage> <ndm:pathResponse> <ndm:cost>6173.212694405703</ndm:cost> <ndm:isSimple>true</ndm:isSimple> <ndm:startNodeID>65</ndm:startNodeID> <ndm:endNodeID>115</ndm:endNodeID> <ndm:noOfLinks>18</ndm:noOfLinks> <ndm:linkIDs>145477046 145477044 145477042 145477039 145476926 145476930 145480892 145480891 145476873 145476871 145477023 145489019 145489020 145476851 145488986 145488987 145476913 145476905 </ndm:linkIDs> <ndm:nodeIDs>65 64 60 57 58 61 71 70 73 87 97 95 91 101 102 104 117 120 115 </ndm:nodeIDs> <ndm:geometry> <gml:LineString> <gml:coordinates>-71.707462,43.555262 -71.707521,43.555601… </gml:coordinates> </gml:LineString> </ndm:geometry> </ndm:pathResponse> </ndm:subPathResponse> </ndm:shortestPath> </ndm:networkAnalysisResponse>
この項では、ネットワークのユーザー定義データの使用例を示します(ユーザー定義データとは、ユーザーがネットワーク表現と関連付ける(接続性とは関係のない)情報です)。USER_SDO_NETWORK_USER_DATAメタデータ・ビューとALL_SDO_NETWORK_USER_DATAメタデータ・ビュー(「xxx_SDO_NETWORK_USER_DATAビュー」を参照)のどちらにも、ユーザー定義データに関する情報が含まれます。
ユーザー定義データを使用するには、該当するxxx_SDO_NETWORK_METADATAビュー(「xxx_SDO_NETWORK_METADATAビュー」を参照)のUSER_DEFINED_DATA列の値にY
を設定する必要があります。
例5-15 ユーザー定義データのネットワーク・メタデータへの挿入
例5-15では、PL/SQL APIを使用して、リンク関連のユーザー定義データをネットワーク・メタデータに挿入します。
-- Insert link user data named 'interaction' of -- type varchar2 (50) in network 'bi_test'. --'interaction' is a column of type varchar2(50) in the link table of network 'bi_ test'. insert into user_sdo_network_user_data (network,table_type, data_name, data_type, data_length, category_id) values ('bi_test', 'LINK', 'interaction', 'VARCHAR2', 50, 0) ; -- insert link user data named 'PROB' of type Number. --'PROB' is a column of type NUMBER in the link table of network 'bi_test'. insert into user_sdo_network_user_data (network,table_type,data_name,data_type, category_id) values ('bi_test','LINK','PROB','NUMBER', 0) ;
ネットワークまたはネットワーク・パーティションがロードされた後に、ユーザー定義データをJava表現で使用できます。ユーザー定義データにアクセスするには、Node
、Link
、Path
およびSubPath
インタフェースのgetCategorizedUserData
メソッドおよびsetCategorizedUserData
メソッドを使用します。次に例を示します。
// The user data index is the sequence number of a user data within a category // sorted by data name. int interactionUserDataIndex = 0; int probUserDataIndex = 1; String interaction = (String)link.getCategorizedUserData().getUserData(0). get(interactionUseDataIndex); double prob = ((Double)link.getCategorizedUserData().getUserData(0). get(probUserdataIndex)).doubleValue();
例5-16 LODUserDataIOインタフェースのwriteUserDataメソッドの実装
例5-16では、LODUserDataIO
インタフェースのカスタム・ユーザー・データI/O実装(デフォルト以外の実装)のJava APIを使用します。リンクに関連付けられたユーザー・データがBLOB (各パーティションごとに1つのBLOB)に書き込まれ、分析中にBLOBからから読み込まれます。この例では、次を前提としています。
各パーティションのマルチモーダル・データに対するユーザー定義データのBLOBには、パーティションIDとパーティションに関連付けられたリンクの数が含まれ、その後に各リンクの<Link ID, link route ID>が含まれます。
ユーザー定義データのBLOB表の名前は、MULTIMODAL_USER_DATAです。
//Method getLinksInPartition(partitionId) computes a vector that // consists of the ID and the route ID of each link associated with a partition // with ID = partitionId LinkVector = getLinksInPartition(partitionId); ObjectOutputStream dout = null; //Insert an empty blob for the partition with ID = partition_id String insertStr = "INSERT INTO " + MULTIMODAL_USER_DATA + " (partition_id, blob) " + " VALUES " + " (?, EMPTY_BLOB())" ; PreparedStatement stmt = conn.prepareStatement(insertStr); stmt.setInt(1,partitionId); int n = stmt.executeUpdate(); stmt.close(); //lock the row for blob update String lockRowStr = "SELECT blob FROM " + MULTIMODAL_USER_DATA + " WHERE partition_id = ? " + " FOR UPDATE"; stmt = conn.prepareStatement(lockRowStr); stmt.setInt(1,partitionId); ResultSet rs = stmt.executeQuery(); rs.next(); oracle.sql.BLOB userDataBlob = (oracle.sql.BLOB) rs.getBlob(1); stmt.close(); OutputStream blobOut = ((oracle.sql.BLOB) userDataBlob).setBinaryStream(1); dout = new ObjectOutputStream(blobOut); //write partition ID dout.writeInt(partitionId); int numLinks = linkVector.size() for (int i=0; i<linkVector.size(); i++) { //MultimodalLink is a class with variables link ID and route ID MultimodalLink link = (MultimodalLink) linkVector.elementAt(i); //write link ID dout.writeLong(link.getLinkId()); // write route ID into file dout.writeInt(link.getRouteId()); } dout.close(); blobOut.close(); rs.close();
例5-17 LODUserDataIOインタフェースのreadUserDataメソッドの実装
例5-17では、ユーザー定義データにアクセスするには、Node
、Link
、Path
およびSubPath
インタフェースのgetCategorizedUserData
メソッドおよびsetCategorizedUserData
メソッド、およびCategorizedUserData
インタフェースのgetUserData
メソッドおよびsetUserData
メソッドを使用します。
//Read the blob for the required partition from the user data blob table // In this example, // MULTIMODAL_USER_DATA is the name of user –defined data blob table BLOB multimodalBlob = null; String queryStr = "SELECT blob FROM " + MULTIMODAL_USER_DATA " WHERE partition_id = ?"; PreparedStatement stmt = conn.prepareStatement(queryStr); stmt.setInt(1,partitionId); ResultSet rs = stmt.executeQuery(); if (rs.next()) { multimodalBlob = (oracle.sql.BLOB)rs.getBlob(1); } // Materialize the blob value as an input stream InputStream is = multimodalBlob.getBinaryStream(); //Create an ObjectInputStream that reads from the InputStream is ObjectInputStream ois = new ObjectInputStream(is); //Read the values of partition ID and number of links from the blob int partitionId = ois.readInt(); int numLinks = ois.readInt(); for (int i=0; i<numLinks; i++) { //Read link ID and route ID for each link long linkId = ois.readLong(); int routeId = ois.readInt(); //MultimodalLinkUserData is an implementation of NDM LOD UserData interface //Implementation is provided at the end of the example linkUserData = new MultimodalLinkUserData(routeId); //Get the link object corresponding to the link ID LogicalNetLink link = partition.getLink(linkId); //Get the (categorized) user data associated with the link. CategorizedUserData cud = link.getCategorizedUserData(); // If the link does not have categorized user data associated with it, // initialize it to linkUserData // Else, set the user data for category USER_DATA_MULTIMODAL // to linkUserData if (cud == null) { UserData [] userDataArray = {linkUserData}; cud = new CategorizedUserDataImpl(userDataArray); link.setCategorizedUserData(cud); } else { cud.setUserData(USER_DATA_MULTIMODAL,linkUserData); } }
次の例では、分析中にユーザー定義データ(リンクに関連付けられたルートID)を読み取る方法を示します。
//info is an instance of LODAnalysisInfo LogicalLink currentLink = info.getCurrentLink(); //Read the user-defined data (in this case, route ID) int linkRouteId = (Integer)currentLink.getCategorizedUserData(). getUserData(USER_DATA_MULTIMODAL). get(INDEX_LINK_ROUTEID);
MultimodalLinkUserData
インタフェースの実装は次のとおりです。
class MultimodalLinkUserData implements UserData { private int routeId; protected MultimodalLinkUserData(int routeId) { this.routeId = routeId; } public Object get(int index) { switch(index) { case INDEX_LINK_ROUTEID: return routeId; } return null; } public void set(int index, Object userData) { switch(index) { case INDEX_LINK_ROUTEID: this.routeId = (Integer) userData; } } public int getNumberOfUserData() { return 1; } public Object clone() { return new MultimodalLinkUserData(routeId); } }
Oracle Technology Networkのhttp://www.oracle.com/technetwork/database-options/spatialandgraph
には、ネットワーク・データ・モデル・グラフを含む、Oracle Spatial and Graphテクノロジを開始する場合に役立つ貴重なリソースへのリンクが提供されています。ネットワーク・データ・モデル・グラフのリソースには、次のものが含まれます。
ネットワーク・データ・モデル・グラフのチュートリアル(http://www.oracle.com/technetwork/indexes/samplecode/spatial-1433316.html
にあるndm_tutorial.zip
)は、ネットワークの設定と構成を行う手順および分析を行う手順の概要を説明します。また、サンプル・コードと、Oracle Mapを使用して分析結果を表示する方法を説明するWebアプリケーションも含まれています。
NDMのホワイト・ペーパー(『A Load-On-Demand Approach to Handling Large Networks in the Oracle Spatial and Graph Network Data Model Graph』)では、詳細な説明と例を提供します。