기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
Amazon Neptune Gremlin은 지정된 쿼리가 실행된 경우 실행될 쿼리 계획을 explain
API 반환합니다. API는 실제로 쿼리를 실행하지 않으므로 계획은 거의 즉시 반환됩니다.
Neptune 엔진과 관련된 정보를 보고할 수 있도록 TinkerPop .explain() 단계와 다릅니다.
Gremlin explain
보고서에 포함된 정보
explain
보고서에는 다음 정보가 포함됩니다.
요청에 따른 쿼리 문자열.
원래 순회. 쿼리 문자열을 TinkerPop 단계별로 구문 분석하여 생성된 TinkerPop 순회 객체입니다. 이는에 대한 쿼리
.explain()
에서를 실행하여 생성된 원래 쿼리와 TinkerPop 동일합니다 TinkerGraph.변환된 순회. Traversal을 Neptune 논리적 쿼리 계획 표현으로 변환하여 생성된 Neptune TinkerPop Traversal입니다. 대부분의 경우 전체 TinkerPop 순회는 두 가지 Neptune 단계로 변환됩니다. 하나는 전체 쿼리(
NeptuneGraphQueryStep
)를 실행하는 단계이고, 다른 하나는 Neptune 쿼리 엔진 출력을 다시 TinkerPop Traversers()로 변환하는 단계입니다NeptuneTraverserConverterStep
.최적화된 순회. 일련의 정적 작업 감소 옵티마이저를 통해 실행된 이후에 최적화된 버전의 Neptune 쿼리 계획입니다. 이 옵티마이저는 정적 분석 및 예상 카디널리티를 토대로 쿼리를 재작성합니다. 이러한 옵티마이저는 범위 수에 따라 재정렬 연산자와 비슷한 기능을 수행하고, 불필요하거나 중복된 연산자를 제거하고, 필터를 재배열하고, 연산자를 서로 다른 그룹에 배치합니다.
조건자 수. 앞서 설명한 Neptune 인덱싱 전략으로 인해 서로 다른 조건자를 다수 가지고 있으면 성능 문제가 발생할 수 있습니다. 엣지 레이블(
.in
또는.both
)과 함께 역 순회 연산자를 사용하는 쿼리의 경우에는 특히 그렇습니다. 이러한 연산자를 사용하고 조건자 수가 충분히 많은 경우에는explain
보고서에 경고 메시지가 표시됩니다.-
DFE 정보. DFE 대체 엔진이 활성화되면 다음과 같은 순회 구성 요소가 최적화된 순회에 표시될 수 있습니다.
-
DFEStep
– 하위가 포함된 순회에서 Neptune 최적화 DFE 단계DFENode
입니다.는 DFE 엔진에서 실행되는 쿼리 계획의 일부를DFEStep
나타냅니다. -
DFENode
– 하나 이상의 하위DFEJoinGroupNodes
로 표현된 중간 표현을 포함합니다. -
DFEJoinGroupNode
– 하나 이상의DFENode
또는DFEJoinGroupNode
요소의 조인을 나타냅니다. -
NeptuneInterleavingStep
– 하위가 포함된 순회에서 Neptune에 최적화된 DFE 단계입니다DFEStep
.프론티어 요소, 사용된 경로 요소 등과 같은 순회 관련 정보가 들어 있는
stepInfo
요소도 포함되어 있습니다. 이 정보는 하위DFEStep
을 처리하는 데 사용됩니다.
에서 쿼리를 평가하고 있는지 확인하는 쉬운 방법은
explain
출력에가 포함되어 있는지 확인하는 DFE 것입니다DFEStep
. 의 일부가 아닌 순회 부분은에서 실행DFEStep
되지 않으며 TinkerPop 엔진에서 실행DFE됩니다.샘플 보고서는 DFE 활성화된의 예 섹션을 참조하세요.
-
Gremlin explain
구문
의 구문explain
API은 다음 예제와 /gremlin
같이가 대신 엔드포인트/gremlin/explain
로를 사용한다는 점을 제외하면 쿼리HTTPAPI에 대한 구문과 동일합니다.
curl -X POST https://
your-neptune-endpoint
:port
/gremlin/explain -d '{"gremlin":"g.V().limit(1)"}'
앞의 쿼리에서는 다음 출력이 생성됩니다.
******************************************************* Neptune Gremlin Explain ******************************************************* Query String ============ g.V().limit(1) Original Traversal ================== [GraphStep(vertex,[]), RangeGlobalStep(0,1)] Converted Traversal =================== Neptune steps: [ NeptuneGraphQueryStep(Vertex) { JoinGroupNode { PatternNode[(?1, <~label>, ?2, <~>) . project distinct ?1 .] }, finishers=[limit(1)], annotations={path=[Vertex(?1):GraphStep], maxVarId=3} }, NeptuneTraverserConverterStep ] Optimized Traversal =================== Neptune steps: [ NeptuneGraphQueryStep(Vertex) { JoinGroupNode { PatternNode[(?1, <~label>, ?2, <~>) . project distinct ?1 .], {estimatedCardinality=INFINITY} }, finishers=[limit(1)], annotations={path=[Vertex(?1):GraphStep], maxVarId=3} }, NeptuneTraverserConverterStep ] Predicates ========== # of predicates: 18
변환되지 않은 TinkerPop 단계
이상적으로는 순회의 모든 TinkerPop 단계에 네이티브 Neptune 연산자 적용 범위가 있습니다. 그렇지 않은 경우 Neptune은 연산자 적용 범위의 격차에 대한 TinkerPop 단계 실행을 다시 실행합니다. 순회에서 Neptune이 아직 네이티브 범위를 가지고 있지 않은 단계를 사용하는 경우에는 explain
보고서에 격차가 발생했음을 알리는 경고가 표시됩니다.
해당 네이티브 Neptune 연산자가 없는 단계가 발생하면 후속 단계에 네이티브 Neptune 연산자가 있더라도 해당 시점 앞으로의 전체 순회가 TinkerPop 단계를 사용하여 실행됩니다.
단, Neptune 전체 텍스트 검색이 호출되는 경우는 예외입니다. 는 기본 등가 항목이 없는 단계를 전체 텍스트 검색 단계로 NeptuneSearchStep 구현합니다.
쿼리의 모든 단계에 네이티브에 상당하는 항목이 있는 explain
출력 예제
다음은 모든 단계에 네이티브에 상당하는 항목이 있는 쿼리에 대한 explain
보고서 예제입니다.
******************************************************* Neptune Gremlin Explain ******************************************************* Query String ============ g.V().out() Original Traversal ================== [GraphStep(vertex,[]), VertexStep(OUT,vertex)] Converted Traversal =================== Neptune steps: [ NeptuneGraphQueryStep(Vertex) { JoinGroupNode { PatternNode[(?1, <~label>, ?2, <~>) . project distinct ?1 .] PatternNode[(?1, ?5, ?3, ?6) . project ?1,?3 . IsEdgeIdFilter(?6) .] PatternNode[(?3, <~label>, ?4, <~>) . project ask .] }, annotations={path=[Vertex(?1):GraphStep, Vertex(?3):VertexStep], maxVarId=7} }, NeptuneTraverserConverterStep ] Optimized Traversal =================== Neptune steps: [ NeptuneGraphQueryStep(Vertex) { JoinGroupNode { PatternNode[(?1, ?5, ?3, ?6) . project ?1,?3 . IsEdgeIdFilter(?6) .], {estimatedCardinality=INFINITY} }, annotations={path=[Vertex(?1):GraphStep, Vertex(?3):VertexStep], maxVarId=7} }, NeptuneTraverserConverterStep ] Predicates ========== # of predicates: 18
쿼리의 일부 단계에 네이티브에 상당하는 항목이 없는 예
Neptune은 GraphStep
및 VertexStep
을 기본적으로 처리하지만, 사용자가 FoldStep
및 UnfoldStep
를 도입하면 explain
출력이 달라집니다.
******************************************************* Neptune Gremlin Explain ******************************************************* Query String ============ g.V().fold().unfold().out() Original Traversal ================== [GraphStep(vertex,[]), FoldStep, UnfoldStep, VertexStep(OUT,vertex)] Converted Traversal =================== Neptune steps: [ NeptuneGraphQueryStep(Vertex) { JoinGroupNode { PatternNode[(?1, <~label>, ?2, <~>) . project distinct ?1 .] }, annotations={path=[Vertex(?1):GraphStep], maxVarId=3} }, NeptuneTraverserConverterStep ] + not converted into Neptune steps: [FoldStep, UnfoldStep, VertexStep(OUT,vertex)] Optimized Traversal =================== Neptune steps: [ NeptuneGraphQueryStep(Vertex) { JoinGroupNode { PatternNode[(?1, <~label>, ?2, <~>) . project distinct ?1 .], {estimatedCardinality=INFINITY} }, annotations={path=[Vertex(?1):GraphStep], maxVarId=3} }, NeptuneTraverserConverterStep, NeptuneMemoryTrackerStep ] + not converted into Neptune steps: [FoldStep, UnfoldStep, VertexStep(OUT,vertex)] WARNING: >> FoldStep << is not supported natively yet
이 경우, FoldStep
은 네이티브 실행을 중단합니다. 그러나 후속 VertexStep
조차도 더 이상 기본적으로 처리되지 않는데, 이는 Fold/Unfold
단계의 다운스트림에 나타나기 때문입니다.
성능 및 비용 절감을 위해서는 TinkerPop 단계 구현이 아닌 Neptune 쿼리 엔진 내에서 가능한 최대 작업이 기본적으로 수행되도록 순회를 공식화하는 것이 중요합니다.
Neptune을 사용하는 쿼리의 예 full-text-search
다음 쿼리는 Neptune 전체 텍스트 검색을 사용합니다.
g.withSideEffect("
Neptune#fts.endpoint
", "some_endpoint
") .V() .tail(100) .has("Neptune#fts mark*") ------- .has("name", "Neptune#fts mark*") .has("Person", "name", "Neptune#fts mark*")
이 .has("name", "Neptune#fts mark*")
부분은 name
이 있는 버텍스로 검색을 제한하고, .has("Person", "name", "Neptune#fts mark*")
은 name
및 레이블 Person
이 있는 버텍스로 검색을 제한합니다. 이로 인해 explain
보고서에 다음과 같은 순회가 발생합니다.
Final Traversal [NeptuneGraphQueryStep(Vertex) { JoinGroupNode { PatternNode[(?1, termid(1,URI), ?2, termid(0,URI)) . project distinct ?1 .], {estimatedCardinality=INFINITY} }, annotations={path=[Vertex(?1):GraphStep], maxVarId=4} }, NeptuneTraverserConverterStep, NeptuneTailGlobalStep(10), NeptuneTinkerpopTraverserConverterStep, NeptuneSearchStep { JoinGroupNode { SearchNode[(idVar=?3, query=mark*, field=name) . project ask .], {endpoint=some_endpoint} } JoinGroupNode { SearchNode[(idVar=?3, query=mark*, field=name) . project ask .], {endpoint=some_endpoint} } }]
DFE이 활성화된 explain
경우를 사용하는 예
다음은 DFE 대체 쿼리 엔진이 활성화된 경우의 explain
보고서 예제입니다.
******************************************************* Neptune Gremlin Explain ******************************************************* Query String ============ g.V().as("a").out().has("name", "josh").out().in().where(eq("a")) Original Traversal ================== [GraphStep(vertex,[])@[a], VertexStep(OUT,vertex), HasStep([name.eq(josh)]), VertexStep(OUT,vertex), VertexStep(IN,vertex), WherePredicateStep(eq(a))] Converted Traversal =================== Neptune steps: [ DFEStep(Vertex) { DFENode { DFEJoinGroupNode[ children={ DFEPatternNode[(?1, <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>, ?2, <http://aws.amazon.com/neptune/vocab/v01/DefaultNamedGraph>) . project DISTINCT[?1] {rangeCountEstimate=unknown}], DFEPatternNode[(?1, ?3, ?4, ?5) . project ALL[?1, ?4] graphFilters=(!= <http://aws.amazon.com/neptune/vocab/v01/DefaultNamedGraph> . ), {rangeCountEstimate=unknown}] }, {rangeCountEstimate=unknown} ] } [Vertex(?1):GraphStep@[a], Vertex(?4):VertexStep] } , NeptuneTraverserConverterDFEStep ] + not converted into Neptune steps: HasStep([name.eq(josh)]), Neptune steps: [ NeptuneInterleavingStep { StepInfo[joinVars=[?7, ?1], frontierElement=Vertex(?7):HasStep, pathElements={a=(last,Vertex(?1):GraphStep@[a])}, listPathElement={}, indexTime=0ms], DFEStep(Vertex) { DFENode { DFEJoinGroupNode[ children={ DFEPatternNode[(?7, ?8, ?9, ?10) . project ALL[?7, ?9] graphFilters=(!= <http://aws.amazon.com/neptune/vocab/v01/DefaultNamedGraph> . ), {rangeCountEstimate=unknown}], DFEPatternNode[(?12, ?11, ?9, ?13) . project ALL[?9, ?12] graphFilters=(!= <http://aws.amazon.com/neptune/vocab/v01/DefaultNamedGraph> . ), {rangeCountEstimate=unknown}] }, {rangeCountEstimate=unknown} ] } [Vertex(?9):VertexStep, Vertex(?12):VertexStep] } } ] + not converted into Neptune steps: WherePredicateStep(eq(a)), Neptune steps: [ DFECleanupStep ] Optimized Traversal =================== Neptune steps: [ DFEStep(Vertex) { DFENode { DFEJoinGroupNode[ children={ DFEPatternNode[(?1, ?3, ?4, ?5) . project ALL[?1, ?4] graphFilters=(!= defaultGraph[526] . ), {rangeCountEstimate=9223372036854775807}] }, {rangeCountEstimate=unknown} ] } [Vertex(?1):GraphStep@[a], Vertex(?4):VertexStep] } , NeptuneTraverserConverterDFEStep ] + not converted into Neptune steps: NeptuneHasStep([name.eq(josh)]), Neptune steps: [ NeptuneMemoryTrackerStep, NeptuneInterleavingStep { StepInfo[joinVars=[?7, ?1], frontierElement=Vertex(?7):HasStep, pathElements={a=(last,Vertex(?1):GraphStep@[a])}, listPathElement={}, indexTime=0ms], DFEStep(Vertex) { DFENode { DFEJoinGroupNode[ children={ DFEPatternNode[(?7, ?8, ?9, ?10) . project ALL[?7, ?9] graphFilters=(!= defaultGraph[526] . ), {rangeCountEstimate=9223372036854775807}], DFEPatternNode[(?12, ?11, ?9, ?13) . project ALL[?9, ?12] graphFilters=(!= defaultGraph[526] . ), {rangeCountEstimate=9223372036854775807}] }, {rangeCountEstimate=unknown} ] } [Vertex(?9):VertexStep, Vertex(?12):VertexStep] } } ] + not converted into Neptune steps: WherePredicateStep(eq(a)), Neptune steps: [ DFECleanupStep ] WARNING: >> [NeptuneHasStep([name.eq(josh)]), WherePredicateStep(eq(a))] << (or one of the children for each step) is not supported natively yet Predicates ========== # of predicates: 8
보고서의 DFE특정 섹션에 explain의 정보 대한 설명은 섹션을 참조하세요.