オントロジーの構築ファンクションオブジェクトの関数集約メトリックの選択

注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。

API: オブジェクトセット

このページでは TypeScript v1(TSv1)について説明します。TypeScript v2(TSv2)と Python は、オントロジー SDK を通じてオントロジーにクエリを実行します。TypeScript と Python のオントロジー SDK リファレンスを参照してください。移行ガイドでは、各 TSv1 演算子を TSv2 の形式に対応付けています。

オブジェクトセットは、単一のタイプのオブジェクトを順序なしでまとめたものです。関数 API を使用すると、オブジェクトセットを絞り込んだり、定義されたリンクタイプに基づいて他のオブジェクトタイプへの関連検索を実行したり、集計値を計算したり、具体的なオブジェクトを取得したりできます。個々のオブジェクトを関数への入力として渡すだけでなく、オブジェクト検索 API を使用していつでもオブジェクトセットを検索できます。

TypeScript v1 では、絞り込み、並べ替え、集計は、Searchable レンダリングヒントが有効なプロパティでのみ機能します。これらのプロパティは検索用にインデックス化されているためです。このレンダリングヒントは Ontology Manager で有効にできます。

関数の入力としては、オブジェクトセットは必要になるまで読み込みを遅延するため、オブジェクト配列よりも効率的です。オブジェクトセットを効率的に使用するためのベストプラクティスについては、パフォーマンスの最適化を確認してください。

オブジェクト検索

Objects.search() インターフェースを使用すると、プロジェクトにインポートされた任意のオブジェクトタイプの検索を開始できます。この例では、関数は指定された airportCode を使用して、その空港から出発したすべてのフライトを検索します。その後、それらのフライトの重複しない宛先をすべて検索し、返します。

TSv2 については、絞り込みを参照してください。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import { Function } from "@foundry/functions-api"; import { Objects } from "@foundry/ontology-api"; export class FlightFunctions { @Function() public currentFlightDestinations(airportCode: string): Set<string> { const flightsFromAirport = Objects.search() .flights() .filter(flight => flight.departureAirportCode.exactMatch(airportCode)) .all(); const destinations = flightsFromAirport.map(flight => flight.arrivalAirportCode!); return new Set(destinations); } }

オブジェクトのリスト、オブジェクトリソース識別子のリスト、またはオブジェクトセットリソース識別子を、検索対象のオブジェクトタイプの引数として渡すことで、オブジェクトセットを作成することもできます。たとえば、Objects.search().flights([flight]) です。

特定のタイプのオブジェクトセットを取得すると、以下に記載されているさまざまな操作をそのセットに対して実行できます。

絞り込み

TypeScript v1 では、オブジェクトセットの .filter() メソッドを使用して、オブジェクトの検索可能なプロパティに基づいてオブジェクトセットを絞り込むことができます。フィルターメソッドは、絞り込みに使用するプロパティのデータ型に基づくフィルター定義を受け取ります。TypeScript v2 の対応する機能については、移行ガイドのフィルター演算子の対応表を参照してください。TypeScript v1 のフィルターメソッドは以下のとおりです。

  • すべてのプロパティタイプで .exactMatch() フィルターがサポートされています。このフィルターは、プロパティの値が完全一致するオブジェクトに絞り込みます。これは、文字列の完全一致で絞り込む場合(上記の例のような場合)や、オブジェクトの主キーで絞り込む場合(たとえば、.filter(object => object.primaryKey.exactMatch(PrimaryKey)))に便利です。
    • プロパティが null または undefined であるかどうかを確認するには、hasProperty() メソッドを使用します。
    • 複数の値を渡すには、スプレッド演算子 .exactMatch(...listVariable) を使用します。空の配列が渡された場合、フィルターは無視されます。
  • 文字列プロパティは、いくつかのキーワードフィルターをサポートしています。詳細については、Code Assist の各メソッドのドキュメントを参照してください。
    • .phrase() は、検索クエリをトークンに分割します。通常、トークンは個々の単語です。すべてのトークンが順番どおりに含まれ、トークン間に他のトークンがない値に絞り込みます。アンダースコアとピリオドは、プロパティ値を別々のトークンに分割しません。たとえば、banana の検索では、banana_pudding や banana.pudding は返されません。
    • .phrasePrefix() は phrase() とほぼ同じですが、最後のトークンについては、そのトークンで始まるトークンにも一致します。たとえば、fresh banana の .phrasePrefix() 検索は、プロパティ値 fresh banana_pudding に一致しますが、プロパティ値 banana_pudding fresh には一致しません。pudding の .phrasePrefix() 検索は、プロパティ値 banana_pudding には一致しません。
    • .prefixOnLastToken() は、検索クエリをトークンに分割し、指定されたすべてのトークンが含まれるかどうかに基づいて値を絞り込みます。最後のトークンについては、そのトークンで始まるトークンにも一致します。たとえば、big app は big apples と apples from the big tree に一致しますが、apples from the biggest tree には一致しません。
    • .matchAnyToken() と .fuzzyMatchAnyToken() は、検索クエリをトークンに分割し、指定されたトークンのいずれかが含まれるかどうかに基づいて値を絞り込みます。fuzzy バージョンでは、近似する値も一致とみなします。
    • .matchAllTokens() と .fuzzyMatchAllTokens() は、検索クエリをトークンに分割し、指定されたすべてのトークンが含まれるかどうかに基づいて値を絞り込みます。fuzzy バージョンでは、近似する値も一致とみなします。
      • あいまいフィルターは、@foundry/functions-api からインポートされる任意の Fuzziness パラメーターを受け取ることができます。
      • 利用可能な Fuzziness の選択肢の説明は、ElasticSearch のドキュメント ↗で確認できます。以下にも詳細を記載しています。
  • 数値、日付、タイムスタンプのプロパティは、.range() フィルターをサポートしています。
    • 範囲フィルターには、より小さい比較を行う .lt()、以下の比較を行う .lte()、より大きい比較を行う .gt()、以上の比較を行う gte() メソッドがあります。
  • ブールプロパティは、.isTrue() と .isFalse() フィルターをサポートしています。
  • Geopoint プロパティは、.withinDistanceOf()、.withinPolygon()、.withinBoundingBox() フィルターをサポートしています。
  • Geoshape プロパティは、.withinBoundingBox()、.intersectsBoundingBox()、.doesNotIntersectBoundingBox()、.withinPolygon()、.intersectsPolygon()、doesNotIntersectPolygon() フィルターをサポートしています。
  • リンクフィルターでは、.isPresent() メソッドを使用して、特定のタイプのリンクされたオブジェクトが存在する、または存在しないオブジェクトに絞り込むことができます。
  • 配列プロパティは、.contains() フィルターをサポートしています。このフィルターは、配列プロパティの値に、指定された値の_いずれか_が含まれるオブジェクトに絞り込みます。

フィルターの組み合わせ

TypeScript v1 では、@foundry/functions-api からエクスポートされる Filters API を使用して、フィルターを組み合わせることができます。利用可能なメソッドは以下のとおりです。

  • and() は、指定されたすべてのフィルターを満たすオブジェクトにオブジェクトセットを絞り込みます
  • or() は、指定されたフィルターのいずれかを満たすオブジェクトにオブジェクトセットを絞り込みます
  • not() は、指定されたフィルターを否定します

TSv2 については、Not、And、Or フィルターを参照してください。

以下の例では、and() を使用して、フライトの宛先でフライトのオブジェクトセットを絞り込むことができます。

Copied!
1 2 3 4 5 6 7 8 import { Filters } from "@foundry/functions-api"; Objects.search() .flights() .filter(flight => Filters.or( Filters.and(flight.destination.exactMatch("SFO"), flight.passengerCount.gt(100)), Filters.and(flight.destination.exactMatch("LAX"), flight.passengerCount.gt(300)), ))

上記のコードは、乗客数が 100 人より多く SFO に到着したフライト、または乗客数が 300 人より多く LAX に到着したフライトに絞り込みます。

論理演算子ではなく Filters メソッドでフィルターを組み合わせる

TypeScript v1 では、オブジェクトセットの .filter() メソッドは && や || 演算子を使用しません。複数のフィルターを適用するには、上記の Filters メソッドのいずれかを使用する必要があります(または、.filter() を複数回呼び出して and 条件を実現します)。

あいまい検索による文字列プロパティの絞り込み

任意の fuzziness パラメーターを指定すると、あいまい一致の動作をより細かく制御できます。fuzziness を指定しない場合は、検索するトークンの長さに基づいて編集距離が自動的に設定されます。編集距離を指定するには、@foundry/functions-api から Fuzziness をインポートする必要があります。

Fuzziness は TypeScript v1 の概念であり、TypeScript v2 に対応する機能はありません。詳細については、移行ガイドの TypeScript v2 に対応する機能がない機能を参照してください。

いずれかのトークンにあいまい一致

Copied!
1 Objects.search().employee().filter(employee => employee.firstName.fuzzyMatchAnyToken("Michael", { fuzziness: Fuzziness.LEVENSHTEIN_TWO })).all();

上記のコードは、指定された検索語から 2 回以内の編集で一致する名を持つ従業員を返します(レーベンシュタイン距離が 2)。この例では、Michael、Micheal、Mikhael、Michel、Mikhail、Mihail が含まれます(ただし、たとえば Miguel は含まれません)。検索語の正確さについてより確信がある場合は、編集距離を小さくして検索し(異なるレーベンシュタイン距離を使用し)、検索結果をさらに絞り込むことができます。

すべてのトークンにあいまい一致

Copied!
1 Objects.search().employee().filter(employee => employee.fullName.fuzzyMatchAllTokens("Michael Smith", { fuzziness: Fuzziness.LEVENSHTEIN_ONE })).all();

複数のトークンからなるフレーズに対して、あいまいフィルターを使用することもできます。上記のコードは、氏名に Michael と Smith の両方が含まれ、各トークンで最大 1 回の編集がある従業員に一致します。たとえば、Mikhael Smitt です(つまり、各トークンのレーベンシュタイン距離が 1)。fuzzyMatchAllTokens または fuzzyMatchesAllTokens フィルターでは、トークンの順序は考慮されません。

文字列配列プロパティでのあいまい一致

配列ベースのプロパティに対するすべてのフィルターでは、基となるデータ型で利用可能なメソッドを使用できます。たとえば、文字列配列プロパティは、文字列プロパティで利用可能な任意のメソッドに基づいて絞り込むことができます。ただし、メソッドの名前は多少異なる場合があります。配列プロパティの絞り込みでは、配列の要素のうち 1 個が一致すれば、そのオブジェクトが返されます。

関連検索

TypeScript v1 の関連検索の制限

以下の制限は、TypeScript v1 Objects API に対して規定されています。.all() または .allAsync() を使用してメモリーに読み込むオブジェクトセットでは、関連検索が最大 3 回まで許可されます。関連検索を 3 回より多く使用すると、エラーがスローされます。Object Storage v2 でオブジェクトセット A からオブジェクトセット B への関連検索を実行する場合、結果のオブジェクトセット B に含まれるオブジェクトのインスタンスは 1,000 万個以下でなければならず、超えるとエラーがスローされます。Object Storage v1 の上限は、オブジェクトのインスタンス 100,000 個です。

オブジェクトセットのオブジェクトタイプに基づいて、_関連検索_メソッドが生成され、そのオブジェクトタイプに基づくリンクのたどり操作が可能になります。以下の例では、出発地コードに基づいて Flights のオブジェクトセットに絞り込み、その後、それらのフライトの乗客への関連検索を実行します。これにより、Passengers のオブジェクトセットが得られ、さらに絞り込みや関連検索を実行できます。

TypeScript v1 は、リンクタイプごとに、そのリンクの名前に基づく関連検索メソッドを 1 個生成します。TSv2 では、これらが単一の pivotTo() メソッドに置き換えられます。リンクを参照してください。

Copied!
1 2 3 4 const passengersDepartingFromAirport = Objects.search() .flights() .filter(flight => flight.departureAirportCode.exactMatch(airportCode)) .searchAroundPassengers();

関連検索メソッドは、プロジェクトにインポートされたリンクタイプに対してのみ生成されます。リンクタイプをインポートする方法の詳細については、チュートリアルを参照してください。

TypeScript v1 では、パフォーマンス上の理由から、1 回の検索で実行できる関連検索操作の回数は現在 3 回に制限されています。関連検索の深さが 3 レベルを超える検索を実行しようとすると、実行時に検索に失敗します。

K 近傍法(KNN)

KNN の制限

KNN は、OSv2 にインデックス化されたオブジェクトタイプでのみサポートされています。TypeScript v1 では、k 値は 0 < K <= 100 の範囲に制限されます。また、検索ベクトルはインデックス化に使用したベクトルと同じサイズでなければならず、次元数の上限は 2048 です。これらの制限のいずれかを超えると、エラーがスローされます。

埋め込みプロパティを持つオブジェクトタイプは、KNN 検索で利用できます。これらの検索は、指定された埋め込みパラメーターに最も近い埋め込みプロパティを持つオブジェクトを k 個返します。以下の例は、指定された映画の脚本に最も類似する映画を返します。埋め込みは、Pipeline Builder などの変換ツールで生成できます。また、関数のクエリ時に、Palantir が提供する埋め込みモデルを使用するか、関数内で独自のモデルを使用することで生成することもできます。

関数リポジトリの functions.json 設定ファイルで、enableVectorProperties エントリが true に設定されていることを確認してください。

どちらのバージョンも nearestNeighbors() を呼び出しますが、シグネチャは異なります。TypeScript v1 は、ベクトルプロパティと検索ベクトルを指定するコールバックを渡します。一方、TSv2 は、クエリ、近傍の件数、プロパティを位置引数として受け取り、近傍の上限は 100 件ではなく 500 件です。最近傍を参照してください。

Copied!
1 2 3 4 5 6 7 8 9 10 import { Objects } from "@foundry/ontology-api"; const kValue: number = 2; // ベクトルは FML Live で生成するか、既存のオブジェクトから取得できます const vector: Double[] = [0.7, 0.1, 0.3]; const movies: Movies[] = Objects.search() .movies() .nearestNeighbors(obj => obj.vectorProperty.near(vector, { kValue })) .orderByRelevance() .take(kValue);

上記の例では、最初の kValue 件の結果を取得する前に、関連度で並べ替えも行っています。

セマンティック検索のワークフロー全体の例については、セマンティック検索ワークフローガイドを確認してください。

集合演算

TypeScript v1 では、同じオブジェクトタイプのオブジェクトセットを、集合演算を使用してさまざまな方法で組み合わせることができます。

  • .union() は、指定されたオブジェクトセットのいずれかに存在するオブジェクトからなる、新しいオブジェクトセット(和集合)を作成します。
  • .intersect() は、指定されたすべてのオブジェクトセットに存在するオブジェクトからなる、新しいオブジェクトセット(積集合)を作成します。
  • .subtract() は、指定されたオブジェクトセットに存在するオブジェクトを減算します。

TSv2 は、同じ名前で同じ 3 個のメソッドを公開しています。集合演算を参照してください。

すべてのオブジェクトの取得

TypeScript v1 では、.all() と .allAsync() メソッドはオブジェクトセット内のすべてのオブジェクトを取得しますが、一度に大量のオブジェクトを読み込もうとすると、関数の実行に失敗します。TypeScript v1 で読み込めるオブジェクトの最大数は 100,000 個です。ただし、10,000 個を超えるオブジェクトを読み込むと、関数の実行がタイムアウトすることもあります。関数の時間とメモリー使用量の制限について詳しくはこちら。

.allAsync() メソッドを使用すると、オブジェクトセット内のすべてのオブジェクトに解決される Promise を取得できます。これは、複数のオブジェクトセットからデータを並列で読み込む場合に便利です。

TSv2 の対応する機能については、オブジェクトをメモリーに読み込むを参照してください。

並べ替えと件数の制限

すべてのオブジェクトを取得する代わりに、オブジェクトセットに並べ替え句を適用し、読み込むオブジェクトの件数を指定することで、限られた件数のみを読み込むことができます。TypeScript v1 では、以下のメソッドを使用できます。

  • .orderBy() は、並べ替えに使用する検索可能なプロパティを指定し、並べ替えの方向を指定できます。このメソッドで選択できるのは、並べ替え可能なデータ型(数値、日付、文字列)のプロパティのみです。.orderBy() を複数回呼び出すことで、複数のプロパティで並べ替えることができます。
  • .orderByRelevance() は、指定されたフィルターにどの程度一致するかという順序でオブジェクトを返すように指定し、最も関連度の高いものを最初に表示します。特定のオブジェクトのプロパティ値に対するクエリ語句の関連度は、その語句がプロパティ値に出現する頻度、すべてのオブジェクト全体でその語句が出現する頻度などを考慮して、複雑な判定を行います。.exactMatch() フィルターのみを実行する場合や、文字列以外のプロパティで絞り込む場合には、関連度はあまり適していません。1 回の検索では、.orderBy() と .orderByRelevance() のいずれか一方のみを使用できます。
  • .take() と .takeAsync() を使用すると、セットから指定した件数のオブジェクトを取得できます。これらのメソッドは、並べ替えを指定した後にのみ利用できます。

TSv2 については、並べ替えた結果の読み込みを参照してください。並べ替えと読み込みには、TSv2 に対応する形式がない TSv1 の機能が記載されています。

たとえば、以下のコードは、勤務開始日が最も早い従業員を 10 人取得します。

Copied!
1 2 3 4 Objects.search() .employees() .orderBy(e => e.startDate.asc()) .take(10)

別の例として、保険会社への事故の保険金請求に関するテキストを含むオブジェクトタイプ claims を考えてみます。赤い車と鹿が関係する特定の請求を見つけたいとします。.orderByRelevance() の行がない場合、red、car、collision、with、deer のいずれかの単語を含む結果が、上位 10 件の結果として返される可能性があります。.orderByRelevance() の行がある場合、最初の 10 件の結果は、最も多くの語句を含む請求になり、最も関連度の高い請求が最初に表示されます。

以下の例は、請求を絞り込み、関連度で並べ替えます。

Copied!
1 2 3 4 5 const results = Objects.search() .claims() .filter(doc => doc.text.matchAnyToken("red car collision with deer")) .orderByRelevance() .take(10)

集計の計算

TypeScript v1 の集計の制限

TypeScript v1 Objects API から返される集計は、合計 10,000 個のバケットに制限されています。この制限を超えると、エラーがスローされます。

.topValues() を使用してバケット分けする場合、データに 1,000 個を超える重複しない値があると、結果は近似値になります。その場合、上位の値のリストは正確でない可能性があります。

プロパティによるオブジェクトのグループ化

多くの場合、オブジェクトセット内のすべてのオブジェクトを読み込む必要はありません。代わりに、バケット分けされた値の集計のみを読み込んで、さらに分析を行うことができます。

集計の計算を開始するには、オブジェクトセットの .groupBy() メソッドを呼び出します。これにより、オブジェクトセットのオブジェクトタイプで検索可能なプロパティのいずれかを使用して、バケット分けを指定できます。

TSv2 については、グループ化の種類を参照してください。

たとえば、このコードは従業員を勤務開始日でグループ化します。

Copied!
1 2 3 Objects.search() .employees() .groupBy(e => e.startDate.byDays())

バケット分けに使用するプロパティを指定する際には、プロパティタイプに応じて、バケット分けの方法に関する追加情報を指定する必要があります。TSv2 については、グループ化戦略の対応表を参照してください。TypeScript v1 のバケット分けメソッドは以下のとおりです。

  • boolean プロパティの場合、唯一の選択肢は .topValues() です。これは、true 用と false 用の 2 個のバケットを返します。
  • 文字列プロパティには、2 個の選択肢があります。
    • .topValues():迅速なレスポンスが必要な場合や、カーディナリティが小さいプロパティに適しています。文字列プロパティの上位 1,000 個の値でバケット分けします。この制限は、返される集計が過度に大きくならないようにするためのものです。
    • .exactValues():より正確な集計や、カーディナリティが高いプロパティで最大 10,000 個のバケットを対象とする場合に適しています。対象となるバケット数は、.exactValues({"maxBuckets": numBuckets}) で指定できます。numBuckets は 0 から 10,000 までの整数値である必要があります。このメソッドでは、より多くの結果を対象とする必要があるため、レスポンス時間が長くなる場合があります。
  • 数値型のプロパティ(たとえば、Integer、Long、Float、Double)には、以下の 2 個のバケット分けの選択肢があります。
    • .byRanges() では、使用する範囲を正確に指定できます。たとえば、.byRanges({ min: 0, max: 50 }, { min: 50, max: 100 }) を使用して、ここで指定した [0, 50] と [50, 100] の 2 個の範囲にオブジェクトをバケット分けできます。範囲の min は含まれ、max は含まれません。min を省略すると -∞ から max までの値を含むバケットを表し、max を省略すると min から ∞ までの値を含むバケットを表します。
    • .byFixedWidth() は、各バケットの幅を指定します。たとえば、.byFixedWidth(50) を使用して、それぞれ幅が 50 の範囲にオブジェクトをバケット分けできます。
  • LocalDate プロパティには、簡単にバケット分けできるさまざまな便利なメソッドが用意されています。
    • .byYear()
    • .byQuarter()
    • .byMonth()
    • .byWeek()
    • .byDays() は、値を日単位でバケット分けします。バケットの幅に使用する日数を渡すことができます。
  • Timestamp プロパティには、LocalDate と同じバケット分けの選択肢に加えて、以下のメソッドが適用されます。
    • .byHours() は、値を時間単位でバケット分けします。バケットの幅に使用する時間数を渡すことができます。
    • .byMinutes() は、値を分単位でバケット分けします。バケットの幅に使用する分数を渡すことができます。
    • .bySeconds() は、値を秒単位でバケット分けします。バケットの幅に使用する秒数を渡すことができます。
  • Array プロパティの場合、バケット分けの選択肢は配列の要素のデータ型によって決まります。具体的には、Array<PropertyType> には、PropertyType と同じバケット分けメソッドが用意されます(たとえば、Array<boolean> には boolean と同じバケット分けメソッドが用意されます)。
    • たとえば、Alice と Bob で構成される employeeSet というオブジェクトセットがあり、Array<string> プロパティ pastCountries に Alice は ["US", "UK"]、Bob は ["US"] を保持している場合、employeeSet.groupBy(e => e.pastCountries.exactValues()).count() は { "US": 2, "UK": 1 } を返します。

1 個のプロパティでグループ化した後、必要に応じて .segmentBy() メソッドを呼び出して、さらにバケット分けを行うことができます。これにより、2 個の検索可能なプロパティでバケット分けした 3 次元の集計を計算できます。TypeScript v2 は、同じ $groupBy オブジェクト内の 2 個目のキーを通じて 2 個目のプロパティでバケット分けを行い、異なる形式の結果を返します。移行ガイドの TypeScript v2 に対応する機能がない機能を参照してください。

たとえば、以下のように従業員を勤務開始日とロールでグループ化できます。

Copied!
1 2 3 4 Objects.search() .employees() .groupBy(e => e.startDate.byDays()) .segmentBy(e => e.role.topValues())

集計メトリクスの選択

オブジェクトセットをグループ化した後、さまざまな集計メソッドを呼び出して、各バケットの集計メトリクスを計算できます。TypeScript v1 では、プロパティを必要とするメソッドは、検索可能に指定されたプロパティのみを受け付けます。TypeScript v2 の対応する機能については、移行ガイドの集計メトリクスの対応表を参照してください。利用可能な TypeScript v1 の集計メソッドは以下のとおりです。

  • .count() は、各バケット内のオブジェクトの件数を返します
  • .average() は、指定された数値、タイムスタンプ、日付のプロパティの平均値を返します
  • .max() は、指定された数値、タイムスタンプ、日付のプロパティの最大値を返します
  • .min() は、指定された数値、タイムスタンプ、日付のプロパティの最小値を返します
  • .sum() は、指定された数値型のプロパティの値の合計を返します
  • .cardinality() は、指定されたプロパティの重複しない値の概数を返します

TypeScript v1 では、これらのメソッドのいずれかを呼び出すと、TwoDimensionalAggregation または ThreeDimensionalAggregation が返されます。最終的な集計メソッドのいずれかを呼び出す前に .segmentBy() を呼び出した場合は、ThreeDimensionalAggregation が返されます。

有効なバケット分けのデータ型を含め、これらの集計のデータ型の構造について詳しくはこちら。

集計の計算にはリモートサービスからデータを読み込む必要があるため、結果の集計は Promise にラップされます。async/await ↗ 構文を使用して、Promise の結果を取り出すことができます。

以下は、集計を読み込み、結果として返す TypeScript v1 の完全な例です。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 import { Double, Function, ThreeDimensionalAggregation } from "@foundry/functions-api"; import { Objects } from "@foundry/ontology-api"; export class AggregationFunctions { @Function() public async employeesByRoleAndOffice(): Promise<ThreeDimensionalAggregation<string, string, Double>> { return Objects.search() .employee() .groupBy(e => e.title.topValues()) .segmentBy(e => e.office.topValues()) .count(); } }

TypeScript v1 では、グループ化された集計はすでに ThreeDimensionalAggregation の形式になっているため、上記のように関数から直接返すことができます。TSv2 では、.aggregate() が行のフラットな配列を返すため、関数側で集計のデータ型を組み立てる必要があります。集計のデータ型とグループ化を参照してください。

以下は、groupBy ステートメントを使用せずに集計を行う完全な例です。TypeScript v1 は、?? 0 を使用して件数が未定義の場合に対処します。

Copied!
1 2 3 4 5 6 7 8 9 10 import { Double, Function } from "@foundry/functions-api"; import { Objects } from "@foundry/ontology-api"; export class AggregationFunctions { @Function() public async employeesStats(): Promise<Double> { // すべての従業員の件数。count() が undefined を返す場合はデフォルトで 0 を使用します return Objects.search().employee().count() ?? 0; } }

上記の TypeScript v1 のコード例で該当する行を置き換えることで、groupBy を使用せずに他の集計を実行することもできます。たとえば、以下のような集計があります。

  • すべての従業員の件数: Objects.search().employee().count();(上記の例に示したとおり)
  • 従業員の平均在籍期間: Objects.search().employee().average(e => e.tenure);
  • 従業員の在籍期間の最大値: Objects.search().employee().max(e => e.tenure);
  • 従業員の在籍期間の最小値: Objects.search().employee().min(e => e.tenure);
  • すべての従業員の給与の合計: Objects.search().employee().sum(e => e.salary);
  • オフィスの件数: Objects.search().employee().cardinality(e => e.office);

メモリー内で集計結果を操作する例については、カスタム集計の作成のガイドをお試しください。