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に保存します。列BODYとBODY_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=')

e-Gov法令検索リニューアル後
replace(replace(BODY_URL, 'https://laws.e-gov.go.jp/law/'),'/','_')

作成をクリックします。


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

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


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

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


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

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

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


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

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

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


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


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


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


92行がロードされます。他の法令分類とは異なり、憲法は改正されない限り92行は変わらないでしょう。(実際には1_xml.zipには憲法以外も含まれるため、ロードされる行は変わります。)


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


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

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

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

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


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

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

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


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

バックグラウンド実行の進捗を確認するため、ビュー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_MESSAGEやSO_FARに処理の進捗が表示されるようにコードを記述しています。ページをリロードして対話モード・レポートを再表示すると、処理の進捗を確認できます。


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


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

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

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

完