Gremlin repeatMode 쿼리 힌트 - Amazon Neptune

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Gremlin repeatMode 쿼리 힌트

Neptune repeatMode 쿼리 힌트는 Neptune 엔진이 Gremlin 순회에서 폭 우선, 깊이 우선 또는 청크 깊이 우선으로 repeat() 단계를 평가하는 방법을 지정합니다.

repeat() 단계의 평가 모드는 단계를 제한된 횟수만큼 반복하는 대신 경로를 검색하거나 따르는 데 사용되는 경우 중요합니다.

구문

repeatMode 쿼리 힌트는 쿼리에 withSideEffect 단계를 추가하여 지정합니다.

g.withSideEffect('Neptune#repeatMode', 'mode').gremlin-traversal
참고

모든 Gremlin 쿼리 힌트 부작용에는 Neptune#이라는 접두사가 붙습니다.

사용 가능한 모드
  • BFS

    폭 우선 검색

    repeat() 단계의 기본 실행 모드입니다. 이 모드에서는 경로를 따라 더 깊이 들어가기 전에 모든 형제 노드를 가져옵니다.

    이 버전은 메모리 집약적이며 한계가 매우 커질 수 있습니다. 쿼리가 메모리가 부족한 상태에서 실행하여 Neptune 엔진에 의해 취소될 위험이 더 높습니다. 이는 다른 Gremlin 구현과 가장 일치합니다.

  • DFS

    깊이 우선 검색

    다음 솔루션으로 이동하기 전에 각 경로를 최대 깊이까지 따릅니다.

    이 경우에는 메모리를 적게 사용합니다. 출발점에서부터 다중 홉(hop)까지 단일 경로를 찾는 것과 같은 상황에서 더 나은 성능을 제공할 수 있습니다.

  • CHUNKED_DFS

    청크 깊이 우선 검색

    1 노드(DFS) 또는 모든 노드(BFS))가 아닌 1,000개의 노드로 구성된 청크에서 그래프 깊이를 우선 탐구하는 하이브리드 접근 방식입니다.

    Neptune 엔진은 경로를 더 깊이 따라가기 전에 각 수준에서 노드를 최대 1,000개 확보합니다.

    이는 속도와 메모리 사용량 간에 균형 잡힌 접근 방식입니다.

    BFS을 사용하려고 하지만 쿼리가 너무 많은 메모리를 사용하는 경우에도 유용합니다.

다음 단원에서는 Gremlin 순회에 반복 모드가 미치는 영향에 대해 설명합니다.

Neptune에서 repeat() 단계의 기본 모드는 모든 순회에 대해 폭 우선(BFS) 실행 전략을 수행하는 것입니다.

대부분의 경우 TinkerGraph 구현은 동일한 실행 전략을 사용하지만 경우에 따라 트래버설의 실행을 변경합니다.

예를 들어 구현은 다음 쿼리를 TinkerGraph 수정합니다.

g.V("3").repeat(out()).times(10).limit(1).path()

이 순회의 repeat() 단계는 다음 순회로 '언롤'되어 깊이 우선(DFS) 전략이 됩니다.

g.V(<id>).out().out().out().out().out().out().out().out().out().out().limit(1).path()
중요

Neptune 쿼리 엔진은 이 작업을 자동으로 수행하지 않습니다.

너비 우선(BFS)은 기본 실행 전략이며 대부분의 경우 와 유사 TinkerGraph 합니다. 그러나 깊이 우선(DFS) 전략이 더 나은 경우가 있습니다.

BFS (기본값)

폭 우선(BFS)은 repeat() 연산자의 기본 실행 전략입니다.

g.V("3").repeat(out()).times(10).limit(1).path()

Neptune 엔진은 10개 홉의 솔루션을 찾기 전에 처음 9개 홉 경계를 완전히 탐색합니다. 이 방법은 최단 경로 쿼리 등 많은 경우에 효과적입니다.

그러나 앞에 나온 예제의 경우 repeat() 연산자에 대해 깊이 우선(DFS) 모드를 사용하면 순회가 훨씬 빨라집니다.

DFS

다음 쿼리는 repeat() 연산자에 깊이 우선(DFS) 모드를 사용합니다.

g.withSideEffect("Neptune#repeatMode", "DFS").V("3").repeat(out()).times(10).limit(1)

이렇게 하면 다음 솔루션을 탐색하기 전에 각 솔루션을 최대 깊이까지 따릅니다.