온톨로지 집계의 정확도
서로 다른 값이 많은 속성을 집계하면 반환된 값이나 상위 버킷 목록이 근사 결과일 수 있습니다. 버킷(Bucket)은 같은 값이나 구간으로 묶은 객체들의 그룹입니다. 각 버킷의 개수가 정확한지와 실제 상위 버킷을 모두 골랐는지는 서로 다른 문제입니다.
OSS 실행 모드와 정확도 표시
object-set-service 요청의 AggregationExecutionMode를 지원하는 경로에서는 PREFER_ACCURACY를 지정하여 정확도를 우선할 수 있습니다. 응답은 느려질 수 있으며 이 선택만으로 모든 집계를 완전히 정확하게 만들지는 않습니다. 응답의 AggregateResultAccuracy는 결과의 정확도 상태를 표시합니다.
Object Explorer와 Workshop 히스토그램
2천만 객체를 집계하는 예시에서 Object Explorer와 Workshop Filter List는 두 번의 요청으로 히스토그램을 만듭니다.
- 개수 기준 상위 100개 버킷을 요청합니다. 이 목록은 근사 결과일 수 있습니다.
- 선택된 100개 버킷만 필터링한 뒤 각 버킷의 개수를 다시 계산합니다.
두 번째 요청의 표시 개수는 정확해도, 첫 요청이 놓친 버킷을 새로 찾아 주지는 않습니다. 따라서 표시된 목록이 전체 데이터의 진짜 상위 100개라는 보장은 없습니다. 두 앱의 이 경로는 AggregationExecutionMode를 지정하지 않으므로 OSS의 기본값인 PREFER_SPEED를 사용합니다.
Quiver와 Workshop 피벗 표
피벗 표에서 개수 내림차순을 선택해도 실제 상위 버킷 순서가 아닐 수 있습니다. 이러한 경우 다음 메시지가 표시될 수 있습니다.
Too many values for column, not all are displayedShowing approximate results due to computational limitationsOnly loading first 1,000 values per property. Filter your data for more accurate results.
두 앱의 피벗 표를 구성하는 집계 요청은 버킷의 정렬을 지정하지 않습니다. 화면에서 반환된 버킷만 정렬하므로, 화면 정렬로 누락된 상위 버킷을 복구할 수는 없습니다. 필터로 데이터 범위를 좁히면 집계할 값의 종류를 줄일 수 있습니다.
Ontology SDK
OSDK의 정확도 우선 실행도 그룹별 반환 한도를 없애지는 않습니다. TypeScript OSDK의 "exact" 그룹화는 기본적으로 최대 10,000개 버킷을 사용합니다. 속성의 고유값 수가 한도를 넘으면 일부 객체가 반환 그룹에서 제외되어 근사 집계가 됩니다. TypeScript OSDK는 플랫폼 응답의 정확도 필드를 노출하지 않으므로 반환 모양만으로 정확한 결과인지 구분할 수 없습니다. 지원 범위 안에서 $exactWithLimit를 조정하거나 where로 입력 범위를 좁힙니다. TSv2 그룹화의 한도를 함께 확인합니다.
TypeScript v1 함수에서 버킷 정렬
TypeScript v1의 객체 함수 집계는 PREFER_ACCURACY를 사용합니다. 반환된 버킷의 개수 값이 정확해도, topValues()가 선택한 상위 목록은 서로 다른 값이 1,000개를 넘으면 근사일 수 있습니다. 반환 집계에는 총 10,000개 버킷 한도가 있습니다.
이 API는 같은 집계 호출에서 groupBy와 orderBy를 함께 사용할 수 없으므로 반환한 버킷을 메모리에서 정렬합니다. 다음 aggregation.ts는 검색 메서드 _af20mInstancesObv2()와 문자열 속성 exampleBucket이 생성된 예시 객체 유형을 프로젝트로 가져온 경우의 코드입니다. exampleBucket에 Searchable 렌더링 힌트가 필요합니다. 다른 유형에서는 해당 프로젝트가 생성한 검색 메서드와 속성 식별자를 사용해야 합니다.
import { Double, Function, TwoDimensionalAggregation } from "@foundry/functions-api";
import { Objects } from "@foundry/ontology-api";
export class AggregationFunctions {
@Function()
public async aggregateOnMoreBucketsThanAuthorized(): Promise<TwoDimensionalAggregation<string, Double>> {
const aggregation = await Objects.search()
._af20mInstancesObv2()
.groupBy(object => object.exampleBucket.topValues())
.count();
aggregation.buckets.sort((left, right) => right.value - left.value);
return aggregation;
}
}
함수 프로젝트의 index.ts에서 클래스를 내보냅니다.
export { AggregationFunctions } from "./aggregation";
집계 요청이 실패하면 함수도 실패합니다. 메모리 정렬은 반환된 버킷만 정렬하므로 선택 과정에서 빠진 버킷의 순위를 복구하지 않습니다. 더 많은 문자열 버킷을 고려하려면 TSv1의 exactValues({ maxBuckets: n })을 사용할 수 있습니다. n은 0부터 10,000 사이의 정수이며, 더 많은 버킷을 처리하므로 응답 시간이 늘 수 있습니다.
다음은 태그를 포함한 API 직렬화 형식의 예시입니다. 세 버킷은 각각 10105의 461개, 10163의 454개와 10848의 454개를 나타냅니다.
{
"buckets": [
{
"key": { "string": "10105", "type": "string" },
"value": { "double": 461, "type": "double" }
},
{
"key": { "string": "10163", "type": "string" },
"value": { "double": 454, "type": "double" }
},
{
"key": { "string": "10848", "type": "string" },
"value": { "double": 454, "type": "double" }
}
]
}