콘텐츠로 이동

Query API 레퍼런스

엣지 쿼리 API (유니크 엣지). 유니크 엣지와 멀티 엣지의 차이는 FAQ를 참고하세요. 개념적 배경은 쿼리를 참고하세요.

특정 노드에서 시작하는 엣지의 수를 조회합니다.

GET /graph/v3/databases/{database}/tables/{table}/edges/count
위치파라미터필수 여부설명
HeaderAuthorization선택인증 키 (향후 사용을 위해 예약됨)
Pathdatabase필수타겟 데이터베이스 이름
Pathtable필수타겟 테이블 이름
Querystart필수시작 노드 ID
Querydirection필수쿼리 방향 (OUT 또는 IN)
Queryranges선택 (기본값: null)스캔 범위

Count - 엣지 카운트 정보를 포함한 페이로드

파라미터
AuthorizationYOUR_API_KEY
databaseyour_database
tableyour_table
startsource1
directionOUT
Terminal window
# count?start=source1&direction=OUT
curl -X GET \
"http://ab.example.com/graph/v3/databases/your_database/tables/your_table/edges/count?start=source1&direction=OUT" \
-H "Authorization: YOUR_API_KEY"
{
"start": "source1",
"direction": "OUT",
"count": 10,
"context": {}
}

소스 노드와 타겟 노드 사이의 엣지를 조회합니다.

GET /graph/v3/databases/{database}/tables/{table}/edges/get
위치파라미터필수 여부설명
HeaderAuthorization선택인증 키 (향후 사용을 위해 예약됨)
Pathdatabase필수타겟 데이터베이스 이름
Pathtable필수타겟 테이블 이름
Querysource필수소스 노드 ID 목록 (쉼표로 구분)
Querytarget필수타겟 노드 ID 목록 (쉼표로 구분)
Queryfilters선택 (기본값: null)필터링 조건

여러 소스 또는 타겟 ID를 지정하면 mget으로 동작하여 여러 엣지를 조회합니다. 이 경우 API 요청당 최대 25개의 엣지를 조회할 수 있습니다. 더 많은 엣지를 조회하려면 여러 API 요청을 보내세요.

EdgeFrame - 엣지 데이터를 포함한 페이로드

요청 예시 (Get) - 소스 1개, 타겟 1개

섹션 제목: “요청 예시 (Get) - 소스 1개, 타겟 1개”

(source, target)에 대한 엣지 데이터를 조회합니다. (최대 1개 결과)

파라미터
AuthorizationYOUR_API_KEY
databaseyour_database
tableyour_table
sourcesource1
targettarget1
Terminal window
# get?source=source1&target=target1
curl -X GET \
"http://ab.example.com/graph/v3/databases/your_database/tables/your_table/edges/get?source=source1&target=target1" \
-H "Authorization: YOUR_API_KEY"

응답:

{
"edges": [
{
"version": 1,
"source": "source1",
"target": "target1",
"properties": {
"weight": 0.8,
"type": "FOLLOWS"
},
"context": {}
}
],
"count": 1,
"total": 1,
"offset": null,
"hasNext": false,
"context": {}
}

요청 예시 (MGet) - 소스 1개, 타겟 N개

섹션 제목: “요청 예시 (MGet) - 소스 1개, 타겟 N개”

(source, target1) ~ (source, targetN)에 대한 엣지 데이터를 조회합니다. (최대 N개 결과)

파라미터
AuthorizationYOUR_API_KEY
databaseyour_database
tableyour_table
sourcesource1
targettarget1,target2,target3
Terminal window
# get?source=source1&target=target1,target2,target3
curl -X GET \
"http://ab.example.com/graph/v3/databases/your_database/tables/your_table/edges/get?source=source1&target=target1,target2,target3" \
-H "Authorization: YOUR_API_KEY"

응답:

{
"edges": [
{
"version": 3,
"source": "source1",
"target": "target3",
"properties": {
"weight": 0.75,
"type": "FOLLOWS"
},
"context": {}
},
{
"version": 1,
"source": "source1",
"target": "target1",
"properties": {
"weight": 0.8,
"type": "FOLLOWS"
},
"context": {}
}
],
"count": 2,
"total": 2,
"offset": null,
"hasNext": false,
"context": {}
}

요청 예시 (MGet) - 소스 M개, 타겟 1개

섹션 제목: “요청 예시 (MGet) - 소스 M개, 타겟 1개”

(source1, target) ~ (sourceM, target)에 대한 엣지 데이터를 조회합니다. (최대 M개 결과)

파라미터
AuthorizationYOUR_API_KEY
databaseyour_database
tableyour_table
sourcesource1,source2,source3
targettarget1
Terminal window
# get?source=source1,source2,source3&target=target1
curl -X GET \
"http://ab.example.com/graph/v3/databases/your_database/tables/your_table/edges/get?source=source1,source2,source3&target=target1" \
-H "Authorization: YOUR_API_KEY"

응답:

{
"edges": [
{
"version": 3,
"source": "source3",
"target": "target1",
"properties": {
"weight": 0.75,
"type": "FOLLOWS"
},
"context": {}
},
{
"version": 1,
"source": "source1",
"target": "target1",
"properties": {
"weight": 0.8,
"type": "FOLLOWS"
},
"context": {}
}
],
"count": 2,
"total": 2,
"offset": null,
"hasNext": false,
"context": {}
}

요청 예시 (MGet) - 소스 M개, 타겟 N개 (권장하지 않음)

섹션 제목: “요청 예시 (MGet) - 소스 M개, 타겟 N개 (권장하지 않음)”

(source1, target1) ~ (sourceM, targetN)에 대한 엣지 데이터를 조회합니다. (최대 M × N개 결과)

참고: 이 형식은 최대 M × N개의 엣지를 조회할 수 있으므로 프로덕션에서 사용하지 않아야 합니다.

파라미터
AuthorizationYOUR_API_KEY
databaseyour_database
tableyour_table
sourcesource1,source2,source3
targettarget1,target2,target3
Terminal window
# get?source=source1,source2,source3&target=target1,target2,target3
curl -X GET \
"http://ab.example.com/graph/v3/databases/your_database/tables/your_table/edges/get?source=source1,source2,source3&target=target1,target2,target3" \
-H "Authorization: YOUR_API_KEY"

응답:

{
"edges": [
{
"version": 3,
"source": "source1",
"target": "target3",
"properties": {
"weight": 0.75,
"type": "FOLLOWS"
},
"context": {}
},
{
"version": 3,
"source": "source3",
"target": "target1",
"properties": {
"weight": 0.75,
"type": "FOLLOWS"
},
"context": {}
},
{
"version": 1,
"source": "source1",
"target": "target1",
"properties": {
"weight": 0.8,
"type": "FOLLOWS"
},
"context": {}
}
],
"count": 3,
"total": 3,
"offset": null,
"hasNext": false,
"context": {}
}

인덱스를 사용하여 엣지를 스캔합니다.

GET /graph/v3/databases/{database}/tables/{table}/edges/scan/{index}
위치파라미터필수 여부설명
HeaderAuthorization선택인증 키 (향후 사용을 위해 예약됨)
Pathdatabase필수타겟 데이터베이스 이름
Pathtable필수타겟 테이블 이름
Pathindex필수사용할 인덱스 이름
Querystart필수시작 노드 ID
Querydirection필수쿼리 방향 (OUT 또는 IN)
Querylimit선택반환할 최대 결과 수; 프로덕션에서는 25 권장
Queryoffset선택 (기본값: null)페이지네이션 오프셋
Queryranges선택 (기본값: null)스캔 범위
Queryfilters선택 (기본값: null)필터링 조건
Queryfeatures선택 (기본값: 빈 리스트)포함할 기능 목록 (예: total로 전체 값 계산)

EdgeFrame - 엣지 데이터를 포함한 페이로드

파라미터
AuthorizationYOUR_API_KEY
databaseyour_database
tableyour_table
indexyour_index
startsource1
directionOUT
Terminal window
# scan/your_index?start=source1&direction=OUT
curl -X GET \
"http://ab.example.com/graph/v3/databases/your_database/tables/your_table/edges/scan/your_index?start=source1&direction=OUT" \
-H "Authorization: YOUR_API_KEY"
{
"edges": [
{
"version": 1,
"source": "source1",
"target": "target1",
"properties": {
"weight": 0.8,
"type": "FOLLOWS"
},
"context": {}
}
],
"count": 1,
"total": -1,
"offset": null,
"hasNext": false,
"context": {}
}

참고: total이 -1이면 전체 개수가 계산되지 않은 것입니다. features=total을 제공하면 전체 개수가 실제로 계산됩니다.

offset 파라미터는 다음 페이지의 시작 위치를 나타내고, hasNext는 다음 페이지가 있는지를 나타냅니다. 오프셋이 없으면 첫 번째 페이지가 반환됩니다.

오프셋 없이 첫 번째 페이지를 요청합니다.

요청 예시

파라미터설명
AuthorizationYOUR_API_KEY
databaseyour_database
tableyour_table
indexyour_index
startsource1
directionOUT
limit25 권장
Terminal window
# scan/your_index?start=source1&direction=OUT
curl -X GET \
"http://ab.example.com/graph/v3/databases/your_database/tables/your_table/edges/scan/your_index?start=source1&direction=OUT" \
-H "Authorization: YOUR_API_KEY"

응답:

{
"edges": [
{
"version": 1,
"source": "source1",
"target": "target1",
"properties": {
"weight": 0.8,
"type": "FOLLOWS"
},
"context": {}
},
...
],
"count": 10,
"total": -1,
"offset": "string_encoded",
"hasNext": true,
"context": {}
}

이전 응답의 offset 값을 사용하여 다음 페이지를 조회합니다.

요청 예시

파라미터설명
AuthorizationYOUR_API_KEY
databaseyour_database
tableyour_table
indexyour_index
startsource1
directionOUT
offsetstring_encoded이전 응답에서 받은 값
limit25 권장
Terminal window
# scan/your_index?start=source1&direction=OUT&offset=string_encoded
curl -X GET \
"http://ab.example.com/graph/v3/databases/your_database/tables/your_table/edges/scan/your_index?start=source1&direction=OUT&offset=string_encoded" \
-H "Authorization: YOUR_API_KEY"

응답:

{
"edges": [
{
"version": 1,
"source": "source1",
"target": "target1",
"properties": {
"weight": 0.8,
"type": "FOLLOWS"
},
"context": {}
},
...
],
"count": 10,
"total": -1,
"offset": null,
"hasNext": false,
"context": {}
}

ranges 파라미터를 사용하면 count/scan 쿼리에서 데이터 스캔 범위를 지정할 수 있습니다.

중요: 범위는 인덱스에 포함된 필드만 사용할 수 있습니다.

  1. 인덱스 의존성: ranges에 사용되는 필드는 인덱스가 있어야 합니다. 인덱스가 없는 필드에 범위를 지정하면 예상치 못한 결과가 반환됩니다.
  2. 연산자 의미: eq, gt(e), lt(e), between 연산자는 실제 스토리지 스캔의 시작점과 끝점을 결정합니다. 인덱스 속성에 맞게 적절히 사용해야 합니다.
    • 인덱스가 DESC (내림차순)으로 설정된 경우: lt가 시작점, gt가 끝점이 됩니다.
    • 인덱스가 ASC (오름차순)으로 설정된 경우: gt가 시작점, lt가 끝점이 됩니다.
  3. 복합 범위: 범위는 인덱스가 정의된 필드 조합의 순서대로 사용할 수 있습니다. 범위는 인덱스에 정의된 필드 순서대로 적용해야 합니다.

범위는 다음 형식으로 작성합니다:

ranges=range1[;range2;range3;...]

각 범위는 다음 형식을 따릅니다:

field:operator:value

여러 범위를 적용하려면 세미콜론(;)으로 구분합니다:

field1:operator1:value1;field2:operator2:value2

in 또는 bt (between) 연산자를 사용할 때 여러 값은 쉼표(,)로 구분합니다:

field:in:value1,value2,value3
field:bt:minValue,maxValue
연산자설명예시
eq같음type:eq:0
gt초과createdAt:gt:1000000
gte이상createdAt:gte:1000000
lt미만createdAt:lt:2000000
lte이하createdAt:lte:2000000
bt두 값 사이createdAt:bt:1000000,2000000

단순 범위:

GET .../scan/your_index?start=10&direction=OUT&ranges=type:eq:0

이 예시는 type 프로퍼티가 0인 엣지만 조회하는 범위를 지정합니다. typeproperties.type을 의미하며, properties.typeyour_index에 포함되어 있어야 합니다.

복합 범위:

GET .../scan/your_index?start=10&direction=OUT&ranges=type:eq:0;createdAt:gt:1000000

이 예시는 type이 0이고 createdAt이 1000000보다 큰 엣지만 조회하는 범위를 지정합니다.

Between 연산자:

GET .../scan/your_index?start=10&direction=OUT&ranges=createdAt:bt:1000000,2000000

이 예시는 createdAt이 1000000에서 2000000 사이인 엣지만 조회하는 범위를 지정합니다.

filters 파라미터를 사용하면 get/scan 쿼리에서 데이터(엣지)를 필터링할 수 있습니다. 범위와 동일한 형식을 사용합니다.

범위와의 차이점: 범위는 쿼리 범위를 사전에 지정하며 인덱스로 설정된 필드만 사용할 수 있는 반면, filters는 쿼리 결과를 필터링하며 인덱스로 설정되지 않은 필드도 사용할 수 있습니다.

GET .../get?source=1,2,3&target=10&filters=type:eq:0
GET .../scan/your_index?start=1&direction=OUT&ranges=createdAt:gte:1000000&filters=type:eq:0
  • OUT: 나가는 방향 (예: 사용자 [좋아요]→ 상품 관계에서 사용자가 좋아한 상품 조회)
  • IN: 들어오는 방향 (예: 위 관계에서 상품을 좋아한 사용자 조회)

카운트 쿼리 응답. 엣지 카운트 정보를 포함한 페이로드.

data class Count(
val start: Any, // 시작 노드 ID
val direction: Direction, // 방향 (IN, OUT)
val count: Long, // 엣지 카운트
val context: Map<String, Any?>, // 컨텍스트 정보
)

Get 및 scan 쿼리 응답. 엣지 데이터를 포함한 페이로드.

data class EdgeFrame(
val edges: List<Edge>, // 엣지 목록
val count: Int, // 현재 반환된 엣지 수
val total: Long, // 전체 엣지 카운트 (-1은 계산되지 않음을 의미)
val offset: String?, // 페이지네이션 오프셋
val hasNext: Boolean, // 다음 페이지 존재 여부
val context: Map<String, Any?>, // 컨텍스트 정보
)

개별 엣지 정보 페이로드.

data class Edge(
val version: Long, // 엣지 버전
val source: Any, // 소스 노드 ID
val target: Any, // 타겟 노드 ID
val properties: Map<String, Any?>, // 엣지 프로퍼티
val context: Map<String, Any?>, // 컨텍스트 정보
)