Azure Cosmos DB for Gremlin 그래프 지원 및 TinkerPop 기능과의 호환성

적용 대상: Gremlin

Azure Cosmos DB는 Apache Tinkerpop의 그래프 순회 언어인 Gremlin을 지원합니다. Gremlin 언어를 사용하여 그래프 엔터티(예: 꼭짓점 및 에지)를 만들고, 해당 엔터티 내에서 속성을 수정하고, 쿼리 및 순회를 수행하고, 엔터티를 삭제할 수 있습니다.

Azure Cosmos DB Graph 엔진은 Apache TinkerPop 순회 단계 사양을 철저하게 따르지만, Azure Cosmos DB에만 해당하는 구현의 차이점이 있습니다. 이 문서에서는 Gremlin을 간략히 연습해 볼 수 있는 과정을 제공하고 Gremlin용 API가 지원하는 Gremlin 기능을 나열합니다.

호환 가능한 클라이언트 라이브러리

다음 표에서는 Azure Cosmos DB에 대해 사용할 수 있는 인기 있는 Gremlin 드라이버를 보여 줍니다.

다운로드 원본 시작 지원/권장 커넥터 버전
.NET GitHub의 Gremlin.NET .NET을 사용하여 그래프 만들기 3.4.13
Java Gremlin JavaDoc Java를 사용하여 그래프 만들기 3.4.13
Python Github의 Gremlin Python Python을 사용하여 그래프 만들기 3.4.13
Gremlin 콘솔 TinkerPop 문서 Gremlin 콘솔을 사용하여 그래프 만들기 3.4.13
Node.JS Github의 Gremlin-JavaScript Node.js를 사용하여 그래프 만들기 3.4.13
PHP GitHub의 Gremlin-PHP PHP를 사용하여 그래프 만들기 3.1.0
Go Lang Go Lang 이 라이브러리는 외부 기여자가 빌드했습니다. Azure Cosmos DB 팀은 라이브러리를 지원하거나 유지 관리하지 않습니다.

참고 항목

3.5.*, 3.6.*용 Gremlin 클라이언트 드라이버 버전에는 알려진 호환성 문제가 있으므로 위에 나열된 지원되는 최신 3.4.* 드라이버 버전을 사용하는 것이 좋습니다. 이 테이블은 이러한 최신 드라이버 버전에 대한 호환성 문제가 해결되면 업데이트됩니다.

지원되는 그래프 개체

TinkerPop은 광범위한 그래프 기술을 지원하는 표준입니다. 따라서 그래프 공급자가 제공하는 기능을 설명하기 위한 표준 용어를 포함합니다. Azure Cosmos DB는 여러 서버 또는 클러스터에서 분할될 수 있는 지속적이고 높은 동시성을 갖는 쓰기 가능한 그래프 데이터베이스를 제공합니다.

다음 표에는 Azure Cosmos DB를 통해 구현되는 TinkerPop 기능이 나와 있습니다.

범주 Azure Cosmos DB 구현 주의
그래프 기능 Persistence 및 ConcurrentAccess를 제공합니다. 트랜잭션을 지원하도록 설계되었습니다. 컴퓨터 메서드를 Spark 커넥터를 통해 구현할 수 있습니다.
변수 기능 부울, 정수, 바이트, Double, Float, Long, 문자열을 지원합니다. 기본 형식을 지원하고, 데이터 모델을 통해 복잡한 형식과 호환됩니다.
꼭짓점 기능 RemoveVertices, MetaProperties, AddVertices, MultiProperties, StringIds, UserSuppliedIds, AddProperty, RemoveProperty를 지원합니다. 꼭짓점 만들기, 수정 및 삭제를 지원합니다.
꼭짓점 속성 기능 StringIds, UserSuppliedIds, AddProperty, RemoveProperty, BooleanValues, ByteValues, DoubleValues, FloatValues, IntegerValues, LongValues, StringValues 꼭짓점 속성 만들기, 수정 및 삭제를 지원합니다.
에지 기능 AddEdges, RemoveEdges, StringIds, UserSuppliedIds, AddProperty, RemoveProperty 에지 만들기, 수정 및 삭제를 지원합니다.
에지 속성 기능 Properties, BooleanValues, ByteValues, DoubleValues, FloatValues, IntegerValues, LongValues, StringValues 에지 속성 만들기, 수정 및 삭제를 지원합니다.

Gremlin 통신 형식

Azure Cosmos DB는 Gremlin 작업의 결과를 반환할 때 JSON 형식을 사용합니다. Azure Cosmos DB는 현재 JSON 형식을 지원합니다. 예를 들어 다음 코드 조각은 Azure Cosmos DB에서 클라이언트로 반환되는 꼭짓점의 JSON 표현을 보여 줍니다.

  {
    "id": "a7111ba7-0ea1-43c9-b6b2-efc5e3aea4c0",
    "label": "person",
    "type": "vertex",
    "outE": {
      "knows": [
        {
          "id": "3ee53a60-c561-4c5e-9a9f-9c7924bc9aef",
          "inV": "04779300-1c8e-489d-9493-50fd1325a658"
        },
        {
          "id": "21984248-ee9e-43a8-a7f6-30642bc14609",
          "inV": "a8e3e741-2ef7-4c01-b7c8-199f8e43e3bc"
        }
      ]
    },
    "properties": {
      "firstName": [
        {
          "value": "Thomas"
        }
      ],
      "lastName": [
        {
          "value": "Andersen"
        }
      ],
      "age": [
        {
          "value": 45
        }
      ]
    }
  }

JSON 형식에서 꼭짓점에 사용되는 속성은 다음과 같습니다.

속성 설명
id 꼭짓점의 ID입니다. 고유해야 합니다(해당되는 경우 _partition 값과 조합). 값이 제공되지 않으면 GUID가 자동으로 제공됩니다.
label 꼭짓점의 레이블입니다. 이 속성은 엔터티 형식을 설명하는 데 사용됩니다.
type 비그래프 문서의 꼭짓점을 구별하는 데 사용됩니다.
properties 꼭짓점과 연결된 사용자 정의 속성의 모음입니다. 각 속성에는 값이 여러 개 있을 수 있습니다.
_partition 꼭짓점의 파티션 키입니다. 그래프 분할에 사용됩니다.
outE 이 속성에는 꼭짓점의 바깥 에지 목록이 포함됩니다. 꼭짓점과 함께 인접 정보를 저장하므로 순회를 빠르게 실행할 수 있습니다. 에지는 해당 레이블을 기준으로 그룹화됩니다.

각 속성은 배열 내에 여러 값을 저장할 수 있습니다.

속성 설명
value 속성의 값입니다.

또한 에지에는 그래프의 다른 부분으로 탐색하는 데 도움이 되는 다음 정보가 포함됩니다.

속성 설명
id 에지의 ID입니다. 고유해야 합니다(해당되는 경우 _partition 값과 조합).
label 에지의 레이블입니다. 이 속성은 선택 사항이며, 관계 유형을 설명하는 데 사용됩니다.
inV 이 속성에는 에지의 모든 꼭지점 목록이 포함됩니다. 에지와 함께 인접 정보를 저장하므로 순회를 빠르게 실행할 수 있습니다. 꼭짓점은 해당 레이블을 기준으로 그룹화됩니다.
properties 에지와 연결된 사용자 정의 속성의 모음입니다.

Gremlin 단계

이제 Azure Cosmos DB에서 지원되는 Gremlin 단계를 살펴보겠습니다. Gremlin에 대한 전체 참조는 TinkerPop 참조를 참조하세요.

step 설명 TinkerPop 3.2 설명서
addE 두 꼭짓점 사이에 에지를 추가합니다. addE 단계
addV 그래프에 꼭짓점을 추가합니다. addV 단계
and 모든 순회가 값을 반환하는지 확인합니다. and 단계
as 단계의 출력에 변수를 할당하는 단계 변조기 as 단계
by grouporder에서 사용되는 단계 변조기 by 단계
coalesce 결과를 반환하는 첫 번째 순회를 반환합니다. coalesce 단계
constant 상수 값을 반환합니다. coalesce에 사용됩니다. constant 단계
count 순회에서 해당 개수를 반환합니다. count 단계
dedup 중복 항목을 제거하고 값을 반환합니다. dedup 단계
drop 값(꼭짓점/에지)을 삭제합니다. drop 단계
executionProfile 실 된 Gremlin 단계에서 생성된 모든 작업에 대한 설명을 작성합니다. executionProfile 단계
fold 결과의 집계를 계산하는 장벽으로 작동합니다. fold 단계
group 지정된 레이블을 기준으로 값을 그룹화합니다. group 단계
has 속성, 꼭짓점, 에지를 필터링하는 데 사용됩니다. hasLabel, hasId, hasNothas 변형을 지원합니다. has 단계
inject 스트림에 값을 삽입합니다. inject 단계
is 부울 식을 사용하여 필터를 수행하는 데 사용됩니다. is 단계
limit 순회의 항목 수를 제한하는 데 사용됩니다. limit 단계
local local은 하위 쿼리와 비슷하게 순회 섹션을 래핑합니다. local 단계
not 필터의 부정을 생성하는 데 사용됩니다. not 단계
optional 결과를 생성하는 경우 지정된 순회의 결과를 반환하고, 그렇지 않으면 호출하는 요소를 반환합니다. optional 단계
or 순회 중 하나 이상이 값을 반환하도록 합니다. or 단계
order 결과를 지정된 정렬 순서로 반환합니다. order 단계
path 순회의 전체 경로를 반환합니다. path 단계
project 속성을 맵으로 투영합니다. project 단계
properties 지정된 레이블에 대한 속성을 반환합니다. properties 단계
range 지정된 값 범위로 필터링합니다. range 단계
repeat 지정된 횟수 동안 단계를 반복합니다. 반복에 사용됩니다. repeat 단계
sample 순회의 결과를 샘플링하는 데 사용됩니다. sample 단계
select 순회의 결과를 투영하는 데 사용됩니다. select 단계
store 순회의 비차단 집계에 사용됩니다. store 단계
TextP.startingWith(string) 문자열 필터링 함수. 이 함수는 has() 단계에서 특정 문자열의 시작 부분이 포함된 속성을 검색하는 조건자로 사용됩니다. TextP 조건자
TextP.endingWith(string) 문자열 필터링 함수. 이 함수는 has() 단계에서 특정 문자열의 끝 부분이 포함된 속성을 검색하는 조건자로 사용됩니다. TextP 조건자
TextP.containing(string) 문자열 필터링 함수. 이 함수는 has() 단계에서 특정 문자열의 내용이 포함된 속성을 검색하는 조건자로 사용됩니다. TextP 조건자
TextP.notStartingWith(string) 문자열 필터링 함수. 이 함수는 has() 단계에서 특정 문자열로 시작하지 않는 속성을 검색하는 조건자로 사용됩니다. TextP 조건자
TextP.notEndingWith(string) 문자열 필터링 함수. 이 함수는 has() 단계에서 특정 문자열로 끝나지 않는 속성을 검색하는 조건자로 사용됩니다. TextP 조건자
TextP.notContaining(string) 문자열 필터링 함수. 이 함수는 has() 단계에서 특정 문자열이 포함되지 않은 속성을 검색하는 조건자로 사용됩니다. TextP 조건자
tree 꼭짓점에서의 경로를 트리로 집계합니다. tree 단계
unfold 반복기를 단계로 언롤합니다. unfold 단계
union 여러 순회의 결과를 병합합니다. union 단계
V 꼭짓점 및 에지 V, E, out, in, both, outE, inE, bothE, outV, inV, bothV, otherV 간 순회에 필요한 단계가 포함되어 있습니다. vertex 단계
where 순회의 결과를 필터링하는 데 사용. eq, neq, lt, lte, gt, gtebetween 연산자 지원 where 단계

Azure Cosmos DB에서 제공하는 쓰기 최적화 엔진은 기본적으로 꼭짓점 및 에지 내의 모든 속성에 대한 자동 인덱싱을 지원합니다. 따라서 필터가 있는 쿼리, 범위 쿼리, 속성에 대한 정렬 또는 집계가 인덱스에서 처리되고 효율적으로 제공됩니다. Azure Cosmos DB에서 인덱싱이 작동하는 방식에 대한 자세한 내용은 스키마 독립적 인덱싱을 참조하세요.

동작 차이점

  • TinkerPop Gremlin은 깊이 우선이지만, Azure Cosmos DB Graph 엔진은 폭 우선 순회를 실행합니다. 이 동작은 Azure Cosmos DB 같이 수평 확장이 가능한 시스템의 성능을 향상합니다.

지원되지 않는 기능

  • Gremlin 바이트 코드는 프로그래밍 언어의 제약을 받지 않는 그래프 조회에 대한 사양입니다. Azure Cosmos DB Graph는 아직 이 사양을 지원하지 않습니다. GremlinClient.SubmitAsync()를 사용하여 순회를 텍스트 문자열로 전달하세요.

  • property(set, 'xyz', 1) 세트 카디널리티는 현재 지원되지 않습니다. 대신 property(list, 'xyz', 1)을 사용합니다. 자세한 내용은 TinkerPop을 사용하는 꼭짓점 속성을 참조하세요.

  • match() 단계는 현재 사용할 수 없습니다. 이 단계는 선언적 쿼리 기능을 제공합니다.

  • 꼭짓점 또는 에지에 대한 속성인 개체는 지원되지 않습니다. 속성은 기본 형식 또는 배열이어야 합니다.

  • 배열 속성 정렬order().by(<array property>)을 지원되지 않습니다. 정렬은 기본 형식만 지원됩니다.

  • 기본이 아닌 JSON 형식은 지원되지 않습니다. string, number 또는 true/false 형식을 사용하세요. null 값은 지원되지 않습니다.

  • GraphSONv3 직렬 변환기는 현재 지원되지 않습니다. 연결 구성에 GraphSONv2 Serializer, Reader 및 Writer 클래스를 사용하세요. Azure Cosmos DB for Gremlin에서 반환된 결과의 형식은 GraphSON 형식과 다릅니다.

  • 람다 식 및 함수는 현재 지원되지 않습니다. 여기에는 .map{<expression>}, .by{<expression>}.filter{<expression>} 함수가 포함됩니다. 자세한 내용을 알아보고 Gremlin 단계를 사용하여 다시 작성하는 방법에 대해 알아보려면 람다에 대한 참고 사항을 참조하세요.

  • 트랜잭션은 시스템의 분산 특성으로 인해 지원되지 않습니다. "사용자 고유의 쓰기를 읽기"로 Gremlin 계정에서 적절한 일관성 모델을 구성하고, 낙관적 동시성을 사용하여 충돌하는 쓰기를 해결하세요.

알려진 제한 사항

  • 중간 순회 .V() 단계를 사용하는 Gremlin 쿼리의 인덱스 사용률: 현재는 순회의 첫 번째 .V() 호출만 인덱스를 사용하여 연결된 필터 또는 조건자를 확인합니다. 후속 호출에서는 인덱스를 참조하지 않으므로 쿼리의 대기 시간과 비용이 늘어날 수 있습니다.

기본 인덱싱을 사용하는 경우 .V() 단계로 시작하는 일반적인 읽기 Gremlin 쿼리는 연결된 필터링 단계에서 .has() 또는 .where() 같은 매개 변수를 사용하여 쿼리의 비용과 성능을 최적화합니다. 예시:

g.V().has('category', 'A')

그러나 Gremlin 쿼리에 .V() 단계가 여러 개 포함된 경우에는 쿼리에서 확인한 데이터가 최적의 데이터가 아닐 수 있습니다. 다음 쿼리를 예로 들 수 있습니다.

g.V().has('category', 'A').as('a').V().has('category', 'B').as('b').select('a', 'b')

이 쿼리는 category라는 속성을 기반으로 꼭짓점 그룹 2개를 반환합니다. 여기서 첫 번째 호출 g.V().has('category', 'A')는 인덱스를 사용하여 해당 속성 값을 기반으로 꼭짓점을 확인합니다.

이 쿼리에 대한 해결 방법은 .map()union() 같은 하위 순회 단계를 사용하는 것입니다. 아래는 그 예제입니다.

// Query workaround using .map()
g.V().has('category', 'A').as('a').map(__.V().has('category', 'B')).as('b').select('a','b')

// Query workaround using .union()
g.V().has('category', 'A').fold().union(unfold(), __.V().has('category', 'B'))

Gremlin executionProfile() 단계를 사용하여 쿼리의 성능을 검토할 수 있습니다.

다음 단계