Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

온톨로지 SQL 실행(Execute Ontology SQL Query)

온톨로지에 SQL 쿼리를 실행하고 결과를 Apache Arrow 형식으로 동기 반환합니다. 이 엔드포인트는 프리뷰이며 언제든 변경되거나 제거될 수 있습니다. 호출하려면 요청의 쿼리 매개변수에 preview=true를 지정해야 합니다.

요청

경로 매개변수는 없습니다. JSON 본문 ExecuteOntologySqlQueryRequest는 필수입니다.

위치이름자료형필수 여부와 동작
쿼리previewboolean프리뷰 사용을 위해 true 지정 필요
본문querystring필수. 실행할 SQL
본문parametersSqlQueryParameters선택. 위치 순서 또는 이름별로 전달하는 자료형 지정 매개변수
본문rowLimitinteger선택. 반환할 최대 행 수
본문dryRunboolean선택. true이면 실행하지 않고 파싱 및 검증. 기본값 false
본문branchstring선택. 실행할 Foundry 브랜치. 생략하면 기본 main 브랜치
본문scenarioRidstring선택. 평가에 적용할 시나리오 RID. 생략하면 시나리오 미적용
본문ontologyIdentifierstring선택. 온톨로지 RID 또는 API 이름
본문tableProvidersmap<TableName, ObjectSet>선택. SQL 테이블 이름별 객체 집합 제공자

tableProviders를 지정하면 ontologyIdentifier도 제공해야 하며, 없으면 오류가 발생합니다. TableName은 SQL 테이블 이름인 문자열입니다. 매개변수 자료형은 15가지 ParameterValue와 재귀적인 ColumnType을 설명합니다. ObjectSet 정의에서는 테이블 제공자에 사용할 기본 집합, 인터페이스, 링크 탐색, 필터, 파생 속성과 최근접 이웃 조건을 확인합니다.

조회 대상과 제한

객체 유형 RID는 SQL에서 백틱으로 감쌉니다. 속성은 표시 이름 대신 API 이름을 사용합니다. Ontology SQL의 SELECT 문법과 지원 조건을 따르며, Object Storage V1에 인덱싱된 객체나 링크는 조회할 수 없습니다.

Ontology SQL 서비스는 최대 10,000행으로 결과를 제한합니다. rowLimit이나 SQL의 LIMIT를 지정했다고 이 서비스 한도가 늘어나는 것은 아닙니다. 객체 집합은 입력으로 사용할 수 있지만 객체 집합 자체를 직접 결과로 반환하지 않습니다. 데이터셋과 객체를 한 쿼리에서 혼합하지 않습니다.

응답과 예시 설정

성공 응답 본문은 Arrow 바이너리입니다. 데이터셋 SQL의 비동기 실행처럼 QueryStatus JSON을 받은 뒤 결과 조회를 호출하는 방식과 구분합니다.

예시는 특정 브랜치와 시나리오에서 가상 객체 유형을 조회합니다. 객체 유형, 브랜치, 시나리오의 RID와 ontologyIdentifier는 실제 조회 대상에 맞게 바꿉니다. 기본 브랜치와 시나리오 없는 조회를 원하면 선택적인 branch와 scenarioRid를 생략합니다. 결과를 문자열로 변환하지 않고 파일에 저장합니다.

HTTP 요청

POST /api/v2/sqlQueries/executeOntology

작업 식별자는 v2.executeOntologySqlQuery입니다. Authorization: Bearer <접근 토큰> 헤더로 인증합니다. OAuth 클라이언트에는 api:sql-queries-execute, api:ontologies-read 권한 범위가 필요합니다.

JSON 요청 예시

가상 브랜치와 시나리오를 지정한 요청 예시입니다.

{
  "query": "SELECT * FROM `ri.ontology.main.object-type.0381eda6-69bb-4cb7-8ba0-c6158e094a04`",
  "scenarioRid": "ri.actions..scenario.cf2a8a49-8b56-446d-ab04-a6bc7fadef48",
  "branch": "ri.branch..branch.d827184f-ee0e-4351-8b70-efbe51e07252",
  "ontologyIdentifier": "example-ontology"
}

오류

실패 응답은 공통 오류 형식을 따릅니다.

오류 이름오류 코드HTTP 상태매개변수의미
QueryParseErrorINVALID_ARGUMENT400errorMessageSQL 문을 파싱할 수 없습니다.
OntologyQueryFailedINTERNAL500errorMessage온톨로지 쿼리가 실패했습니다. errorMessage에서 이유를 확인합니다.
OntologyQueryInvalidObjectBackendINVALID_ARGUMENT400objectTypeRids, linkTypeRids조회한 객체 유형 또는 링크 유형이 Object Storage V1에 인덱싱되어 있습니다. V2로 이관하거나 쿼리에서 해당 대상을 제외합니다.
OntologyQueryNestedObjectSetTooLargeINVALID_ARGUMENT400nestedObjectSetSize, maxAllowedNestedObjectSetSize조인, 링크 조회 또는 하위 쿼리가 참조하는 객체 수가 너무 많습니다. 필터를 추가하거나 조인 및 객체 유형 범위를 줄입니다. 실제 수와 허용 최대 수를 매개변수로 반환합니다.
OntologyQueryStringColumnTooLongINVALID_ARGUMENT400columnName결과 문자열 셀에 플랫폼의 셀 크기 한도를 넘는 값이 있습니다. 해당 열을 제외하거나 필터를 적용하고, 큰 값을 가진 행을 조회 범위에서 제외합니다.
OntologyObjectTypeNotFoundNOT_FOUND404objectTypeRid객체 유형 RID가 없거나 호출 사용자에게 보이지 않습니다. 유형 목록이나 상세 조회에서 RID와 접근 권한을 확인합니다.
ExecuteOntologySqlQueryPermissionDeniedPERMISSION_DENIED403없음Ontology SQL을 실행할 권한이 없습니다.

요청 예제

FOUNDRY_HOST에는 https://를 제외한 Foundry 호스트를, FOUNDRY_TOKEN에는 유효한 토큰을 환경 변수로 제공합니다. 아래 식별자와 입력값은 예시이므로 실제 요청 대상에 맞게 지정합니다.

SQL_RESULT_FILE에는 결과를 저장할 파일 경로를 지정합니다. 파일에는 응답 바이트를 기록하며 기존 파일이 있으면 덮어씁니다.

cURL

curl --fail --output "${SQL_RESULT_FILE}" -X POST \
	-H "Content-type: application/json" \
	-H "Authorization: Bearer ${FOUNDRY_TOKEN}" \
	"https://${FOUNDRY_HOST}/api/v2/sqlQueries/executeOntology?preview=true" \
	-d '{"query":"SELECT * FROM `ri.ontology.main.object-type.0381eda6-69bb-4cb7-8ba0-c6158e094a04`","scenarioRid":"ri.actions..scenario.cf2a8a49-8b56-446d-ab04-a6bc7fadef48","branch":"ri.branch..branch.d827184f-ee0e-4351-8b70-efbe51e07252","ontologyIdentifier":"example-ontology"}'

Python

Requests 라이브러리가 설치된 Python 환경에서 사용합니다.

import os
import requests

HOSTNAME = os.environ["FOUNDRY_HOST"]
TOKEN = os.environ["FOUNDRY_TOKEN"]
headers = {
    "content-type": "application/json",
    "authorization": "Bearer {}".format(TOKEN)
}
request_body = {'query': 'SELECT * FROM '
          '`ri.ontology.main.object-type.0381eda6-69bb-4cb7-8ba0-c6158e094a04`',
 'scenarioRid': 'ri.actions..scenario.cf2a8a49-8b56-446d-ab04-a6bc7fadef48',
 'branch': 'ri.branch..branch.d827184f-ee0e-4351-8b70-efbe51e07252',
 'ontologyIdentifier': 'example-ontology'}

with requests.post('https://{}/api/v2/sqlQueries/executeOntology?preview=true'.format(HOSTNAME), headers=headers, json=request_body, stream=True) as response:
    response.raise_for_status()
    with open(os.environ["SQL_RESULT_FILE"], "wb") as output:
        for chunk in response.iter_content(chunk_size=1024 * 1024):
            output.write(chunk)

Java

Apache HttpClient 4.5 API와 try-with-resources를 사용하는 예제입니다. 클래스 이름에 맞는 ExecuteOntologySqlQueryExample.java 파일에서 사용합니다.

import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;

public class ExecuteOntologySqlQueryExample {
    public static void main(String[] args) throws Exception {
        String HOSTNAME = System.getenv("FOUNDRY_HOST");
        String TOKEN = System.getenv("FOUNDRY_TOKEN");

        try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {
            HttpPost request = new HttpPost("https://" + HOSTNAME + "/api/v2/sqlQueries/executeOntology?preview=true");
            request.addHeader("content-type", "application/json");
            request.addHeader("authorization", String.format("Bearer %s", TOKEN));
            request.setEntity(new StringEntity("{\"query\":\"SELECT * FROM `ri.ontology.main.object-type.0381eda6-69bb-4cb7-8ba0-c6158e094a04`\",\"scenarioRid\":\"ri.actions..scenario.cf2a8a49-8b56-446d-ab04-a6bc7fadef48\",\"branch\":\"ri.branch..branch.d827184f-ee0e-4351-8b70-efbe51e07252\",\"ontologyIdentifier\":\"example-ontology\"}", ContentType.APPLICATION_JSON));
            try (CloseableHttpResponse response = httpClient.execute(request)) {
                int status = response.getStatusLine().getStatusCode();
                if (status < 200 || status >= 300) {
                    throw new IOException("HTTP " + status);
                }
                try (OutputStream output = Files.newOutputStream(
                        Paths.get(System.getenv("SQL_RESULT_FILE")))) {
                    response.getEntity().writeTo(output);
                }
            }
        }
    }
}

JavaScript

fetch를 제공하는 Node.js의 ES 모듈(.mjs)에서 사용합니다. 서비스 사용자 토큰을 브라우저로 전달하지 않습니다.

import { createWriteStream } from "node:fs";
import { Readable } from "node:stream";
import { pipeline } from "node:stream/promises";

const HOSTNAME = process.env.FOUNDRY_HOST;
const TOKEN = process.env.FOUNDRY_TOKEN;

fetch(`https://${HOSTNAME}/api/v2/sqlQueries/executeOntology?preview=true`, {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'Authorization': `Bearer ${TOKEN}`,
    },
    body: JSON.stringify({
    "query": "SELECT * FROM `ri.ontology.main.object-type.0381eda6-69bb-4cb7-8ba0-c6158e094a04`",
    "scenarioRid": "ri.actions..scenario.cf2a8a49-8b56-446d-ab04-a6bc7fadef48",
    "branch": "ri.branch..branch.d827184f-ee0e-4351-8b70-efbe51e07252",
    "ontologyIdentifier": "example-ontology"
})
}).then(async (response) => {
    if (!response.ok) {
        throw new Error(`HTTP ${response.status}`);
    }
    await pipeline(
        Readable.fromWeb(response.body),
        createWriteStream(process.env.SQL_RESULT_FILE)
    );
});

PowerShell

$TOKEN = $env:FOUNDRY_TOKEN
$HOSTNAME = $env:FOUNDRY_HOST

$headers = @{
    "authorization" = "Bearer $TOKEN"
}

Invoke-WebRequest -Uri "https://$HOSTNAME/api/v2/sqlQueries/executeOntology?preview=true" `
	-Method Post `
	-Headers $headers `
    -OutFile $env:SQL_RESULT_FILE `
	-ContentType application/json `
	-Body '{"query":"SELECT * FROM `ri.ontology.main.object-type.0381eda6-69bb-4cb7-8ba0-c6158e094a04`","scenarioRid":"ri.actions..scenario.cf2a8a49-8b56-446d-ab04-a6bc7fadef48","branch":"ri.branch..branch.d827184f-ee0e-4351-8b70-efbe51e07252","ontologyIdentifier":"example-ontology"}'