---
title: "投影フレームワーク"
slug: "projection-framework"
abstract: ""
---
# 投影フレームワーク

プロジェクションフレームワークは、ソースデータを表形式に変換する流暢なAPIであり、キーでデータをグループ化する機能も含まれています。プロジェクションフレームワークはプロジェクションワーカーの文脈で利用可能で、デフォルトでプロジェクションデータをCortex処理ストレージデータベースに保存します。

## 鍵、属性、そして指標

投影には少なくとも1つのキー、オプション属性、オプションの指標が含まれます。

-   *キー*は行を一意に識別し、ソースデータのグループ化方法を決定します。複合キーもサポートされています。ソースデータが連絡先のリストであると仮定すると、キーの例は以下の通りです:
    -   連絡先ID。このキーは連絡先ごとに一意であり、結果として得られる行はグループ化されません。
    -   職種名と生年の組み合わせです。このキーは連絡先ごとに一意であることはおそらくなく、結果として行はグループ化されます。
-   属性 *はキー* に関する追加データを表します:
    -   キーがコンタクトIDであれば、そのコンタクトの総エンゲージメント値を属性として出力することができます。
    -   キーは職種名と生年の組み合わせなので、平均初任給を属性として返すメソッドを呼び出すこともできます。
-   *指標*とは、計算が可能なキーの特性です。指標は、予測がソースデータセットを縮小した場合にのみ意味を持ちます。例えば、職種ごとにグループ化された40件の連絡先のソースリストは6行になることがあります。この場合、次のようになることがあります:
    -   .Measure("Count", x => 1)を使って、各職種名を持つ連絡先の数を返してください。
    -   .Measure("YearsOfExperience", c => c.CareerFacet().YearsOfExperience)を使って、各職種の連絡先が示す総経験年数を返します。

以下のコンタクトプロジェクションの例は、出生年ごとにコンタクトをグループ化し、指標と属性を含みます。

// Syntax example only
Projection = Engine.Projection.Projection.Of<XConnect.Contact>().CreateTabular(
 nameof(Model1\_ContactProjection),
 Expansion,
 cfg => cfg
 .Key("BirthYear", c => c.Personal().Birthdate.Year.ToString())
 .Attribute("IsLeapYear", c => DateTime.IsLeapYear(c.Personal().Birthdate.Year))
 .Measure("NumberOfContactsInYear", c => 1)

## グループ化なしの射影

以下のサンプル投影は、連絡先IDで行をグループ化し、各連絡先の職種名と識別子数を出力します。

// Syntax example only
Projection = Engine.Projection.Projection.Of<Contact>().CreateTabular(
 nameof(ProjectionOnlyModel),
 cfg => cfg
 .Key("ContactID", c => c.Id)
 .Attribute("IdentifierCount", c => c.Identifiers.Count)
 .Attribute("JobTitle", c=> c.Personal().JobTitle));

3つの接点からなるサンプルセットは以下の出力を得ます。

連絡先ID

識別子カウント

職種

A3102A8C-ED77-492B-B447-4B6A0DF3C412

3

プログラマー・ライター

C35556DA-17DC-476A-98D5-56DF981E4529

2

開発者

0600F5a2-4491-491e-b568-be09a8d801fe

5

ジュニア開発者

この例では一意の接点IDをキーとして使用しており、データセットは縮小されていません。ソースデータセット内の接点数と、予測テーブル内の行数との間には1対1の関係があります。このようなシナリオでは:

-   Measure()は使わないでください。ソースデータセット内のすべての接点IDは一意であり、データセット自体が削減されることはありません。Measureを使うと不要なパフォーマンスオーバーヘッドが生じます。

> !警告プロジェクションに連絡先IDを含める際は注意してください。連絡先IDはxDB内の連絡先を一意に識別し、連絡先が忘れられる権利を行使しても削除されません。また、xDBの外に永続化してはいけません。投影データは設定可能な間隔でCortex処理ストレージデータベースから削除されます。

## グループ化による射影

以下のサンプル予測は、接触者、出生年、職種ごとに行をグループ化し、各行のカウントを出力します。

// Syntax example only
Projection = Engine.Projection.Projection.Of<XConnect.Contact>().CreateTabular(
 nameof(Model1\_ContactProjection),
 Expansion,
 cfg => cfg
 .Key("BirthYear", c => c.Personal().Birthdate.Year.ToString())
 .Key("JobTitle", c => c.Personal().JobTitle)
 .Measure("YearsExperience", c=> c.CareerInfo().YearsExperience) // Sample facet; int
 .Measure("Count", x => 1));

4つの生年と3つの職種名にまたがる17件のコンタクトのサンプルセットは、以下の出力を得られます。

生年

職種

伯爵

経験年数

1987

プログラマー・ライター

1

10

1987

開発者

5

50

1972

開発者

10

92

1990

ジュニア開発者

1

3

この例は、連絡先の出生年と職種からなる複合キーを使用し、データセットは縮小されています。このようなシナリオでは:

-   Measure()を必ずご利用ください。この例には以下が含まれます:
    -   各グループ内の接触者数の合計です。
    -   グループが代表する総職歴年数。