Ontology SQL
Ontology SQL은 객체 유형, 다대다 링크와 인터페이스를 객체 저장소에서 직접 조회하는 엔진입니다. 공통 ANSI 계열 Spark SQL 파싱 계층을 사용하지만 객체 속성, 기본 키와 관계를 SQL 스키마에 대응시키는 전용 백엔드로 실행합니다.
베타 기능으로 일부 환경에는 제공되지 않거나 동작이 바뀔 수 있습니다. 읽기 전용이며 데이터나 스키마 변경 문장을 실행하지 않습니다.
구조와 진입점
객체 유형 및 다대다 링크 제공자가 온톨로지 개념을 테이블 스키마로 변환합니다. 객체 집합과 같은 저장소를 직접 조회하므로 별도 중간 데이터 이동이 필요하지 않습니다. 계획 후 OSS가 실행 엔진과 자원을 정하며 더 크거나 복잡한 일부 쿼리는 Spark로 실행할 수 있습니다.
외부 애플리케이션에서는 Ontology SQL 실행 API를 사용할 수 있습니다. 프리뷰 요청, 자료형이 지정된 매개변수와 객체 집합 입력을 구성하고 Arrow 바이트 응답을 처리합니다.
SQL Studio 또는 Ontology Manager의 SQL console에서 Object mode를 선택합니다. 객체 유형 RID를 백틱으로 감싸 조회합니다.
SELECT * FROM `ri.ontology.main.object-type.<object-type-rid>`;
다음은 설명용 Employee 유형 RID를 사용한 예시입니다.
SELECT * FROM `ri.ontology.main.object-type.00000000-0000-0000-0000-000000000000`;
다대다 링크는 relation RID를 참조합니다.
SELECT * FROM `ri.ontology.main.relation.<relation-rid>`;
속성과 관계
열 이름에는 표시 이름이 아니라 속성의 API 이름을 사용합니다. Ontology Manager에서 API 이름을 확인합니다.
SELECT employeeId, firstName, department
FROM `ri.ontology.main.object-type.<employee-rid>`;
일대일 및 일대다 조인은 Ontology Manager에 링크 유형을 미리 정의하지 않아도 SQL로 구성할 수 있습니다. 정의된 링크를 사용하는지 여부만으로 성능이 달라지지는 않습니다.
다대다는 조인 테이블과 Ontology Manager의 링크 유형 정의가 필요합니다. 링크 테이블의 외래 키 열 이름은 <objectTypeApiName>_<relationApiName> 형태입니다.
가상의 Person은 API 이름 person, 기본 키 personId, 사람 쪽 링크 이름 vehicles를 사용합니다. Car는 car, carId, 자동차 쪽 링크 이름 drivers를 사용합니다. 아래 예시의 relation RID와 객체 유형 RID는 실제 값으로 치환합니다. person_vehicles는 해당 연결의 자동차 키, car_drivers는 사람 키를 조회하는 데 사용됩니다.
SELECT c.*
FROM `ri.ontology.main.relation.0` AS linkTable
INNER JOIN `ri.ontology.main.object-type.<car-rid>` AS c
ON c.`carId` = linkTable.`person_vehicles`
WHERE linkTable.`car_drivers` = 'person-123';
자동차 한 대를 운전하는 사람을 찾는 방향은 다음과 같습니다.
SELECT p.*
FROM `ri.ontology.main.relation.0` AS linkTable
INNER JOIN `ri.ontology.main.object-type.<person-rid>` AS p
ON p.`personId` = linkTable.`car_drivers`
WHERE linkTable.`person_vehicles` = 'car-456';
여러 관계를 다룰 때는 linkTable, c, p 같은 테이블 별칭을 사용하면 긴 RID를 반복하지 않고 조인 대상을 구분할 수 있습니다.
변수
DECLARE는 첫 문장이어야 하며 한 번만 사용할 수 있습니다. 여러 변수는 같은 DECLARE에서 함께 선언합니다. 이름에는 문자, 숫자와 밑줄을 사용할 수 있고 SET은 허용하지 않습니다.
DECLARE @minSalary DOUBLE = 75000.0, @department STRING = 'Engineering';
SELECT employeeId, salary
FROM `ri.ontology.main.object-type.<employee-rid>`
WHERE salary > @minSalary AND department = @department;
객체 집합 변수는 자료형 대신 객체 유형 RID를 백틱으로 감싸 지정합니다. 그 유형의 객체 집합 형태를 강제하며 선언의 기본값은 해당 유형 전체이고 기본값을 별도로 덮어쓸 수 없습니다.
DECLARE @employees `ri.ontology.main.object-type.<object-type-rid>`;
SELECT employeeId
FROM @employees;
user, result 같은 예약어 속성은 백틱으로 감싸 충돌을 피합니다.
SELECT `user`, `result` FROM `ri.ontology.main.object-type.<object-rid>`;
성능을 위한 쿼리 구성
WHERE에서 열에 함수를 적용하거나 계산한 열을 필터링하면 인덱스를 활용하지 못해 성능과 처리 규모가 제한될 수 있습니다. 예를 들어 YEAR(hireDate)=2023 대신 원래 날짜 열을 범위로 비교하는 방식이 적합합니다.
SELECT employeeId, hireDate
FROM `ri.ontology.main.object-type.<employee-rid>`
WHERE hireDate >= '2023-01-01' AND hireDate < '2024-01-01';
salary + bonus > 100000 같은 행별 계산 필터도 같은 제약을 고려합니다. 이를 salary > 100000 - bonus로 정리하더라도 오른쪽이 행마다 달라지는 계산이므로 그 형태만으로 인덱스 사용을 보장하지 않습니다. 집계 이전 또는 이후에 변환된 열을 필터링하는 경우도 주의합니다. 필요하지 않은 큰 벡터 임베딩 열은 선택하지 않아 실행 시간과 메모리를 줄입니다.
한도와 지원 조건
| 조건 | 동작 |
|---|---|
| 문장 | 선택적 DECLARE를 제외하고 SELECT 하나만 허용합니다. |
| 변경 | INSERT, UPDATE, DELETE, CREATE, ALTER, DROP을 지원하지 않습니다. |
| 혼합 조회 | 한 쿼리에서 객체와 데이터셋을 혼합할 수 없습니다. |
| 결과 행 | 서비스 최대 10,000행이며 LIMIT가 없어도 잘립니다. 앱은 더 낮은 한도를 적용할 수 있습니다. |
| OFFSET | OFFSET+LIMIT가 10,000 이하여야 합니다. 1,000+1,000은 가능하지만 9,000+2,000은 불가합니다. |
| 자원 대기 | OSS Spark 포화 시 최대 6초 대기합니다. |
| 실행 시간 | 20초 제한이며 대기 또는 실행 한도를 넘으면 NotEnoughSparkResources 오류가 발생합니다. |
| 객체 저장소 | Object Storage v2에서만 제공합니다. |
| 객체 집합 | 프런트엔드에 따라 입력에 사용할 수 있지만 결과로 직접 반환할 수 없습니다. |
벡터 속성은 기술적으로 지원하지만 크기 때문에 프런트엔드가 제외할 수 있습니다. 다른 온톨로지 열 유형은 SQL 호환 유형으로 변환됩니다. 객체 유형, 정의된 다대다 링크, 인터페이스, 일대일/일대다 조인, 브랜치와 시나리오를 지원합니다. 개별 함수 및 자료형의 정확한 지원 범위는 공통 문법을 확인합니다.