ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Real-Time Decisionsデシジョン・センター・ユーザーズ・ガイド
11gリリース1 (11.1.1)
B72430-01
  目次へ移動
目次

前
 
 

4 ルールについて

ルールには、次の3つのタイプがあります。

この章には次のトピックが含まれます:

4.1 適格性ルールについて

選択肢または選択肢グループの一部である適格性ルールは、ある選択肢が、選択肢を選択する意思決定またはロジックに参加できるかどうかの適格性を判断します。選択肢グループ選択肢は、インライン・サービス・ナビゲータの「デシジョン・プロセス」の下に表示されます。

選択肢グループを表すアイコンは次のとおりです。

輪郭があいまいな青い円の中に白いチェック・マークがあります

選択肢を表すアイコンは次のとおりです。

青い円の中に白いチェック・マークがあります

適格性ルールは、選択肢グループとそのサブツリーが決定に対して適格であるかどうかを判断します。選択肢自体が適格であっても、そのすべての親が適格でないと、その選択肢は適格にならないことに注意してください。

選択肢グループの適格性ルールにアクセスするには、選択肢グループを選択してから、「定義」→「グループの適格性」または「選択肢の適格性」を選択します。

選択肢の適格性ルールにアクセスするには、選択肢を選択してから、「定義」→「適格性」を選択します。

この項には次のトピックが含まれます:

4.1.1 適格性ルールの追加

適格性ルールを追加するには、「グループの適格性」、「選択肢の適格性」、または選択肢/選択肢グループの「適格性」タブを選択してから、新しいルールを追加します。新規ルールの作成とルールへの文の追加方法の詳細は、第4.5.3項「ルールへの文の追加」を参照してください。


注意:

ルールの変更は、インライン・サービスが編集用に開かれている場合のみ行うことができます。


4.1.2 選択肢グループ/選択肢のルールの評価

選択肢グループと選択肢のルールは、継承されて追加されていきます。つまり、選択肢グループのルール(グループおよび選択肢のルール)と選択肢レベルのルールがある場合、ルールを拡張する論理積が追加されたかのようになります。継承されたルールは、ルールの一番上にある「継承された適格性条件」というセクションを展開すると表示されます。セクションを開いたり閉じたりするには、上矢印と下矢印のボタンを使用します。

例4-1に、選択肢グループのルールと選択肢のルールを評価する方法の例を示します。

例4-1 選択肢グループのルールと選択肢のルールの評価

Group1 has rules GroupRule1 and ChoiceRule1
    Group2 is a child of Group1 and has rules GroupRule2 and ChoiceRule2
        Group2 has a Choice, Choice1, and it has a rule, Rule1

この例では、Choice1のルールを評価するときに、次に示すルールが有効になります。

GroupRule1 AND GroupRule2 AND ChoiceRule1 AND ChoiceRule2 AND Rule1

4.1.3 適格性の判定

選択肢の適格性を判定するときは、初めに親の適格性がテストされます。これは、選択肢に対する不必要な適格性ルール評価処理を回避するためです。

例4-2に、選択肢の適格性を判定する方法の例を示します。

例4-2 選択肢の適格性の判定

Group1 has rule GroupRule1
Group2 is a child of Group1 and has rule GroupRule2
Group2 has a Choice, Choice1, and it has a rule, Rule1

この例では、適格性が次のとおり判定されます。

If Choice1 is eligible with Rule1 test with GroupRule2 if eligible test with GroupRule1

4.2 フィルタリング・ルールについて

フィルタリング・ルールは、スタンドアロン・ルールとして、母集団のセグメント化に使用したり、他のルールのコンポーネントとして使用できます。スタンドアロン・ルールは、様々な要素で再利用できます。スタンドアロンのフィルタリング・ルールには、「デシジョン・プロセス」→「ルール・ライブラリ」→「フィルタリング・ルール」でアクセスできます。

4.2.1 フィルタリング・ルールを使用した母集団のセグメント化

フィルタリング・ルールは他のどのルールでも使用でき、デシジョン優先度決定のためにも使用できます。後者の場合は、フィルタリング・ルールをデシジョンに割り当てると、1つの母集団の様々なセグメントにパフォーマンス・メトリックを適用することが可能になります。図4-1に、母集団のセグメント化に使用されるフィルタリング・ルールの例を示します。

図4-1 フィルタリング・ルール

図4-1の説明が続きます
「図4-1 フィルタリング・ルール」の説明

図4-1のスコアリング・ルールは、年齢が18歳以上で信用限度額が$8000以上の顧客をターゲットとしています。フィルタリング・ルールはデシジョンで使用されます。

フィルタリング・ルールを使用して母集団をセグメント化するには:

  1. 新しいルールを追加するには、ナビゲータの上にあるツールバーのフィルタリング・ルール・アイコンをクリックします。フィルタリング・ルール・アイコンは、次のように表示されます。

    緑色の円に白のシンボルと金色のプラス記号
  2. セグメント化のためのスタンドアロンのフィルタリング・ルールを作成します。

    新規ルールの作成とルールへの文の追加方法の詳細は、第4.5.3項「ルールへの文の追加」を参照してください。

  3. 母集団をセグメント化するデシジョンを選択します。「定義」→「優先度」を選択します。

  4. エディタの「セグメント」を使用して、母集団のセグメントを定義するフィルタリング・ルールを選択します。

  5. 必要に応じて、このセグメントに対するパフォーマンス・メトリックの重み付けを調整できます。

  6. 保存」アイコンをクリックして、変更内容を保存します。

4.3 母集団セグメント別の業務目標優先度の調整

インライン・サービスに加えることができる変更の1つとして、業務目標の優先度の調整があります。意思決定の結果は、組織に定義されたパフォーマンス目標、定義された母集団のセグメント、および母集団の各セグメントにおける目標の優先度に基づいています。優先度の調整は、「定義」→「優先度」サブタブで行うことができます。


注意:

ルールの変更は、インライン・サービスが編集用に開かれている場合のみ行うことができます。


図4-2に、業務目標の優先度の例を示します。

図4-2 業務目標の優先度

図4-2の説明が続きます
「図4-2 業務目標の優先度」の説明

図4-2に示す例では、母集団のセグメント「維持するセグメント」の業務目標「顧客維持」の重み付けが高く設定されており(71%)、母集団の残りの部分は収益最大化が優先されます(29%)。

特定の状況下または母集団に変更がある場合は、重み付けのバーをスライドしてこの優先度を調整できます。調整後は、インライン・サービスを再デプロイしてから、変更内容を確認するためにデシジョン・センターに再度ログインする必要があります。

4.4 スコアリング・ルールについて

ブール値を返す適格性ルールとは対照的に、スコアリング・ルールは数値を返します。この値は、Oracle RTDのデシジョン・ロジックのどの部分でも使用できます。一般的なユース・ケースは、次のとおりです。

図4-3に、スコアリング・ルールの例を示します。

図4-3 スコアリング・ルール

図4-3の説明が続きます
「図4-3 スコアリング・ルール」の説明

図4-3に示す例では、顧客の与信金額に基づいてスコアが割り当てられます。顧客がどの与信範囲カテゴリにも適合しない場合、デフォルトのスコアである3が設定されます。

4.5 ルールの操作

ルールは、デシジョン・スタジオとデシジョン・センターの中で様々な目的で使用されますが、たとえば次のようなユース・ケースがあります。

ルールの作成に使用するエディタは、ほとんど同じです。以降の各項では、エディタとルール・エディタのツールバーを使用してルールを使用する方法を説明します。


注意:

ルールの変更は、インライン・サービスが編集用に開かれている場合のみ行うことができます。


この項には次のトピックが含まれます:

4.5.1 ルール・エディタのツールバーについて

ルール・エディタのツールバーからは、ルールを編集するための機能にアクセスできます。このツールバーは、実行中のタスクのコンテキストに依存します。

図4-4 ルール・エディタのツールバー

図4-4の説明が続きます
「図4-4 ルール・エディタのツールバー」の説明

左から右の順に、このツールバーには次に示す機能が並んでいます。

  • ルール・プロパティの編集

  • 条件値の追加

  • ルールの追加

  • ルール・セットの追加

  • 削除

  • 反転

  • 上へ移動

  • 下へ移動

  • コピー

  • 切取り

  • 貼付け

4.5.2 Oracle RTDルールの項と文

Oracle RTDのルールには、次の3つのタイプがあります。

  • フィルタリング・ルール

  • スコアリング・ルール

  • 適格性ルール

Oracle RTDのルールは、1つ以上のルール条件および条件の結合を制御する論理演算子から構成されます。これらの条件は、この項で説明するようにルール文の形式で表現されます。


注意:

この項では、条件付きルール(常に真になるとはかぎらないルール)について説明します。


単純なフィルタリング・ルールの例を次に示します。このルールの名前は選択リスト・ルールで、この項ではこのルールを使用してルール文の説明をします。

  • Select List Rule is true when
    All of the following
    1. session / customer / Age > 21
    2. session / customer / MaritalStatus = "MARRIED"
    

表4-1に、Oracle RTDのルール構文を正式な形で示します。この表では、Oracle RTDのルール文で使用される項の説明にバッカス正規形(BNF)タイプの表記規則を使用します。

表4-1 Oracle RTDのルールの構文

項の構成要素 注意

<rtd rule>

<header line> <logical operator> <rule entry>+ |

<header line> <array operator> <logical operator> <rule entry>+

なし

<header line>

<rule name> は次の場合にtrueです

ルールの名前を指定します。

ルールが作成された後は、ヘッダー行の編集は不可能です。

<logical operator>

次のすべて | 次のいずれか |

次のいずれでもない | 次の一部

論理演算子は、直後の<rule entry>をコントロールします。論理演算子「次のすべて」は、ルール新規作成時のデフォルトの論理演算子です。

<rule entry>

<boolean statement> | <rule set>

ルール・エントリには必ず番号が付きます。ルール・エントリの内容はブール文または他のルール・エントリです。

<rule set>

<logical operator> <rule entry>+ |

<array operator> <logical operator> <rule entry>+

2番目の<rule set>構成要素オプションを配列処理ルール・セットと呼びます。

<boolean statement>

<boolean> |

<boolean function> |

<left operand> <relational operator> <right operand>

<boolean statement>は、ルール・セットの最下位レベルであり、それ以上分解できません。

<array operator>

<quantifier> <array variable> in <array name>,

配列処理ルール・セットの場合にのみ使用します。詳細は、「数量詞と配列処理ルール」を参照してください。

<quantifier>

すべて | 次が存在

なし


選択リスト・ルールの例は、次のように分類できます。

  • 選択リスト・ルールは、次の場合にtrueです = <header line>

  • 次のすべて = <logical operator>

このルールの残りの部分は、次の2つの文からなる1つの<rule entry>で構成されています:

  • session / customer / Age > 21 = <boolean statement>

  • session / customer / MaritalStatus = "MARRIED" = <boolean statement>

ルール・セットとブール文

ルール・セット(表4-1では<rule set>)は、1つ以上の番号付きルール・エントリで構成される複合文です。各ルール・エントリは、ブール文か、別のルール・セットです。

ブール文(表4-1では<boolean statement>)には、評価結果がtrueまたはfalseになる条件が含まれています。この評価は、ルールが処理されるときに行われます。ブール文は、ルール・セットの最小レベルの要素であり、さらに分解することはできません。

ルール・セットの中で定義される下位のルール・セットに名前を付けることもできます。


注意:

各Oracle RTDのルールには、暗黙的な、名前のない、最上位のルール・セットが1つあります。


各ルール・セットは、ルール・セット文の処理を制御する論理演算子によって修飾されます。詳細は、「論理演算子」を参照してください。

次に示す除外ルールの例では、ルール・セットの中に別のルール・セットがあります。

rule_sets1.gifについては周囲のテキストで説明しています。

例:

  • 最上位の名前のないルール・セットの中に、論理演算子「次のすべて」と2つのルール・エントリがあります。最初のルール・エントリはブール文で、2番目のルール・エントリはルール・セットです。

  • 最上位ルール・セットの内側のルール・セットの中には、論理演算子「次のいずれでもない」と3つのルール・エントリがあります。これらのルール・エントリはすべてブール文です。


注意:

Oracle RTDでは、配列内の値に依存するルール・セットもサポートされます。詳細は、「数量詞と配列処理ルール」を参照してください。


配列内の値に依存するルール・セットの場合は、全体の「数量詞」となる式(「すべて」または「次が存在」)がルール・セットに追加されます。この数量詞は、ルール・セットの論理演算子を修飾します。詳細は、「数量詞と配列処理ルール」を参照してください。

論理演算子

Oracle RTDの論理演算子は次のとおりです。

  • 次のすべて(論理積、and)。ルール・セットでは、ブール文または下位レベルのルール・セットがすべてtrueになる場合にtrueと評価されます。

  • 次のいずれか(論理和、or)。ルール・セットでは、ブール文または下位レベルのルール・セットのいずれか1つがtrueになる場合にtrueと評価されます。

  • 次のいずれでもない(否定論理積、not and)。ルール・セットでは、ブール文または下位レベルのルール・セットがすべてfalseになる場合にtrueと評価されます。

  • 次の一部(否定論理和、not or)。ルール・セットでは、ブール文または下位レベルのルール・セットのいずれか1つがfalseになる場合にtrueと評価されます。

数量詞と配列処理ルール

ルール・セットは、次のように、配列内に出現する値に依存することが可能です:

  • ルール・セットは配列の要素を評価できます

  • ルール・セットの中の式は配列の要素を参照できます

このようなタイプのルールを配列処理ルールと呼びます。

これらの場合、「数量詞」式(数量詞とも呼ばれます)がルール・セットの論理演算子を修飾するルール・セットが存在します。ルール・セットの文は、すべての配列要素に対して満たされるか、1つ以上の配列要素に対して満たされるかのどちらかである必要があります。

次の例では、配列属性のsession/agentsに含まれるすべてのエージェントを調べるルールが作成されています。この例では、すべてのエージェントが30歳以上でありステータスがQualifiedである場合に、ルールがtrueと評価されます。

Agent Rule is true when
For all people in session/agents, All of the following
1. people / Age >= 30
2. people / Status = "Qualified"

配列処理ルールの構文は、次の項で詳しく説明します。前の例では、peopleという項はユーザーが定義する任意項であり、ルール・セット内の個々の配列要素を識別するために使用されます。

配列処理ルールの修飾

配列処理ルールの修飾の一般的な形式は、次のとおりです。

<quantifier> <array_variable> in <array_name>, <logical_operator>

ここで:

quantifierは、「すべて」、「次が存在」のいずれかです。

  • すべて:この数量詞は、ルール・セットの論理演算子と連携して、各配列要素の検査が必須であることを示します。また、各配列要素について、被修飾ルール・セット内のブール文と下位ルール・セットがすべて満たされている必要があります。

    被修飾ルール・セット内のブール文と下位ルール・セットが1つも満たされない配列要素が見つかると、ルール評価による配列処理は終了します。配列内の残りの要素はスキップされます。

  • 次が存在:この数量詞は、ルール・セットの論理演算子と連携して、少なくとも1つの配列要素に対して、被修飾ルール・セット内のブール文と下位ルール・セットがすべて満たされている必要があることを示します。

    被修飾ルール・セット内のブール文および下位ルール・セットがすべて満たされている配列要素が見つかると、ルール評価による配列処理は終了します。配列内の残りの要素はスキップされます。

array_variableは、被修飾ルール・セットのブール文および下位ルール・セットの中の配列array_nameの個々の配列要素の名前を指定するための任意名です。


注意:

  1. array_variableは、独自の配列変数を持つ下位レベルのルール・セットのブール文からでも参照できます。

  2. array_variableはルールの範囲内で一意でなければなりません。つまり、下位の配列処理ルールの配列変数と同じ名前をarray_variableの名前として使用することはできません。


array_nameは、検査対象の配列です。

logical_operatorは、「次のすべて」、「次のいずれか」、「次のいずれでもない」、「次の一部」のいずれかです。

たとえば、ある配列処理ルール・セットが2つのエンティティsessioncustomerで構成されているとします。

sessionエンティティには、次の属性があります。

  • 整数型の属性AgentDept

  • 配列属性CustInfo(customer型)

customerエンティティには、次の属性があります。

  • 整数型の属性CompSize

  • 文字列型の属性Region

次の条件を両方とも満たすためのフィルタリング・ルールが必要です。

  • AgentDeptの値は42でなければならない。

  • CustInfo配列内の少なくとも1つの顧客のCompSizeが> 100で、Regionが「West」でなければならない。

このフィルタリング・ルールは、次のように定義できます(配列を修飾する式が強調されています):

  • Cust Rule is true when
    All of the following
    1. session / AgentDept = 42
    2. There exists some_customer in session / CustInfo, All of the following
       1. some_customer / CompSize > 100
       2. some_customer / Region = "West"
    

4.5.3 ルールへの文の追加

ルール・セットの追加

ルール・セットを追加するには、次に示す「ルール・セットの追加」アイコンをクリックします。

プラス記号、ドット、ダッシュ

これがルール内に作成する最初の要素である場合は、次に示す文がルール内に表示されます。

  • デフォルトの論理演算子「次のすべて

  • ルールの最初の行番号を付与されたルール・セット・エントリ。このエントリの中には、デフォルトの論理演算子「次のすべて」があります。

  • 2つのオペランドを持つ空のブール文(新しく定義されたルール・セット内)

sr_new_rule_set_entry.gifについては周囲のテキストで説明しています。

それ以外の場合、現在のルール・セットで次のエントリとして、オペランドが2つで空のブール文を含む新規ルール・セット・エントリが追加されます。たとえば、ブール文が1つ含まれている既存ルール・セットにルール・セットを追加すると、追加されたルール・セット・エントリは、次に示すように、行番号2の横に表示されます。

new_rs2.gifについては周囲のテキストで説明しています。

ルール・セットに名前を付けるには、右上隅をクリックします。ルール・セットに名前を付けると、ルール・セットのボックスの右上隅にある山形のアイコンをクリックしてルールを閉じたり開いたりできるようになります。

ルールの追加(ブール文をルールに追加)

ブール文を追加するには、次に示す「ルールの追加」アイコンをクリックします。

プラス記号、ドット、ダッシュ

これがルール内に作成する最初の要素の場合は、次のように、デフォルトの論理演算子「次のすべて」が表示され、その後に2つのオペランドを持つ空のブール文が表示されます。

new_rule0.gifについては周囲のテキストで説明しています。

それ以外の場合は、次の例に示すように、2つのオペランドを持つ空のブール文が現行ルール・セットに追加されます。この例では、1つのブール文がすでに存在します。

new_rule1.gifについては周囲のテキストで説明しています。

デフォルトでは、ブール文は2つのオペランドを持ち、その間に1つの演算子があります。

ブール文のオペランドが1つか2つかを切り替えるには、次の例に示すように、ブール文の行番号をクリックしてから、ブール文ボックスの右下にある三角形のアイコンをクリックします。

single_double.gifについては周囲のテキストで説明しています。

オペランドが1つの場合は、評価結果が必ずブール型になります。

4.5.4 演算子の選択

演算子を選択するには、演算子をクリックしてから右下隅をクリックします。

演算子および右下隅の三角形

表4-2は、使用可能な演算子の一覧です。

表4-2 ルール演算子

演算子 説明

なし

オペランドを1つだけ持つ単純な式

=


左辺が右辺と等しい

<>

左辺が右辺と等しくない

<


左辺が右辺より小さい

<=


左辺が右辺以下

>

左辺が右辺より大きい

>=

左辺が右辺以上

次に含まれる

左辺の値が右辺のリストに含まれる

次に含まれない

左辺の値が右辺のリストに含まれない

次のすべてを含む

左辺のリストが右辺のリストの値をすべて含む

次のすべてを除外

左辺のリストが右辺のリストのどの値も含まない

次のいずれかを含む

左辺のリストが右辺のリストのいずれかの値を含む

次の一部を含まない

左辺のリストが右辺のリストの一部の値を含まない


4.5.5 ブール文の編集

ルールのブール文を編集するには、左辺をクリックしてから省略記号をクリックします。定数、属性または関数コールから選択できます。ページ上部の「配列」を選択すると、配列値を指定できます。


注意:

オペランド・ダイアログ内で[Esc]キーを押すと、いつでもダイアログを閉じることができます。


  • 定数」を選択した場合は、その項目の「データ型」と「」を指定します。「配列」を選択した場合は、必要な数の項目を配列に追加します。次に、各項目の「データ型」を選択して「」を指定します。

  • 属性」を選択した場合は、次のいずれかを指定します。

    • グループ属性: ルール・プロパティで選択された選択肢グループまたはその選択肢の一部である属性。

    • セッション属性: セッション・エンティティの一部である属性。

    • アプリケーション属性: アプリケーション要素のメンバーである属性。

    • 配列変数: 数量詞付き論理演算子式の中のルール・セットの個々の配列要素の名前。詳細は、「数量詞と配列処理ルール」を参照してください。

    タイプ別に属性をフィルタリングするには、「フィルタ・タイプの適用」を選択してから「データ型」を選択します。「配列」を選択した場合は、必要な数の項目を配列に追加してから、各項目に属性値を割り当てます。

  • 関数コール」を選択した場合は、次のいずれかを指定します。

    • フィルタリング・ルール: インライン・サービスに対して定義されたスタンドアロンのフィルタリング・ルール

    • スコアリング・ルール: インライン・サービスに対して定義されたスタンドアロンのスコアリング・ルール

    • 関数コール: インライン・サービスに対して定義されたスタンドアロンの関数

    タイプ別に属性をフィルタリングするには、「フィルタ・タイプの適用」を選択してから「データ型」を選択します。「配列」を選択した場合は、必要な数の項目を配列に追加してから、各項目に関数またはルールを割り当てます。

4.5.5.1 ルール内でのタイプ制約付きオブジェクトの使用

タイプ制約付きのオブジェクトをオペランドとして、またはオペランドの一部として選択すると、他のオペランドの値がドロップダウン・リストとして表示されることがあります。このドロップダウン・リストから値を選択できますが、このリストからの選択は必須ではありません。

タイプ制約とタイプ制約付きオブジェクトの詳細は、『Oracle Fusion Middleware Oracle Real-Time Decisionsプラットフォーム開発者ガイド』のタイプ制約に関するトピックを参照してください。

4.5.6 ルール・プロパティの編集

フィルタリング・ルールとスコアリング・ルールのどちらにも、設定可能なルール・プロパティがあります。ルール・プロパティを編集するには、次に示す「ルール・プロパティ」アイコンをクリックします。

箇条書き項目が記載されたページを指す手。

「ルール・プロパティを編集」が表示されます。

ルール・プロパティには、コール・テンプレートとネガティブ・コール・テンプレートがあります。コール・テンプレートは、別のルールからルールをコールするための、ユーザーフレンドリな記述方法を提供します。

コール・テンプレートを定義するには、「パラメータ」の下にある「追加」ボタンをクリックして、ルールのパラメータ数を追加します。{0}、{1}などの引数と、ルールを記述する句を使用して、コールのテンプレートを定義します。ルールの使用時にはこの句が表示されるため、適切な句を使用することが重要です。

たとえば、ユーザーから少なくともx回のコールが過去y日間にあったかどうかをルールによって調べるには、次のように記述します。

There were at least {0} calls in the last {1} days

ネガティブ・コール・テンプレートは、ルールが反転されて反対の意味を表すときに使用されます。例:

There were less than {0} calls in the last {1} days
  

ルール・プロパティでは、ルールで使用する選択肢グループを割り当てることもできます。「選択肢グループで使用」を選択すると、パラメータで使用する選択肢属性を、どの選択肢グループまたはその選択肢から得るかを指定できます。これらの属性は、オペランドの値を編集する場合に使用できます。

4.5.7 ルール要素の反転

反転」アイコンは、ルールで複数の要素を逆にします。ブール文の番号を選択することで、ブール文の演算子を逆にできます。たとえば、オペランドが=の場合、<>に反転します。

ルール・セットの論理演算子を反転させることもできます。反転させるには、論理演算子を選択して「反転」をクリックします。たとえば、「次のすべて」は「次の一部」になります。

反転」の最後の用途は、ブール型のルール(オペランドが1つだけのルール)の反転です。このタイプのルールを反転すると、ルールを定義する関数のネガティブ・コール・テンプレートに変換されます。

4.5.8 ルールとルール・セットの移動

ルールの中のルールとルール・セットの順序を変更するには:

  1. ルール・エントリの番号をクリックして選択します。

  2. 次の操作をルール・エディタのツールバーから実行し、ルール・エントリを移動します。

    • 削除

    • 選択内容をクリップボードにコピー

    • クリップボードへの選択内容の切取り

    • 上へ移動

    • 下へ移動

    ルール・エディタのツールバーのアイコンの詳細は、第4.5.1項「ルール・エディタのツールバーについて」を参照してください。

  3. 保存」アイコンをクリックして、変更内容を保存します。