2024年4月11日木曜日

日本の法令データをデータベースにロードする

e-Gov法令検索のサイトからダウンロードできるXMLの法令データを、データベースにロードするAPEXアプリケーションを作ってみます。


最初から全ての法令データをロードしようとすると時間がかかるので、憲法のデータを使ってアプリケーションを作成します。アプリケーションが完成したら全ての法令データをデータベースにロードしてみます。

法令分類データの憲法をダウンロードします。1_xml.zipがダウンロードされます。


ダウンロードした1_xml.zipには、法令の一覧が記載されている1.csvというCSVファイルと、法令本文であるXMLファイルがそれぞれ個別のディレクトリの下に含まれています。

ディレクトリ名と法令本文のファイル名は同じで、XMLファイルには.xmlの拡張子が付けられています。例えば法令番号昭和二十一年憲法にあたるファイルは以下です。

321CONSTITUTION_19470503_000000000000000/321CONSTITUTION_19470503_000000000000000.xml


CSVに記載されている一覧の情報と法令本文であるXMLファイルを、以下の表JLAW_DATAに保存します。列BODYBODY_HASHはXMLファイルの情報なので、CSVファイルには含まれません。列IDは列BODY_URL(CSVでは本文URL)の一部を取り出して割り当てます。

上記の表を作成した後、この表に法令データをロードするAPEXアプリケーションを作成します。

アプリケーション作成ウィザードを起動します。作成するアプリケーションの名前e-Gov法令とします。デフォルトで追加されているホーム・ページ削除し、代わりに表JLAW_DATAをソースとした対話モード・レポートのページを追加します。


対話モード・レポートのページ名法令表またはビューとしてJLAW_DATAを選択します。フォームは不要なので、フォームを含めるチェックしません


以上でアプリケーションの作成を実行します。

アプリケーションが作成されたら、最初にデータ・ロード定義を作成します。

共有コンポーネントデータ・ロード定義を開きます。


作成をクリックします。


データ・ロードの作成最初から行います。

へ進みます。


データ・ロード定義の名前LOAD_CSVとします。ターゲット・タイプ表名JLAW_DATAを選択します。

へ進みます。


ソース・タイプファイルのアップロードとし、サンプル・ファイルとしてダウンロードした法令データに含まれる1.csvを選択します。

へ進みます。


列見出し最初の行にヘッダーが含まれるにチェックを入れます。列のマッピングについては、表JLAW_DATAのDDLのコメントにマップ先とソース列の対応が記載されています。


主キー列は後で本文URLからSQL式を用いて生成します。そのため、ここでは主キーにチェックを入れる列はありません。

データ・ロードの作成をクリックします。


データ・ロード定義としてLOAD_CSVが作成されます。これを編集します。


静的IDは大文字および小文字のどちらでもよいのですが、大文字のLOAD_CSVに変更します。ケース・センシティブなので、大文字小文字で異なっていると、別の定義と見做されます。設定ロード・メソッドマージを選択します。

データ・プロファイルの編集を開きます。


列の追加をクリックします。


主キー列IDに保存する値を設定します。

列タイプSQL式を選択します。名前IDです。データ型VARCHAR2長さ40とします。設定主キーオンにします。

ソースSQL式として以下を記述します。本文URLの引数にlawidとして指定されている値を主キー列IDに設定します。

replace(BODY_URL, 'https://elaws.e-gov.go.jp/document?lawid=')

作成をクリックします。


データ・プロファイルに列IDが追加されました。

変更の適用をクリックします。


以上でデータ・ロード定義LOAD_CSVは完成です。

変更の適用をクリックします。


CSVファイルをロードするページを作成します。

ページ作成ウィザードを開きます。

データのロードを選択します。


ページの名前CSVのロードとします。データ・ロード属性データ・ロードに先ほど作成したLOAD_CSVを選択します。データのアップロード元ファイル最大ファイル・サイズ(MB)10を入力します。すべての法令データに含まれるCSVファイルのサイズはほぼ6MBなので、それをロードできるサイズにしています。

ナビゲーションはデフォルトから変更せず、ブレッドクラムとナビゲーションの双方を作成します。

ページの作成をクリックします。


作成されたページを実行し、1.csvを表JLAW_DATAにロードします。


ファイルの選択をクリックし、1.csvを選択します。


プレビューが表示されます。データのロードをクリックします。


92行がロードされます。他の法令分類とは異なり、憲法は改正されない限り92行は変わらないでしょう。


ホーム・ページの対話モード・レポートにも、ロードされたデータが一覧されます。


XMLファイルをロードする機能を追加します。

ページ・デザイナでホーム・ページを開きます。

その都度、e-Gov法令のページから法令データをダウンロードするのは手間なので、URLを入力して、ZIPファイルのダウンロードからデータのロードまで一気に行うようにします。

URLを入力するページ・アイテムとしてP1_URLを作成します。識別タイプテキスト・フィールドラベルURL設定サブタイプとしてURLを選択します。


法令データのロードを実行するボタンLOADを作成します。

ラベルLoad外観ホットオンにします。テンプレート・オプションを開き、WidthStretchに変更します。

動作アクションはデフォルトのページの送信とし、データのロードはプロセスとして実装します。比較的重い処理が実行されるため、確認の要求オンにし、確認メッセージとして法令データをロードしますか?を設定します。


長時間の処理になることがあるため、データのロードはバックグラウンドで実行します。

バックグラウンド実行の進捗を確認するため、ビューAPEX_APPL_PAGE_BG_PROC_STATUSを一覧する対話モード・レポートを作成します。

識別タイトル進捗とし、ソースタイプSQL問合せSQL問合せとして以下を記述します。

select * from APEX_APPL_PAGE_BG_PROC_STATUS


プロセス・ビューを開き、法令データをロードするプロセスを作成します。

最初にバックグラウンドで実行するため、実行チェーンを作成します。

プロセスを作成します。識別名前法令データのロードタイプは実行チェーンとします。

設定バックグラウンドで実行オンにします。サーバー側の条件ボタン押下時LOADを指定します。


実行チェーンに小プロセスを作成します。

識別名前Load e-Gov CSV and XMLタイプコードの実行とし、ソースPL/SQLコードに以下を記述します。



以上でアプリケーションは完成です。

データベースにロードする法令データのリンクのアドレスをコピーします。


コピーしたURLを入力し、ボタンLoadをクリックしてデータベースへの取り込みを開始します。確認のためのポップアップが表示されるので、OKをクリックします。


ビューAPEX_APPL_PAGE_BG_PROC_STATUSの列STATUS_MESSAGESO_FARに処理の進捗が表示されるようにコードを記述しています。ページをリロードして対話モード・レポートを再表示すると、処理の進捗を確認できます。


すべての法令データをデータベースにロードするには、大体1時間弱ほどの時間がかかりました。


今回作成したアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/sample-e-gov-law-loading.zip

今の所、取り込んだXML形式の法令データの使い道は思いつかないのですが、少々複雑な形式のデータをデータベースに取り込む手順の参考になるかと思います。

Oracle APEXのアプリケーション作成の参考になれば幸いです。