(57)【要約】【課題】データ構造を対する複数の操作を並行して行うことを可能とする情報処理プログラム、情報処理装置及び情報処理方法を提供する。【解決手段】木構造で構成されたデータ構造の各階層における親ノードそれぞれに対応する子ノードのうちの長男ノード以外を、ロック制御を行う場合の対象ノードとして設定し、データ構造におけるノードに対応付けられたデータに対して操作を行う場合において、対象ノードを親ノードから子ノードに向けて通過する処理を行う場合、対象ノードに対してロックを行う。【選択図】図２０
2019101518.tif 000002
【特許請求の範囲】
【請求項１】
木構造で構成されたデータ構造においてロック制御を行う情報処理プログラムであって、
前記データ構造の各階層における親ノードそれぞれに対応する子ノードのうちの長男ノード以外を、ロック制御を行う場合の対象ノードとして設定し、
前記データ構造におけるノードに対応付けられたデータに対して操作を行う場合において、前記対象ノードを親ノードから子ノードに向けて通過する処理を行う場合、前記対象ノードに対してロックを行う、
処理をコンピュータに実行させることを特徴とする情報処理プログラム。
【請求項２】
請求項１において、
前記データの先頭には、前記データ構造における根ノードから前記データが対応付けられたノードまでの間の枝に対応付けられたデータが、前記根ノードに近い順に含まれており、
前記データは、各データが深さ優先探索において辞書式順になるように各ノードに対応付けられる、
ことを特徴とする情報処理プログラム。
【請求項３】
請求項２において、
前記木構造は、Ｆｕｌｌ  Ｂｌｏｓｓｏｍ  Ｔｒｅｅである、
ことを特徴とする情報処理プログラム。
【請求項４】
請求項１において、
前記対象ノードとして設定する処理では、前記データ構造における根ノードと、前記根ノード以外の第１対象ノードと、前記第１対象ノードの子孫ノードである第２対象ノードとを前記対象ノードとして設定し、
前記ロックを行う処理では、前記第１対象ノードに対してロックが行われている場合において、前記第２対象ノードを親ノードから子ノードに向けて通過する処理が行われた場合、前記第２対象ノードに対してロックを行うとともに、前記第１対象ノードに対して行われているロックを解除する、
ことを特徴とする情報処理プログラム。
【請求項５】
請求項１において、
前記ロックを行う処理では、
前記データ構造におけるノードに対応付けられたデータに対して操作を行う場合において、前記長男ノードを親ノードから子ノードに向けて通過する処理が行われる場合、前記長男ノードを子ノードから親ノードに向けて通過する処理が、前記長男ノードを親ノードから子ノードに向けて通過する処理の後に行われるか否かを判定し、
前記長男ノードを子ノードから親ノードに向けて通過する処理が、前記長男ノードを親ノードから子ノードに向けて通過する処理の後に行われないと判定した場合、前記長男ノードに対してロックを行う、
ことを特徴とする情報処理プログラム。
【請求項６】
請求項５において、
前記ロックを行う処理では、前記長男ノードに対してロックを行うとともに、前記長男ノードの親ノードに対して行われているロックを解除する、
ことを特徴とする情報処理プログラム。
【請求項７】
請求項１において、
前記データの検索、前記データの挿入及び前記データの削除のうちのいずれかの処理である、
ことを特徴とする情報処理プログラム。
【請求項８】
木構造で構成されたデータ構造においてロック制御を行う情報処理装置であって、
前記データ構造の各階層における親ノードそれぞれに対応する子ノードのうちの長男ノード以外を、ロック制御を行う場合の対象ノードとして設定する対象ノード設定部と、
前記データ構造におけるノードに対応付けられたデータに対して操作を行う場合において、前記対象ノードを親ノードから子ノードに向けて通過する処理を行う場合、前記対象ノードに対してロックを行うロック実行部と、を有する、
ことを特徴とする情報処理装置。
【請求項９】
木構造で構成されたデータ構造においてロック制御を行う情報処理方法であって、
前記データ構造の各階層における親ノードそれぞれに対応する子ノードのうちの長男ノード以外を、ロック制御を行う場合の対象ノードとして設定し、
前記データ構造におけるノードに対応付けられたデータに対して操作を行う場合において、前記対象ノードを親ノードから子ノードに向けて通過する処理を行う場合、前記対象ノードに対してロックを行う、
ことを特徴とする情報処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理プログラム、情報処理装置及び情報処理方法に関する。
【背景技術】
【０００２】
利用者にサービスを提供する事業者（以下、単に事業者とも呼ぶ）は、例えば、利用者に対するサービスの提供に用いられるデータ（以下、検索対象データとも呼ぶ）を格納するデータベースを用いた情報処理システムを構築する。
【０００３】
上記のような情報処理システムにおいて検索対象データの検索を行う場合、情報処理システムでは、検索対象データの検索を効率的に行うために、例えば、木構造で構成されたデータ構造からなるインデックスの参照することによる検索が行われる。その後、情報処理システムでは、インデックスに含まれるデータ構造を検索対象データの検索結果が反映された形に更新する（例えば、特許文献１乃至３参照）。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２０１０−０２６６８９号公報
【特許文献２】特開平９−３１９６４２号公報
【特許文献３】特開２０１１−２４８５８４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
ここで、上記のようなインデックスに含まれるデータ構造では、例えば、複数の操作（例えば、データに対する参照や更新）が並行して行われる場合であってもデータ構造の整合性が確保されるように、操作対象のノードに対してロックを行う必要がある。
【０００６】
しかしながら、上記のようなデータ構造には、複数の操作が並行して行われる場合に、上位階層のノードから下位階層のノードに向けて行われる処理（以下、第１の処理とも呼ぶ）と、下位階層のノードから上位階層のノードに向けて行われる処理（以下、第２の処理とも呼ぶ）とがそれぞれ行われるものが含まれる。そのため、このようなデータ構造では、第１の処理と第２の処理とが同時に行われる場合、これらの処理に伴うロックによってデッドロックが発生する可能性がある。
【０００７】
したがって、第１の処理と第２の処理とがそれぞれ行われるデータ構造を含むインデックスが用いられる場合、情報処理システムでは、デッドロックの発生を防ぐ必要性から、データ構造に対する複数の操作を並行して行うことができない。そのため、情報処理システムでは、データ構造に対する各操作を効率的に行うことができない場合がある。
【０００８】
そこで、一つの側面では、本発明は、データ構造を対する複数の操作を並行して行うことを可能とする情報処理プログラム、情報処理装置及び情報処理方法を提供することを目的とする。
【課題を解決するための手段】
【０００９】
実施の形態の一態様では、木構造で構成されたデータ構造においてロック制御を行う情報処理プログラムであって、前記データ構造の各階層における親ノードそれぞれに対応する子ノードのうちの長男ノード以外を、ロック制御を行う場合の対象ノードとして設定し、前記データ構造におけるノードに対応付けられたデータに対して操作を行う場合において、前記対象ノードを親ノードから子ノードに向けて通過する処理を行う場合、前記対象ノードに対してロックを行う、処理をコンピュータに実行させる。
【発明の効果】
【００１０】
一つの側面によれば、データ構造を対する複数の操作を並行して行うことを可能とする。
【図面の簡単な説明】
【００１１】
【図１】図１は、情報処理システム１０の構成を示す図である。
【図２】図２は、インデックス１３１のデータ構造の具体例について説明する図である。
【図３】図３は、インデックス１３１のデータ構造の具体例について説明する図である。
【図４】図４は、インデックス１３１のデータ構造の具体例について説明する図である。
【図５】図５は、インデックス１３１のデータ構造の具体例について説明する図である。
【図６】図６は、インデックス１３１のデータ構造の具体例について説明する図である。
【図７】図７は、インデックス１３１のデータ構造の具体例について説明する図である。
【図８】図８は、インデックス１３１のデータ構造の具体例について説明する図である。
【図９】図９は、インデックス１３１のデータ構造の具体例について説明する図である。
【図１０】図１０は、インデックス１３１のデータ構造の具体例について説明する図である。
【図１１】図１１は、インデックス１３１のデータ構造の具体例について説明する図である。
【図１２】図１２は、管理装置１のハードウエア構成を示す図である。
【図１３】図１３は、管理装置１の機能ブロック図である。
【図１４】図１４は、第１の実施の形態におけるロック制御処理の概略を説明するフローチャート図である。
【図１５】図１５は、第１の実施の形態におけるロック制御処理の概略を説明するフローチャート図である。
【図１６】図１６は、第１の実施の形態におけるロック制御処理の詳細を説明するフローチャート図である。
【図１７】図１７は、第１の実施の形態におけるロック制御処理の詳細を説明するフローチャート図である。
【図１８】図１８は、第１の実施の形態におけるロック制御処理の詳細を説明するフローチャート図である。
【図１９】図１９は、図２で説明したデータ構造に対して対象ノードの設定を行った場合を説明する具体例である。
【図２０】図２０は、第１の実施の形態におけるロック制御処理の具体例を説明する図である。
【図２１】図２１は、第１の実施の形態におけるロック制御処理の具体例を説明する図である。
【図２２】図２２は、第１の実施の形態におけるロック制御処理の具体例を説明する図である。
【図２３】図２３は、第１の実施の形態におけるロック制御処理の具体例を説明する図である。
【図２４】図２４は、第１の実施の形態におけるロック制御処理の具体例を説明する図である。
【図２５】図２５は、図７で説明したデータ構造に対して対象ノードの設定を行った場合を説明する他の具体例である。
【図２６】図２６は、第１の実施の形態におけるロック制御処理の具体例を説明する図である。
【図２７】図２７は、第１の実施の形態におけるロック制御処理の具体例を説明する図である。
【図２８】図２８は、第１の実施の形態におけるロック制御処理の具体例を説明する図である。
【図２９】図２９は、第１の実施の形態におけるロック制御処理の具体例を説明する図である。
【図３０】図３０は、第１の実施の形態におけるロック制御処理の具体例を説明する図である。
【発明を実施するための形態】
【００１２】
［情報処理システムの構成］
初めに、情報処理システム１０の構成について説明を行う。図１は、情報処理システム１０の構成を示す図である。
【００１３】
図１に示す情報処理システム１０は、例えば、管理装置１と、検索装置２ａ及び２ｂと、データベース３ａ及び３ｂと、操作端末５ａ、５ｂ及び５ｃとを有する。データベース３ａは、検索装置２ａによって操作が行われるデータＤＴ１を格納するデータベースであり、データベース３ｂは、検索装置２ｂによって操作が行われるデータＤＴ２（例えば、データＤＴ１と異なるデータ）を格納するデータベースである。以下、検索装置２ａ及び２ｂを総称して検索装置２とも呼び、データベース３ａ及び３ｂを総称してデータベース３とも呼び、操作端末５ａ、５ｂ及び５ｃを総称して操作端末５とも呼び、データＤＴ１及びＤＴ２を総称してデータＤＴとも呼ぶ。
【００１４】
管理装置１は、操作端末５からデータＤＴに対するクエリ（データＤＴに対する参照クエリや更新クエリ）を受信した場合、検索装置２ａ及び２ｂのそれぞれに対して受信したクエリを送信する。
【００１５】
具体的に、管理装置１は、操作端末５からデータＤＴに対するクエリを受信した場合、記憶部１３０に記憶されたインデックス１３１を参照し、受信したクエリに対応する情報が含まれているか否かを判定する。そして、管理装置１は、受信したクエリに対応する情報が含まれていないと判定した場合、受信したクエリをそのまま検索装置２に送信する。一方、管理装置１は、受信したクエリに対応する情報が含まれていると判定した場合、インデックスに含まれている情報（例えば、検索対象データの物理アドレス）を検索装置２に送信する。
【００１６】
これにより、管理装置１は、クエリに対応する処理の実行を効率化させ、クエリに対応する処理の実行に要する時間を短縮させることが可能になる。
【００１７】
検索装置２は、管理装置１から受信したクエリに基づいて、データベース３に記憶されたデータＤＴに対する操作（データＤＴに対する参照や更新）を行う。
【００１８】
［インデックスのデータ構造の具体例（１）］
次に、インデックス１３１のデータ構造の具体例について説明を行う。図２から図１１は、インデックス１３１のデータ構造の具体例について説明する図である。以下、インデックス１３１のデータ構造が木構造の一種であるＦｕｌｌ  Ｂｌｏｓｓｏｍ  Ｔｒｅｅによって構成されているものとして説明を行う。
【００１９】
Ｆｕｌｌ  Ｂｌｏｓｓｏｍ  Ｔｒｅｅによって構成されるデータ構造では、根ノード以外の各ノードとデータ（ラベル）とが対応付けられている。具体的に、図２に示すデータ構造において、例えば、根ノードに対応する子ノードには、「ａａｂ」及び「ｂｂａａ」からなるデータがそれぞれ対応付けられている。
【００２０】
また、Ｆｕｌｌ  Ｂｌｏｓｓｏｍ  Ｔｒｅｅによって構成されるデータ構造では、各ノード間の枝とデータとが対応付けられている。具体的に、図２に示すデータ構造において、例えば、根ノードと「ａａｂ」に対応するノードとの間の枝には、「ａ」からなるデータが対応付けられている。
【００２１】
また、Ｆｕｌｌ  Ｂｌｏｓｓｏｍ  Ｔｒｅｅによって構成されるデータ構造において、各ノードに対応付けられているデータの先頭には、根ノードに近い順に、根ノードと各ノードとの間に存在する枝に対応付けられているデータが含まれている。具体的に、図２に示すデータ構造において、例えば、根ノードと「ｂｂａｃ」に対応するノードとの間には、「ｂｂａｃ」の先頭の文字である「ｂ」に対応する枝と、「ｂｂａｃ」の２番目の文字である「ｂ」に対応する枝と、「ｂｂａｃ」の３番目の文字である「ａ」に対応する枝とがそれぞれ存在している。
【００２２】
さらに、Ｆｕｌｌ  Ｂｌｏｓｓｏｍ  Ｔｒｅｅによって構成されるデータ構造では、深さ優先探索において辞書式順になるように、各データが各ノードに対応付けられている。図２に含まれる他のノード、データ及び枝の説明については省略する。
【００２３】
［データの挿入が行われる際の処理の具体例（１）］
次に、データの挿入が行われる際の処理の具体例について説明を行う。以下、図２で説明したデータ構造に対して、「ｂｂａ」からなるデータ（以下、挿入データとも呼ぶ）の挿入が行われる場合について説明を行う。
【００２４】
管理装置１は、通過した各枝に対応付けられたデータを根ノードから近い順に連結したデータが、挿入データのうちの少なくとも先頭部分に対応するデータと一致するように、操作対象のノードを、根ノードから末端ノード（子ノードを持たないノード）のいずれかに向けて遷移させる（以下、この処理をｐｈａｓｅ１−１とも呼ぶ）。
【００２５】
すなわち、ｐｈａｓｅ１−１で操作対象ノードの遷移が行われた各ノードは、いずれも挿入データを対応付けることが可能なノードである。そのため、管理装置１は、ｐｈａｓｅ１−１で操作対象ノードの遷移が行われた各ノードを、挿入データを対応付ける可能性があるノードとして特定する。
【００２６】
具体的に、図３（Ａ）に示す例において、例えば、根ノードと「ｂｂａａ」に対応するノードとの間の枝、「ｂｂａａ」に対応するノードと「ｂｂａｂ」に対応するノードとの間の枝、及び、「ｂｂａｂ」に対応するノードと「ｂｂａｃ」に対応するノードとの間の枝は、それぞれ「ｂ」、「ｂ」及び「ａ」である。そして、「ｂｂａｃ」に対応するノードは、末端ノードであり、かつ、先頭部分に対応するデータが「ｂｂａ」である。そのため、管理装置１は、この場合、操作対象のノードを、根ノードから「ｂｂａｃ」に対応するノードまで遷移させる。
【００２７】
次に、管理装置１は、長男ノード以外のノード、または、挿入データが親ノードに対応付けられたデータよりも辞書式順において大きくなるまで、操作対象のノードを、ｐｈａｓｅ１−１で遷移させた末端ノードから根ノードに向けて遷移させる（以下、この処理をｐｈａｓｅ１−２とも呼ぶ）。
【００２８】
すなわち、ｐｈａｓｅ１−１で操作対象ノードの遷移が行われた各ノードのうち、挿入データよりも小さいデータが対応付けられたノードは、挿入データを対応付ける可能性がないノードである。また、長男ノード以外のノードの親ノードは、後述するように、挿入データを対応付ける可能性がないノードである。そのため、管理装置１は、ｐｈａｓｅ１−２で操作対象ノードが最終的に遷移したノードを、挿入データを対応付けるノードとして特定する。
【００２９】
具体的に、図３（Ｂ）に示す例において、「ｂｂａｂ」に対応するノードは、「ｂｂａｂ」に対応するノード及び「ｂｃ」に対応するノードのうちの長男ノードである。そして、図３（Ｂ）に示す例において、挿入データである「ｂｂａ」は、「ｂｂａｃ」に対応するノードの親ノードに対応付けられた「ｂｂａａ」よりも小さい。また、図３（Ｂ）に示す例において、「ｂｂａａ」に対応するノードは、「ａａｂ」に対応するノード及び「ｂｂａａ」に対応するノードのうちの長男ノード以外のノードである。そのため、管理装置１は、この場合、ｐｈａｓｅ１−１で遷移させた末端ノード（「ｂｂａｃ」に対応するノード）から「ｂｂａａ」に対応するノードに向けて、操作対象ノードを遷移させる。
【００３０】
続いて、管理装置１は、ｐｈａｓｅ１−２で遷移したノードに対応付けられたデータと挿入データとを入れ替える。そして、ｐｈａｓｅ１−２で遷移したノードの子孫ノードについても同様の処理を行う（以下、この処理をｐｈａｓｅ１−３とも呼ぶ）。
【００３１】
具体的に、管理装置１は、図４（Ａ）に示すように、ｐｈａｓｅ１−２で操作対象ノードが最終的に遷移したノードに対応付けられたデータである「ｂｂａａ」と、挿入データである「ｂｂａ」とを入れ替える。そして、管理装置１は、入れ替えられたデータである「ｂｂａａ」を新たな挿入データとして特定する。
【００３２】
次に、管理装置１は、図４（Ａ）に示すように、「ｂｂａ」に対応するノード（挿入ノードと対応付けられたノード）の子ノードであって、ｐｈａｓｅ１−１で操作対象ノードの遷移が行われたノードである「ｂｂａｂ」に対応するデータと、挿入データである「ｂｂａａ」とを入れ替える。そして、管理装置１は、入れ替えられたデータである「ｂｂａｂ」を新たな挿入データとする。
【００３３】
さらに、管理装置１は、図４（Ａ）に示すように、「ｂｂａａ」に対応するノード（挿入ノードと対応付けられたノード）の子ノードであって、ｐｈａｓｅ１−１で操作対象ノードの遷移が行われたノードである「ｂｂａｃ」に対応するデータと、挿入データである「ｂｂａｂ」とを入れ替える。そして、管理装置１は、入れ替えられたデータである「ｂｂａｃ」を新たな挿入データとする。
【００３４】
その後、管理装置１は、ｐｈａｓｅ１−１で遷移させた末端ノードの先に新たなノードを生成し、生成した新たなノードに挿入データを対応付ける（以下、この処理をｐｈａｓｅ１−４とも呼ぶ）。
【００３５】
具体的に、管理装置１は、図４（Ｂ）に示すように、ｐｈａｓｅ１−１で操作対象ノードの遷移が行われた末端ノードである「ｂｂａｂ」に対応するノードの先に新たなノードを生成し、挿入データである「ｂｂａｃ」を対応付ける。
【００３６】
なお、ｐｈａｓｅ１−１において、末端ノードが根ノードである場合、または、挿入データがｐｈａｓｅ１−１で操作対象ノードの遷移が行われた末端ノードに対応付けられたデータよりも大きい場合、管理装置１は、ｐｈａｓｅ１−２及びｐｈａｓｅ１−３を行わずにｐｈａｓｅ１−４を行う。
【００３７】
［データの削除が行われる際の処理の具体例（１）］
次に、データの削除が行われる際の処理の具体例について説明を行う。以下、図２で説明したデータ構造に含まれるデータのうち、「ｂｂａａ」からなるデータ（以下、削除データとも呼ぶ）の削除が行われる場合について説明を行う。
【００３８】
管理装置１は、通過した各枝に対応付けられたデータを根ノードから近い順に連結したデータが、挿入データのうちの少なくとも先頭部分に対応するデータと一致するように、操作対象のノードを、根ノードから末端ノードのいずれかに向けて遷移させる（以下、この処理をｐｈａｓｅ２−１とも呼ぶ）。
【００３９】
具体的に、図５（Ａ）に示す例において、例えば、根ノードと「ｂｂａａ」に対応するノードとの間の枝、「ｂｂａａ」に対応するノードと「ｂｂａｂ」に対応するノードとの間の枝、及び、「ｂｂａｂ」に対応するノードと「ｂｂａｃ」に対応するノードとの間の枝は、それぞれ「ｂ」、「ｂ」及び「ａ」である。そして、「ｂｂａｃ」に対応するノードは、末端ノードであり、かつ、先頭部分に対応するデータが「ｂｂａ」である。そのため、管理装置１は、この場合、操作対象のノードを、根ノードから「ｂｂａｃ」に対応するノードまで遷移させる。
【００４０】
次に、管理装置１は、削除データが対応付けられたノードに到達するまで、操作対象のノードを、ｐｈａｓｅ２−１で遷移させた末端ノードから根ノードに向けて遷移させる（以下、この処理をｐｈａｓｅ２−２とも呼ぶ）。
【００４１】
具体的に、図５（Ｂ）に示す例において、削除ノードである「ｂｂａａ」は、「ｂｂａｂ」に対応するノードの親ノードに対応するデータと一致する。また、図５（Ｂ）に示す例において、「ｂｂａｂ」は、「ｂｂａｃ」に対応するノードの親ノードに対応するデータである。そのため、管理装置１は、この場合、ｐｈａｓｅ２−１で遷移させた末端ノード（「ｂｂａｃ」に対応するノード）から「ｂｂａａ」に対応するノードまで操作対象ノードを遷移させる。
【００４２】
なお、長男ノード以外のノードに到達しても削除データと一致するデータが存在しなかった場合、管理装置１は、削除データが存在しないものと判定する。
【００４３】
続いて、管理装置１は、ｐｈａｓｅ２−２で操作対象ノードが最終的に遷移したノードの子ノードに対応付けられたデータを、ｐｈａｓｅ２−２で操作対象ノードが最終的に遷移したノードに対応付ける。そして、管理装置１は、ｐｈａｓｅ２−２で操作対象ノードが最終的に遷移したノードの子ノードに対応付けられたデータを削除する。さらに、管理装置１は、ｐｈａｓｅ２−２で操作対象ノードが最終的に遷移したノードの子孫ノードについても同様の処理を行う（以下、この処理をｐｈａｓｅ２−３とも呼ぶ）。
【００４４】
具体的に、管理装置１は、図６（Ａ）に示すように、「ｂｂａｂ」及び「ｂｂａｃ」が対応付けられるノードを、図５（Ａ）等に示す例において「ｂｂａａ」及び「ｂｂａｂ」が対応付けられていたノードに変更する。
【００４５】
その後、管理装置１は、ｐｈａｓｅ２−１で操作対象ノードが最終的に遷移した末端ノードを削除する（以下、この処理をｐｈａｓｅ２−４とも呼ぶ）。
【００４６】
具体的に、管理装置１は、図６（Ｂ）に示すように、図５（Ａ）等に示す例において「ｂｂａｃ」が対応付けられていたノードを削除する。
【００４７】
なお、データの検索が行われる際の処理は、データの削除が行われる際の処理におけるｐｈａｓｅ２−１及びｐｈａｓｅ２−２と同じである。そのため、データの検索が行われる際の処理の具体例の説明については省略する。
【００４８】
［インデックスのデータ構造の具体例（２）］
次に、インデックス１３１のデータ構造の他の具体例について説明を行う。
【００４９】
図７に示す例では、図２で説明したデータ構造に含まれるデータのうち、「ｂｂａａ」が「ｂａｂ」に置き換えられている。また、図７に示す例では、図２で説明したデータ構造に対して、「ｂａｂ」に対応するノードの子ノード（「ｂａｃ」に対応するノード）が追加されている。
【００５０】
［データの挿入が行われる際の処理の具体例（２）］
初めに、データの挿入が行われる際の処理の他の具体例について説明を行う。以下、図７で説明したデータ構造に対して、「ｂｂａ」からなる挿入データの挿入が行われる場合について説明を行う。
【００５１】
管理装置１は、通過した各枝に対応付けられたデータを根ノードから近い順に連結したデータが、挿入データのうちの少なくとも先頭部分に対応するデータと一致するように、操作対象のノードを、根ノードから末端ノードのいずれかに向けて遷移させる（ｐｈａｓｅ１−１）。
【００５２】
具体的に、図８（Ａ）に示す例において、根ノードと「ｂａｂ」に対応するノードとの間の枝、「ｂａｂ」に対応するノードと「ｂｂａｂ」に対応するノードとの間の枝、及び、「ｂｂａｂ」に対応するノードと「ｂｂａｃ」に対応するノードとの間の枝は、それぞれ「ｂ」、「ｂ」及び「ａ」である。そして、「ｂｂａｃ」に対応するノードは、末端ノードであり、かつ、先頭部分に対応するデータが「ｂｂａ」である。そのため、管理装置１は、この場合、操作対象のノードを、根ノードから「ｂｂａｃ」に対応するノードまで遷移させる。
【００５３】
次に、管理装置１は、長男ノード以外のノード、または、挿入データが親ノードに対応付けられたデータよりも辞書式順において大きくなるまで、操作対象のノードを、ｐｈａｓｅ１−１で遷移させた末端ノードから根ノードに向けて遷移させる（ｐｈａｓｅ１−２）。
【００５４】
具体的に、図８（Ｂ）に示す例において、「ｂｂａｂ」に対応するノードは、「ｂａｃ」に対応するノード、「ｂｂａｂ」に対応するノード及び「ｂｃ」に対応するノードのうちの長男ノード以外のノードである。そのため、管理装置１は、この場合、ｐｈａｓｅ１−１で遷移させた末端ノード（「ｂｂａｃ」に対応するノード）から「ｂｂａｂ」に対応するノードに向けて、操作対象ノードを遷移させる。
【００５５】
すなわち、「ｂｂａｂ」に対応するノードが長男ノード以外のノードである場合、「ｂｂａｂ」に対応するノードと親ノードとの間の枝に対応付けられたデータである「ｂ」は、長男ノード（「ｂａｃ」に対応するノード）と親ノードとの間の枝に対応付けられたデータである「ａ」と異なる。そして、「ｂｂａｂ」に対応するノードの親ノードに対応付けられたデータである「ｂａｂ」は、長男ノードに対応付けられたデータである「ｂａｃ」よりも小さい。そのため、この場合、「ｂｂａｂ」に対応するノードの親ノードに対応付けられたデータである「ｂａｂ」は、挿入データである「ｂｂａ」よりも常に小さくなる。
【００５６】
したがって、管理装置１は、この場合、「ｂｂａｂ」に対応するノードの親ノードに対応付けられたデータに対して挿入データを対応付ける可能性はないと判定することが可能である。そのため、管理装置１は、ｐｈａｓｅ１−２で長男ノード以外のノードに到達した場合、操作対象ノードの遷移を終了する。
【００５７】
続いて、管理装置１は、ｐｈａｓｅ１−２で操作対象ノードが最終的に遷移したノードに対応付けられたデータと挿入データとを入れ替える。そして、ｐｈａｓｅ１−２で操作対象ノードが最終的に遷移ノードの子孫ノードについても同様の処理を行う（ｐｈａｓｅ１−３）。
【００５８】
具体的に、管理装置１は、図９（Ａ）に示すように、ｐｈａｓｅ１−２で操作対象ノードが最終的に遷移したノードに対応付けられたデータである「ｂｂａｂ」と、挿入データである「ｂｂａ」とを入れ替える。そして、管理装置１は、入れ替えられたデータである「ｂｂａｂ」を新たな挿入データとする。
【００５９】
そして、管理装置１は、図９（Ａ）に示すように、「ｂｂａ」に対応するノードの子ノードであって、ｐｈａｓｅ１−１で操作対象ノードの遷移が行われたノードである「ｂｂａｃ」に対応するデータと、挿入データである「ｂｂａｂ」とを入れ替える。そして、管理装置１は、入れ替えられたデータである「ｂｂａｃ」を新たな挿入データとする。
【００６０】
その後、管理装置１は、ｐｈａｓｅ１−１で操作対象ノードの遷移が行われた末端ノードの先に新たなノードを生成し、挿入データを対応付ける（ｐｈａｓｅ１−４）。
【００６１】
具体的に、管理装置１は、図９（Ｂ）に示すように、ｐｈａｓｅ１−１で遷移させた末端ノードである「ｂｂａｂ」に対応するノードの先に新たなノードを生成し、挿入データである「ｂｂａｃ」を対応付ける。
【００６２】
［データの削除が行われる際の処理の具体例（２）］
次に、データの削除が行われる際の処理の他の具体例について説明を行う。以下、図７で説明したデータ構造に含まれるデータのうち、「ｂｂａａ」からなるデータ（以下、削除データとも呼ぶ）の削除が行われる場合について説明を行う。
【００６３】
管理装置１は、通過した各枝に対応付けられたデータを根ノードから近い順に連結したデータが、挿入データのうちの少なくとも先頭部分に対応するデータと一致するように、操作対象のノードを、根ノードから末端ノードのいずれかに向けて遷移させる（ｐｈａｓｅ２−１）。
【００６４】
具体的に、図１０（Ａ）に示す例において、根ノードと「ｂａｂ」に対応するノードとの間の枝、「ｂａｂ」に対応するノードと「ｂｂａｂ」に対応するノードとの間の枝、及び、「ｂｂａｂ」に対応するノードと「ｂｂａｃ」に対応するノードとの間の枝は、それぞれ「ｂ」、「ｂ」及び「ａ」である。そして、「ｂｂａｃ」に対応するノードは、末端ノードであり、かつ、先頭部分に対応するデータが「ｂｂａ」である。そのため、管理装置１は、この場合、操作対象のノードを、根ノードから「ｂｂａｃ」に対応するノードまで遷移させる。
【００６５】
次に、管理装置１は、削除データが対応付けられたノードに到達するまで、操作対象のノードを、ｐｈａｓｅ２−１で遷移させた末端ノードから根ノードに向けて遷移させる（ｐｈａｓｅ２−２）。
【００６６】
具体的に、図１０（Ｂ）に示す例において、削除ノードである「ｂｂａｂ」は、「ｂｂａｃ」に対応するノードの親ノードに対応するデータと一致する。そのため、管理装置１は、この場合、ｐｈａｓｅ２−１で遷移させた末端ノード（「ｂｂａｃ」に対応するノード）から「ｂｂａｂ」に対応するノードまで操作対象ノードを遷移させる。
【００６７】
続いて、管理装置１は、ｐｈａｓｅ２−２で操作対象ノードが最終的に遷移したノードの子ノードに対応付けられたデータを、ｐｈａｓｅ２−２で操作対象ノードが最終的に遷移したノードに対応付ける。そして、管理装置１は、ｐｈａｓｅ２−２で操作対象ノードが最終的に遷移したノードの子ノードに対応付けられたデータを削除する。さらに、管理装置１は、ｐｈａｓｅ２−２で操作対象ノードが最終的に遷移したノードの子孫ノードについても同様の処理を行う（ｐｈａｓｅ２−３）。
【００６８】
具体的に、管理装置１は、図１１（Ａ）に示すように、「ｂｂａｃ」が対応付けられるノードを、図１０（Ａ）等に示す例において「ｂｂａｂ」が対応付けられていたノードに変更する。
【００６９】
その後、管理装置１は、ｐｈａｓｅ２−１で操作対象ノードが最終的に遷移した末端ノードを削除する（ｐｈａｓｅ２−４）。
【００７０】
具体的に、管理装置１は、図１１（Ｂ）に示すように、図１０（Ａ）等に示す例において「ｂｂａｃ」が対応付けられていたノードを削除する。
【００７１】
ここで、上記のようなインデックス１３１では、データ構造に含まれる各ノードに対して複数の操作が並行して行われる場合、データ構造の整合性が確保されるように、操作が行われるノードに対してロックを行う必要がある。
【００７２】
しかしながら、上記のようなデータ構造には、例えば、上位階層のノードから下位階層のノードに向けて行われる処理（第１の処理）と、下位階層のノードから上位階層のノードに向けて行われる処理（第２の処理）とがそれぞれ行われるものが含まれる。そして、このようなデータ構造では、第１の処理と第２の処理とが同時に行われる場合、これらの処理に伴うロックによってデッドロックが発生する可能性がある。
【００７３】
そのため、第１の処理と第２の処理とがそれぞれ行われるデータ構造のインデックス１３１が用いられる場合、情報処理システム１０では、デッドロックの発生を防ぐ必要性から、データ構造に対する複数の操作を並行して行うことができない。したがって、情報処理システム１０では、データ構造に対する各操作を効率的に行うことができない場合がある。
【００７４】
そこで、本実施の形態における管理装置１は、木構造で構成されたデータ構造の各階層における親ノードそれぞれに対応する子ノードのうちの長男ノード以外を、ロック制御を行う場合の対象ノードとして設定する。そして、管理装置１は、データ構造におけるノードに対応付けられたデータに対して操作を行う場合において、対象ノードを親ノードから子ノードに向けて通過する処理を行う場合、対象ノードに対してロックを行う。
【００７５】
すなわち、管理装置１は、上位階層のノードから下位階層のノードに向けて行われる処理（例えば、図３等で説明したｐｈａｓｅ１−１）が行われる際に、この処理の実行中において必要なノードに対するロックを行う。そして、管理装置１は、この場合、下位階層のノードから上位階層のノードに向けて行われる処理（例えば、図３等で説明したｐｈａｓｅ１−２）の実行中において必要なノードに対するロックについても併せて行う。一方、管理装置１は、下位階層のノードから上位階層のノードに向けて行われる処理が行われる際においては、この処理の実行中において必要なノードに対するロックを行わない。
【００７６】
これにより、管理装置１は、デッドロックの発生を防止しながら、データに対する複数の操作を並行して行うことが可能になる。そのため、管理装置１は、データに対する各操作を効率的に行うことが可能になる。
【００７７】
［情報処理システムのハードウエア構成］
次に、情報処理システム１０のハードウエア構成について説明する。図１２は、管理装置１のハードウエア構成を示す図である。
【００７８】
管理装置１は、図１２に示すように、プロセッサであるＣＰＵ１０１と、メモリ１０２と、外部インターフェース（Ｉ／Ｏユニット）１０３と、記憶媒体１０４とを有する。各部は、バス１０５を介して互いに接続される。
【００７９】
記憶媒体１０４は、例えば、記憶媒体１０４内のプログラム格納領域（図示しない）に、データ構造に含まれるノードに対してロックを行う処理（以下、ロック制御処理とも呼ぶ）を行うためのプログラム１１０を記憶する。また、記憶媒体１０４は、例えば、ロック制御処理を行う際に用いられる情報を記憶する記憶部１３０（以下、情報格納領域１３０とも呼ぶ）を有する。
【００８０】
ＣＰＵ１０１は、記憶媒体１０４からロードされたプログラム１１０と協働してロック制御処理を行う。また、外部インターフェース１０３は、例えば、検索装置２や操作端末５と通信を行う。
【００８１】
［情報処理システムの機能］
次に、情報処理システム１０の機能について説明する。図１３は、管理装置１の機能ブロック図である。
【００８２】
管理装置１のＣＰＵ１０１は、図１３に示すように、プログラム１１０と協働することにより、例えば、対象ノード設定部１１１と、データ操作部１１２と、ロック実行部１１３と、データ操作部１１２と、ロック解除部１１４として動作する。また、情報格納領域１３０には、例えば、インデックス１３１（インデックス１３１のデータ構造）が記憶されている。
【００８３】
対象ノード設定部１１１は、インデックス１３１のデータ構造の各階層における親ノードそれぞれに対応する子ノードのうちの長男ノード以外を、ロック制御を行う場合の対象ノードとして設定する。
【００８４】
データ操作部１１２は、例えば、操作端末５からのクエリの受信に応じて、インデックス１３１のデータ構造に含まれる各ノード（各ノードに対応付けられているデータ）に対して操作を行う。具体的に、データ操作部１１２は、例えば、インデックス１３１のデータ構造に含まれるデータの挿入、削除または検索を行う。
【００８５】
ロック実行部１１３は、データ操作部１１２がインデックス１３１のデータ構造に含まれるデータに対して操作を行う場合において、対象ノード設定部１１１が設定した対象ノードを親ノードから子ノードに向けて通過する処理を行う場合、その対象ノードに対してロックを行う。
【００８６】
ロック解除部１１４は、対象ノード設定部１１１が設定した対象ノード（以下、第１対象ノードとも呼ぶ）に対してロックが行われている場合において、第１対象ノードの子孫ノードである第２対象ノードを親ノードから子ノードに向けて通過する処理が行われた場合、第１対象ノードに対して行われているロックを解除する。
【００８７】
［第１の実施の形態の概略］
次に、第１の実施の形態の概略について説明を行う。図１４及び図１５は、第１の実施の形態におけるロック制御処理の概略を説明するフローチャート図である。
【００８８】
管理装置１は、図１４に示すように、データ操作タイミングまで待機する（Ｓ１のＮＯ）。データ操作タイミングは、例えば、操作端末５からのクエリの受信に応じて、インデックス１３１のデータ構造に含まれるデータに対する操作が行われるタイミングである。
【００８９】
そして、データ操作タイミングになった場合（Ｓ１のＹＥＳ）、管理装置１は、木構造で構成されたデータ構造の各階層における親ノードそれぞれに対応する子ノードのうちの長男ノード以外を、ロック制御を行う場合の対象ノードとして設定する（Ｓ２）。
【００９０】
その後、管理装置１は、図１５に示すように、Ｓ２の処理で設定した対象ノードを親ノードから子ノードに向けて通過する処理の実行を検知するまで待機する（Ｓ１１のＮＯ）。
【００９１】
そして、Ｓ２の処理で設定した対象ノードを通過する処理の実行を検知した場合（Ｓ１１のＹＥＳ）、管理装置１は、Ｓ１１の処理において通過する処理が実行された対象ノードに対してロックを行う（Ｓ１２）。
【００９２】
すなわち、管理装置１は、上位階層のノードから下位階層のノードに向けて行われる処理が行われる際に、この処理の実行中において必要なノードに対するロックを行う。そして、管理装置１は、この場合、下位階層のノードから上位階層のノードに向けて行われる処理の実行中において必要なノードに対するロックを併せて行う。一方、管理装置１は、下位階層のノードから上位階層のノードに向けて行われる処理が行われる際においては、この処理の実行中において必要なノードに対するロックを行わない。
【００９３】
これにより、管理装置１は、デッドロックの発生を防止しながら、データに対する複数の操作を並行して行うことが可能になる。そのため、管理装置１は、データに対する各操作を効率的に行うことが可能になる。
【００９４】
［第１の実施の形態の詳細］
次に、第１の実施の形態の詳細について説明する。図１６から図１８は、第１の実施の形態におけるロック制御処理の詳細を説明するフローチャート図である。また、図１９から図３０は、第１の実施の形態におけるロック制御処理の詳細を説明する図である。図１９から図３０を参照しながら、図１６から図１８のロック制御処理の詳細について説明する。
【００９５】
管理装置１の対象ノード設定部１１１は、図１６に示すように、データ操作タイミングまで待機する（Ｓ３１のＮＯ）。
【００９６】
そして、データ操作タイミングになった場合（Ｓ３１のＹＥＳ）、対象ノード設定部１１１は、インデックス１３１のデータ構造における根ノードを、ロック制御を行う場合の対象ノードとして設定する（Ｓ３２）。
【００９７】
続いて、対象ノード設定部１１１は、インデックス１３１のデータ構造における親ノードそれぞれの子ノードのうちの長男ノード以外を、ロック制御を行う場合の対象ノードとして設定する（Ｓ３３）。
【００９８】
その後、管理装置１のデータ操作部１１２は、図１７に示すように、インデックス１３１のデータ構造に含まれるいずれかのノードを通過する処理（以下、特定の処理とも呼ぶ）を実行するタイミングになるまで待機する（Ｓ４１のＮＯ）。すなわち、データ操作部１１２は、例えば、操作端末５からのクエリの受信に伴って、インデックス１３１のデータ構造に含まれるデータに対する操作が発生するまで待機する。
【００９９】
そして、インデックス１３１のデータ構造に含まれるいずれかのノードを通過する処理を実行するタイミングになった場合（Ｓ４１のＹＥＳ）、データ操作部１１２は、特定の処理がいずれかのノードを親ノードから子ノードに向けて通過する処理であるか否かを判定する（Ｓ４２）。
【０１００】
具体的に、データ操作部１１２は、例えば、特定の処理がｐｈａｓｅ１−１やｐｈａｓｅ１−３であるか否かを判定する。
【０１０１】
その結果、特定の処理がいずれかのノードを親ノードから子ノードに向けて通過する処理でないと判定した場合（Ｓ４２のＮＯ）、データ操作部１１２は、Ｓ４１以降の処理を再度行う。
【０１０２】
すなわち、データ操作部１１２は、例えば、特定の処理がｐｈａｓｅ１−２である場合、特定の処理が実行時においてロックを行う必要がない処理であると判定する。
【０１０３】
一方、特定の処理がいずれかのノードを親ノードから子ノードに向けて通過する処理であると判定した場合（Ｓ４２のＹＥＳ）、データ操作部１１２は、特定の処理の後に、いずれかのノードを親ノードから子ノードに向けて通過する処理を実行するか否かを判定する（Ｓ４３）。
【０１０４】
具体的に、データ操作部１１２は、例えば、特定の処理がｐｈａｓｅ１−２を後に実行する処理か否かを判定する。
【０１０５】
その結果、特定の処理の後に、いずれかのノードを親ノードから子ノードに向けて通過する処理を実行すると判定した場合（Ｓ４３のＹＥＳ）、データ操作部１１２は、特定の処理において通過するノードが、Ｓ３２またはＳ３３の処理で設定した対象ノードであるか否かを判定する（Ｓ４４）。
【０１０６】
そして、特定の処理において通過するノードが、Ｓ３２またはＳ３３の処理で設定した対象ノードでないと判定した場合（Ｓ４４のＮＯ）、Ｓ４１以降の処理を再度行う。
【０１０７】
すなわち、データ操作部１１２は、例えば、特定の処理がｐｈａｓｅ１−１であって、特定の処理において通過するノードが対象ノードでない場合、特定の処理が実行時においてロックを行う必要がない処理であると判定する。
【０１０８】
一方、特定の処理において通過するノードが、Ｓ３２またはＳ３３の処理で設定した対象ノードであると判定した場合（Ｓ４４のＹＥＳ）、管理装置１のロック実行部１１３は、図１８に示すように、特定の処理において通過するノードに対してロックを行う（Ｓ５１）。
【０１０９】
また、ロック実行部１１３は、Ｓ４３の処理において、特定の処理の後に、いずれかのノードを親ノードから子ノードに向けて通過する処理を実行しないと判定した場合についても同様に（Ｓ４３のＮＯ）、Ｓ５１の処理を行う。
【０１１０】
すなわち、ロック実行部１１３は、例えば、特定の処理がｐｈａｓｅ１−１である場合（Ｓ４３のＹＥＳ）、特定の処理において通過するノードが対象ノードである場合に限り（Ｓ４４のＹＥＳ）、特定の処理においてノードに対してロックを行う。一方、ロック実行部１１３は、例えば、特定の処理がｐｈａｓｅ１−３である場合（Ｓ４３のＮＯ）、特定の処理において通過するノードが対象ノードであるか否かに関わらず、特定の処理においてノードに対してロックを行う。
【０１１１】
その後、管理装置１のロック解除部１１４は、インデックス１３１のデータ構造に含まれるノードのうち、ロックされているノードが他に存在しているか否かを判定する（Ｓ５２）。
【０１１２】
その結果、ロックされているノードが他に存在すると判定した場合（Ｓ５２のＹＥＳ）、ロック解除部１１４は、Ｓ５２の処理で存在すると判定したノードに対するロックを解除する（Ｓ５３）。一方、ロックされているノードが他に存在しないと判定した場合（Ｓ５２のＮＯ）、ロック解除部１１４は、Ｓ５３の処理を行わない。
【０１１３】
そして、管理装置１は、ロック制御処理を終了する。以下、第１の実施の形態におけるロック制御処理の具体例について説明を行う。
【０１１４】
［第１の実施の形態におけるロック制御処理の具体例］
図１９から図３０は、第１の実施の形態におけるロック制御処理の具体例を説明する図である。具体的に、図１９から図３０に示す例は、図２から図１１において説明したデータ構造に対してロック制御処理を実行した場合の例である。なお、以下、ロック実行部１１３によって行われるロックが更新ロックであるものとして説明を行う。
【０１１５】
［対象ノードの具体例（１）］
初めに、対象ノードの具体例について説明を行う。
【０１１６】
図１９は、図２で説明したデータ構造に対して対象ノードの設定を行う場合を説明する具体例である。以下、網掛けのノードが対象ノードであるものとして説明を行う。
【０１１７】
対象ノード設定部１１１は、図１９に示すように、根ノードを対象ノードとして設定する（Ｓ３２）。
【０１１８】
そして、対象ノード設定部１１１は、図１９に示すように、各ノードにおける子ノードのうちの長男ノード以外のノードを対象ノードとして設定する（Ｓ３３）。
【０１１９】
具体的に、対象ノード設定部１１１は、根ノードにおける子ノードである「ａａｂ」に対応するノード及び「ｂｂａａ」に対応するノードのうち、長男ノード以外のノードである「ｂｂａａ」に対応するノードを対象ノードとして設定する。また、対象ノード設定部１１１は、「ｂｂａａ」に対応するノードの子ノードである「ｂｂａｂ」に対応するノード及び「ｂｃ」に対応するノードのうち、長男ノード以外のノードである「ｂｃ」に対応するノードを対象ノードとして設定する。さらに、対象ノード設定部１１１は、「ｂｂａｂ」に対応するノードの子ノードである「ｂｂａｃ」に対応するノード及び「ｂｂｃ」に対応するノードのうち、長男ノード以外のノードである「ｂｂｃ」に対応するノードを対象ノードとして設定する。
【０１２０】
［本実施の形態におけるデータの挿入が行われる際の処理の具体例（１）］
次に、データの挿入が行われる際の処理の具体例について説明を行う。以下、図１９で説明したデータ構造に対して、「ｂｂａ」からなる挿入データの挿入が行われる場合について説明を行う。
【０１２１】
ロック実行部１１３は、ｐｈａｓｅ１−１が行われる場合、図２０（Ａ）に示すように、対象ノードである根ノードに対してロックを行う（Ｓ４３のＹＥＳ、Ｓ４４のＹＥＳ、Ｓ５１）。
【０１２２】
すなわち、例えば、操作端末５からの他のクエリの受信に応じてｐｈａｓｅ１−１が別途行われる場合、根ノードから順に操作対象ノードの遷移が行われる。そのため、ロック実行部１１３は、初めに根ノードに対するロックを行うことによって、図２０（Ａ）に示すデータ構造に含まれる全てのノードに対する実質的なロックを行う。
【０１２３】
そして、ｐｈａｓｅ１−１の実行に伴って、根ノードから「ｂｂａａ」に対応するノードに対する操作対象ノードの遷移が行われた場合、ロック実行部１１３は、図２０（Ｂ）に示すように、「ｂｂａａ」に対応するノードが対象ノードであるため、「ｂｂａａ」に対応するノードに対するロックを行う（Ｓ４３のＹＥＳ、Ｓ４４のＹＥＳ、Ｓ５１）。また、ロック解除部１１４は、この場合、根ノードに対して行われていたロックを解除する（Ｓ５２のＹＥＳ、Ｓ５３）。
【０１２４】
すなわち、「ｂｂａａ」に対応するノードは、根ノードの長男ノード以外のノードである。そのため、ｐｈａｓｅ１−１で根ノードから「ｂｂａａ」に対応するノードに対する遷移が行われた場合、ｐｈａｓｅ１−１の後に行われる処理（例えば、ｐｈａｓｅ１−２）では、根ノードに対する遷移が行われることはない。そのため、ｐｈａｓｅ１−１で根ノードから「ｂｂａａ」に対応するノードに対する遷移が行われた場合、管理装置１は、根ノードに対するロックを継続する必要がないと判定する。したがって、管理装置１は、この場合、「ｂｂａａ」に対応するノードに対してロックを行うとともに、根ノードに対するロックを解除する。
【０１２５】
これにより、管理装置１は、デッドロックの発生を防止するために行うノードのロックの範囲を最小限に抑えることが可能になる。そのため、管理装置１は、インデックス１３１のデータ構造に含まれるデータに対して複数の操作が並行して行われることを可能にするとともに、ノードに対するロックに伴って発生するロックの解除待ち時間を短縮することが可能になる。
【０１２６】
続いて、ｐｈａｓｅ１−１の実行に伴って、「ｂｂａａ」に対応するノードから「ｂｂａｂ」に対応するノードに対する遷移が行われた場合、ロック実行部１１３は、図２０（Ｂ）に示すように、「ｂｂａｂ」に対応するノードが対象ノードでないため、「ｂｂａｂ」に対応するノードに対するロックを行わない（Ｓ４３のＹＥＳ、Ｓ４４のＮＯ）。また、ロック解除部１１４は、この場合、「ｂｂａａ」に対応するノードに対して行われているロックの解除を行わない（Ｓ５２のＮＯ）。
【０１２７】
すなわち、「ｂｂａｂ」に対応するノードは、「ｂｂａａ」に対応するノードの長男ノードである。そのため、ｐｈａｓｅ１−１で「ｂｂａａ」に対応するノードから「ｂｂａｂ」に対応するノードに対する遷移が行われた場合、ｐｈａｓｅ１−１の後に行われる処理（例えば、ｐｈａｓｅ１−２）では、「ｂｂａａ」に対する遷移が行われる可能性がある。そのため、ｐｈａｓｅ１−１で「ｂｂａａ」に対応するノードから「ｂｂａｂ」に対応するノードに対する遷移が行われた場合、管理装置１は、「ｂｂａａ」に対応するノードに対するロックを継続する必要があると判定する。したがって、管理装置１は、この場合、「ｂｂａｂ」に対応するノードに対するロックや「ｂｂａａ」に対応するノードに対するロックの解除を行わない。
【０１２８】
次に、ｐｈａｓｅ１−１の実行に伴って「ｂｂａｂ」に対応するノードから「ｂｂａｃ」に対応するノードに対する遷移が行われた場合、ロック実行部１１３は、図２０（Ｂ）に示すように、「ｂｂａｃ」に対応するノードが対象ノードでないため、「ｂｂａｃ」に対応するノードに対するロックを行わない（Ｓ４３のＹＥＳ、Ｓ４４のＮＯ）。また、ロック解除部１１４は、この場合、「ｂｂａａ」に対応するノードに対して行われているロックの解除を行わない（Ｓ５２のＮＯ）。
【０１２９】
そして、ロック実行部１１３は、図２１（Ａ）に示すように、ｐｈａｓｅ１−２が実行される場合、新たなノードに対するロックを行わない（Ｓ４２のＮＯ）。
【０１３０】
すなわち、ロック実行部１１３は、ｐｈａｓｅ１−１の実行に伴って、ｐｈａｓｅ１−２の実行時において操作対象ノードが遷移する可能性があるノードの全てを実質的にロックしている。そのため、ロック実行部１１３は、ｐｈａｓｅ１−２の実行時においては、新たなノードに対するロックを行う必要がない。
【０１３１】
これにより、管理装置１は、各ノードを親ノードから子ノードに向けて通過する処理（ｐｈａｓｅ１−１やｐｈａｓｅ１−３）の実行に伴うロックと、各ノードを子ノードから親ノードに向けて通過する処理（ｐｈａｓｅ１−２）の実行に伴うロックとが並行して行われることを防止することが可能になる。そのため、管理装置１は、インデックス１３１のデータ構造に含まれるデータに対して複数の操作が並行して行われることを可能にするとともに、デッドロックの発生を防止することが可能になる。
【０１３２】
続いて、図２１（Ｂ）に示すように、ｐｈａｓｅ１−３の実行に伴って「ｂｂａ」に対応するノード（挿入データである「ｂｂａ」が対応付けられたノード）から「ｂｂａｂ」に対応するノードに対する遷移が行われた場合、ロック実行部１１３は、図２１（Ｂ）に示すように、「ｂｂａｂ」に対応するノードに対するロックを行う（Ｓ４３のＮＯ、Ｓ５１）。また、ロック解除部１１４は、この場合、「ｂｂａ」に対応するノードに対して行われていたロックを解除する（Ｓ５２のＹＥＳ、Ｓ５３）。
【０１３３】
すなわち、ｐｈａｓｅ１−３の後においては、「ｂｂａ」に対応するノードに遷移する処理が行われることはない。そのため、ｐｈａｓｅ１−３において、「ｂｂａ」に対応するノードから「ｂｂａｂ」に対応するノードに対する遷移が行われた場合、管理装置１は、「ｂｂａｂ」に対応するノードが長男ノードであるか否かに依らず、「ｂｂａ」に対応するノードに対するロックを継続する必要がないと判定する。したがって、ロック解除部１１４は、この場合、「ｂｂａｂ」に対応するノードに対するロックを行うとともに、「ｂｂａ」に対応するノードに対するロックを解除する。
【０１３４】
これにより、管理装置１は、デッドロックの発生を防止するために行うノードのロックの範囲を最小限に抑えることが可能になる。そのため、管理装置１は、インデックス１３１のデータ構造に含まれるデータに対して複数の操作が並行して行われることを可能にするとともに、ノードに対するロックに伴って発生するロックの解除待ち時間を短縮することが可能になる。
【０１３５】
そして、図２２（Ａ）に示すように、ｐｈａｓｅ１−３の実行に伴って、「ｂｂａａ」に対応するノード（挿入データである「ｂｂａａ」が対応付けられたノード）から「ｂｂａｃ」に対応するノードに対する遷移が行われた場合、ロック実行部１１３は、「ｂｂａｃ」に対応するノードに対するロックを行う（Ｓ４３のＮＯ、Ｓ５１）。また、ロック解除部１１４は、この場合、「ｂｂａａ」に対応するノードに対して行われていたロックを解除する（Ｓ５２のＹＥＳ、Ｓ５３）。
【０１３６】
その後、図２２（Ｂ）に示すように、ロック解除部１１４は、ｐｈａｓｅ１−４に対応する処理の実行に伴って、「ｂｂаｂ」に対応するノード（挿入データである「ｂｂａｂ」が対応付けられたノード）に対するロックを解除する。
【０１３７】
［本実施の形態におけるデータの削除が行われる際の処理の具体例（１）］
次に、データの削除が行われる際の処理の具体例について説明を行う。以下、図１９で説明したデータ構造に含まれるデータのうち、「ｂｂａａ」からなる削除データの削除が行われる場合について説明を行う。
【０１３８】
ロック実行部１１３は、ｐｈａｓｅ２−１が行われる場合、図２３（Ａ）に示すように、対象ノードである根ノードに対してロックを行う（Ｓ４３のＹＥＳ、Ｓ４４のＹＥＳ、Ｓ５１）。
【０１３９】
そして、ｐｈａｓｅ２−１の実行に伴って、根ノードから「ｂｂａａ」に対応するノードに対する遷移が行われた場合、ロック実行部１１３は、図２３（Ｂ）に示すように、「ｂｂａａ」に対応するノードが対象ノードであるため、「ｂｂａａ」に対応するノードに対するロックを行う（Ｓ４３のＹＥＳ、Ｓ４４のＹＥＳ、Ｓ５１）。また、ロック解除部１１４は、この場合、根ノードに対して行われていたロックを解除する（Ｓ５２のＹＥＳ、Ｓ５３）。
【０１４０】
続いて、ｐｈａｓｅ２−１の実行に伴って、「ｂｂａａ」に対応するノードから「ｂｂａｂ」に対応するノードに対する遷移が行われた場合、ロック実行部１１３は、図２３（Ｂ）に示すように、「ｂｂａｂ」に対応するノードが対象ノードでないため、「ｂｂａｂ」に対応するノードに対するロックを行わない（Ｓ４３のＹＥＳ、Ｓ４４のＮＯ）。また、ロック解除部１１４は、この場合、「ｂｂａａ」に対応するノードに対して行われているロックの解除を行わない（Ｓ５２のＮＯ）。
【０１４１】
次に、ｐｈａｓｅ２−１の実行に伴って、「ｂｂａｂ」に対応するノードから「ｂｂａｃ」に対応するノードに対する遷移が行われた場合、ロック実行部１１３は、図２３（Ｂ）に示すように、「ｂｂａｃ」に対応するノードが対象ノードでないため、「ｂｂａｃ」に対応するノードに対するロックを行わない（Ｓ４３のＹＥＳ、Ｓ４４のＮＯ）。また、ロック解除部１１４は、この場合、「ｂｂａａ」に対応するノードに対して行われているロックの解除を行わない（Ｓ５２のＮＯ）。
【０１４２】
続いて、ロック実行部１１３は、図２４（Ａ）に示すように、ｐｈａｓｅ２−２が実行される場合、新たなノードに対するロックを行わない（Ｓ４２のＮＯ）。
【０１４３】
その後、図２４（Ｂ）に示すように、ｐｈａｓｅ２−３の実行に伴って、「ｂｂａｂ」に対応するノード（「ｂｂａ」が新たに対応付けられたノード）から「ｂｂａｃ」に対応するノード（「ｂｂａｃ」が新たに対応付けられたノード）に対する遷移が行われた場合、ロック実行部１１３は、「ｂｂａｃ」に対応するノードに対するロックを行う（Ｓ４３のＮＯ、Ｓ５１）。また、ロック解除部１１４は、この場合、「ｂｂａｂ」に対応するノードに対して行われていたロックを解除する（Ｓ５２のＹＥＳ、Ｓ５３）。
【０１４４】
［対象ノードの具体例（２）］
次に、対象ノードの他の具体例について説明を行う。
【０１４５】
図２５は、図７で説明したデータ構造に対して対象ノードの設定を行う場合を説明する具体例である。
【０１４６】
対象ノード設定部１１１は、図２５に示すように、根ノードを対象ノードとして設定する（Ｓ３２）。
【０１４７】
そして、対象ノード設定部１１１は、図２５に示すように、各ノードの子ノードのうちの長男ノード以外のノードを対象ノードとして設定する（Ｓ３３）。
【０１４８】
具体的に、対象ノード設定部１１１は、根ノードの子ノードである「ａａｂ」に対応するノード及び「ｂａｂ」に対応するノードのうち、長男ノード以外のノードである「ｂａｂ」に対応するノードを対象ノードとして設定する。また、対象ノード設定部１１１は、「ｂａｂ」に対応するノードの子ノードである「ｂａｃ」に対応するノード、「ｂｂａｂ」に対応するノード及び「ｂｃ」に対応するノードのうち、長男ノード以外のノードである「ｂｂａｂ」に対応するノード及び「ｂｃ」に対応するノードを対象ノードとして設定する。さらに、対象ノード設定部１１１は、「ｂｂａｂ」に対応するノードの子ノードである「ｂｂａｃ」に対応するノード及び「ｂｂｃ」に対応するノードのうち、長男ノード以外のノードである「ｂｂｃ」に対応するノードを対象ノードとして設定する。
【０１４９】
［本実施の形態におけるデータの挿入が行われる際の処理の具体例（２）］
次に、データの挿入が行われる際の処理の具体例について説明を行う。以下、図２で説明したデータ構造に対して、「ｂｂａ」からなる挿入データの挿入が行われる場合について説明を行う。
【０１５０】
ロック実行部１１３は、ｐｈａｓｅ１−１が行われる場合、図２６（Ａ）に示すように、対象ノードである根ノードに対してロックを行う（Ｓ４３のＹＥＳ、Ｓ４４のＹＥＳ、Ｓ５１）。
【０１５１】
そして、ｐｈａｓｅ１−１の実行に伴って、根ノードから「ｂａｂ」に対応するノードに対する遷移が行われた場合、ロック実行部１１３は、図２６（Ｂ）に示すように、「ｂａｂ」に対応するノードが対象ノードであるため、「ｂａｂ」に対応するノードに対するロックを行う（Ｓ４３のＹＥＳ、Ｓ４４のＹＥＳ、Ｓ５１）。また、ロック解除部１１４は、この場合、根ノードに対して行われていたロックを解除する（Ｓ５２のＹＥＳ、Ｓ５３）。
【０１５２】
続いて、ｐｈａｓｅ１−１の実行に伴って、「ｂａｂ」に対応するノードから「ｂｂａｂ」に対応するノードに対する遷移が行われた場合、ロック実行部１１３は、図２７（Ａ）に示すように、「ｂｂａｂ」に対応するノードが対象ノードであるため、「ｂｂａｂ」に対応するノードに対するロックを行う（Ｓ４３のＹＥＳ、Ｓ４４のＹＥＳ、Ｓ５１）。そして、ロック解除部１１４は、この場合、「ｂａｂ」に対応するノードに対して行われているロックを解除する（Ｓ５２のＹＥＳ、Ｓ５３）。
【０１５３】
次に、ｐｈａｓｅ１−１の実行に伴って、「ｂｂａｂ」に対応するノードから「ｂｂａｃ」に対応するノードに対する遷移が行われた場合、ロック実行部１１３は、図２７（Ａ）に示すように、「ｂｂａｃ」に対応するノードが対象ノードでないため、「ｂｂａｃ」に対応するノードに対するロックを行わない（Ｓ４３のＹＥＳ、Ｓ４４のＮＯ）。また、ロック解除部１１４は、この場合、「ｂｂａａ」に対応するノードに対して行われているロックの解除を行わない（Ｓ５２のＮＯ）。
【０１５４】
そして、ロック実行部１１３は、図２７（Ｂ）に示すように、ｐｈａｓｅ１−２が実行される場合、新たなノードに対するロックを行わない（Ｓ４２のＮＯ）。
【０１５５】
続いて、図２８（Ａ）に示すように、ｐｈａｓｅ１−３の実行に伴って、「ｂｂａ」に対応するノード（挿入データである「ｂｂａ」が対応付けられたノード）から「ｂｂａｃ」に対応するノードに対する遷移が行われた場合、ロック実行部１１３は、「ｂｂａｃ」に対応するノードに対するロックを行う（Ｓ４３のＮＯ、Ｓ５１）。また、ロック解除部１１４は、この場合、「ｂｂａ」に対応するノードに対して行われていたロックを解除する（Ｓ５２のＹＥＳ、Ｓ５３）。
【０１５６】
その後、ｐｈａｓｅ１−４に対応する処理の実行に伴って、ロック解除部１１４は、図２８（Ｂ）に示すように、「ｂｂаｂ」に対応するノード（挿入データである「ｂｂａｂ」が対応付けられたノード）に対して行われているロックを解除する。
【０１５７】
［本実施の形態におけるデータの削除が行われる際の処理の具体例（２）］
次に、データの削除が行われる際の処理の具体例について説明を行う。以下、図１９で説明したデータ構造に含まれるデータのうち、「ｂｂａｂ」からなる削除データの削除が行われる場合について説明を行う。
【０１５８】
ロック実行部１１３は、ｐｈａｓｅ２−１が行われる場合、図２９（Ａ）に示すように、対象ノードである根ノードに対してロックを行う（Ｓ４３のＹＥＳ、Ｓ４４のＹＥＳ、Ｓ５１）。
【０１５９】
そして、ｐｈａｓｅ２−１の実行に伴って、根ノードから「ｂａｂ」に対応するノードに対する遷移が行われた場合、ロック実行部１１３は、「ｂａｂ」に対応するノードが対象ノードであるため、「ｂａｂ」に対応するノードに対するロックを行う（Ｓ４３のＹＥＳ、Ｓ４４のＹＥＳ、Ｓ５１）。また、ロック解除部１１４は、この場合、根ノードに対して行われていたロックを解除する（Ｓ５２のＹＥＳ、Ｓ５３）。
【０１６０】
次に、ｐｈａｓｅ２−１の実行に伴って、「ｂａｂ」に対応するノードから「ｂｂａｂ」に対応するノードに対する遷移が行われた場合、ロック実行部１１３は、図２９（Ｂ）に示すように、「ｂｂａｂ」に対応するノードが対象ノードであるため、「ｂｂａｂ」に対応するノードに対するロックを行う（Ｓ４３のＹＥＳ、Ｓ４４のＹＥＳ、Ｓ５１）。そして、ロック解除部１１４は、この場合、「ｂａｂ」に対応するノードに対して行われているロックを解除する（Ｓ５２のＹＥＳ、Ｓ５３）。
【０１６１】
さらに、ｐｈａｓｅ２−１の実行に伴って、「ｂｂａｂ」に対応するノードから「ｂｂａｃ」に対応するノードに対する遷移が行われた場合、ロック実行部１１３は、図２９（Ｂ）に示すように、「ｂｂａｃ」に対応するノードが対象ノードでないため、「ｂｂａｃ」に対応するノードに対するロックを行わない（Ｓ４３のＹＥＳ、Ｓ４４のＮＯ）。また、ロック解除部１１４は、この場合、「ｂｂａａ」に対応するノードに対して行われているロックの解除を行わない（Ｓ５２のＮＯ）。
【０１６２】
続いて、ロック実行部１１３は、図３０（Ａ）に示すように、ｐｈａｓｅ２−２が実行される場合、新たなノードに対するロックを行わない（Ｓ４２のＮＯ）。
【０１６３】
その後、ｐｈａｓｅ２−３の実行に伴って、ロック解除部１１４は、図３０（Ｂ）に示すように、「ｂｂａｃ」に対応するノード（「ｂｂａｃ」が新たに対応付けられたノード）に対して行われていたロックを解除する（Ｓ５２のＹＥＳ、Ｓ５３）。
【０１６４】
このように、本実施の形態における管理装置１は、木構造で構成されたデータ構造の各階層における親ノードそれぞれに対応する子ノードのうちの長男ノード以外を、ロック制御を行う場合の対象ノードとして設定する。そして、管理装置１は、データ構造におけるノードに対応付けられたデータに対して操作を行う場合において、対象ノードを親ノードから子ノードに向けて通過する処理を行う場合、対象ノードに対してロックを行う。
【０１６５】
すなわち、管理装置１は、上位階層のノードに対応するデータから下位階層のノードに対応するデータに向けて行われる処理が行われる際に、この処理の実行中において必要なノードに対するロックを行う。そして、管理装置１は、この場合、下位階層のノードに対応するデータから上位階層のノードに対応するデータに向けて行われる処理の実行中において必要なノードに対するロックを併せて行う。一方、管理装置１は、下位階層のノードに対応するデータから上位階層のノードに対応するデータに向けて行われる処理が行われる際においては、この処理の実行中において必要なノードに対するロックを行わない。
【０１６６】
これにより、管理装置１は、デッドロックの発生を防止しながら、データに対する複数の操作を並行して行うことが可能になる。そのため、管理装置１は、データに対する各操作を効率的に行うことが可能になる。
【０１６７】
なお、例えば、操作端末５からのクエリの受信に応じて、インデックス１３１のデータ構造に含まれるデータに対する検索が行われる場合、ロック実行部１１３は、各ノードに対して参照ロックを行うものであってもよい。これにより、管理装置１は、ノードに対するロックに伴って発生するロックの解除待ち時間をより短縮することが可能になる。
【０１６８】
以上の実施の形態をまとめると、以下の付記のとおりである。
【０１６９】
（付記１）
木構造で構成されたデータ構造においてロック制御を行う情報処理プログラムであって、
前記データ構造の各階層における親ノードそれぞれに対応する子ノードのうちの長男ノード以外を、ロック制御を行う場合の対象ノードとして設定し、
前記データ構造におけるノードに対応付けられたデータに対して操作を行う場合において、前記対象ノードを親ノードから子ノードに向けて通過する処理を行う場合、前記対象ノードに対してロックを行う、
処理をコンピュータに実行させることを特徴とする情報処理プログラム。
【０１７０】
（付記２）
付記１において、
前記データの先頭には、前記データ構造における根ノードから前記データが対応付けられたノードまでの間の枝に対応付けられたデータが、前記根ノードに近い順に含まれており、
前記データは、各データが深さ優先探索において辞書式順になるように各ノードに対応付けられる、
ことを特徴とする情報処理プログラム。
【０１７１】
（付記３）
付記２において、
前記木構造は、Ｆｕｌｌ  Ｂｌｏｓｓｏｍ  Ｔｒｅｅである、
ことを特徴とする情報処理プログラム。
【０１７２】
（付記４）
付記１において、
前記対象ノードとして設定する処理では、前記データ構造における根ノードと、前記根ノード以外の第１対象ノードと、前記第１対象ノードの子孫ノードである第２対象ノードとを前記対象ノードとして設定し、
前記ロックを行う処理では、前記第１対象ノードに対してロックが行われている場合において、前記第２対象ノードを親ノードから子ノードに向けて通過する処理が行われた場合、前記第２対象ノードに対してロックを行うとともに、前記第１対象ノードに対して行われているロックを解除する、
ことを特徴とする情報処理プログラム。
【０１７３】
（付記５）
付記１において、
前記ロックを行う処理では、
前記データ構造におけるノードに対応付けられたデータに対して操作を行う場合において、前記長男ノードを親ノードから子ノードに向けて通過する処理が行われる場合、前記長男ノードを子ノードから親ノードに向けて通過する処理が、前記長男ノードを親ノードから子ノードに向けて通過する処理の後に行われるか否かを判定し、
前記長男ノードを子ノードから親ノードに向けて通過する処理が、前記長男ノードを親ノードから子ノードに向けて通過する処理の後に行われないと判定した場合、前記長男ノードに対してロックを行う、
ことを特徴とする情報処理プログラム。
【０１７４】
（付記６）
付記５において、
前記ロックを行う処理では、前記長男ノードに対してロックを行うとともに、前記長男ノードの親ノードに対して行われているロックを解除する、
ことを特徴とする情報処理プログラム。
【０１７５】
（付記７）
付記１において、
前記データの検索、前記データの挿入及び前記データの削除のうちのいずれかの処理である、
ことを特徴とする情報処理プログラム。
【０１７６】
（付記８）
木構造で構成されたデータ構造においてロック制御を行う情報処理装置であって、
前記データ構造の各階層における親ノードそれぞれに対応する子ノードのうちの長男ノード以外を、ロック制御を行う場合の対象ノードとして設定する対象ノード設定部と、
前記データ構造におけるノードに対応付けられたデータに対して操作を行う場合において、前記対象ノードを親ノードから子ノードに向けて通過する処理を行う場合、前記対象ノードに対してロックを行うロック実行部と、を有する、
ことを特徴とする情報処理装置。
【０１７７】
（付記９）
付記８において、
前記対象ノード設定部は、前記データ構造における根ノードと、前記根ノード以外の第１対象ノードと、前記第１対象ノードの子孫ノードである第２対象ノードとを前記対象ノードとして設定し、
前記ロック実行部は、前記第１対象ノードに対してロックが行われている場合において、前記第２対象ノードを親ノードから子ノードに向けて通過する処理が行われた場合、前記第２対象ノードに対してロックを行うとともに、前記第１対象ノードに対して行われているロックを解除する、
ことを特徴とする情報処理装置。
【０１７８】
（付記１０）
木構造で構成されたデータ構造においてロック制御を行う情報処理方法であって、
前記データ構造の各階層における親ノードそれぞれに対応する子ノードのうちの長男ノード以外を、ロック制御を行う場合の対象ノードとして設定し、
前記データ構造におけるノードに対応付けられたデータに対して操作を行う場合において、前記対象ノードを親ノードから子ノードに向けて通過する処理を行う場合、前記対象ノードに対してロックを行う、
ことを特徴とする情報処理方法。
【０１７９】
（付記１１）
付記１０において、
前記対象ノードとして設定する工程では、前記データ構造における根ノードと、前記根ノード以外の第１対象ノードと、前記第１対象ノードの子孫ノードである第２対象ノードとを前記対象ノードとして設定し、
前記ロックを行う工程では、前記第１対象ノードに対してロックが行われている場合において、前記第２対象ノードを親ノードから子ノードに向けて通過する処理が行われた場合、前記第２対象ノードに対してロックを行うとともに、前記第１対象ノードに対して行われているロックを解除する、
ことを特徴とする情報処理方法。
【符号の説明】
【０１８０】
１：管理装置              ２ａ：検索装置
２ｂ：検索装置            ３ａ：データベース
３ｂ：データベース        ５ａ：操作端末
５ｂ：操作端末            ５ｃ：操作端末
１３０：記憶部            １３１：インデックス
ＤＴ１：データ            ＤＴ２：データ
【図１】
2019101518.tif 000003
【図２】
2019101518.tif 000004
【図３】
2019101518.tif 000005
【図４】
2019101518.tif 000006
【図５】
2019101518.tif 000007
【図６】
2019101518.tif 000008
【図７】
2019101518.tif 000009
【図８】
2019101518.tif 000010
【図９】
2019101518.tif 000011
【図１０】
2019101518.tif 000012
【図１１】
2019101518.tif 000013
【図１２】
2019101518.tif 000014
【図１３】
2019101518.tif 000015
【図１４】
2019101518.tif 000016
【図１５】
2019101518.tif 000017
【図１６】
2019101518.tif 000018
【図１７】
2019101518.tif 000019
【図１８】
2019101518.tif 000020
【図１９】
2019101518.tif 000021
【図２０】
2019101518.tif 000022
【図２１】
2019101518.tif 000023
【図２２】
2019101518.tif 000024
【図２３】
2019101518.tif 000025
【図２４】
2019101518.tif 000026
【図２５】
2019101518.tif 000027
【図２６】
2019101518.tif 000028
【図２７】
2019101518.tif 000029
【図２８】
2019101518.tif 000030
【図２９】
2019101518.tif 000031
【図３０】
2019101518.tif 000032