******************************************************* Neptune Gremlin Explain ******************************************************* Query String ============ g.V().union( __.hasLabel('VertexType1').limit(1), __.hasLabel('VertexType2').limit(1), __.hasLabel('VertexType3').limit(1), __.hasLabel('VertexType4').limit(1), __.hasLabel('VertexType5').limit(1), __.hasLabel('VertexType6').limit(1), __.hasLabel('VertexType7').limit(1), __.hasLabel('VertexType8').limit(1) ) .fold() .project('VertexType1', 'VertexType2', 'VertexType3', 'VertexType4', 'VertexType5', 'VertexType6', 'VertexType7', 'VertexType8') .by(unfold().hasLabel('VertexType1')) .by(unfold().hasLabel('VertexType2')) .by(unfold().hasLabel('VertexType3')) .by(unfold().hasLabel('VertexType4')) .by(unfold().hasLabel('VertexType5')) .by(unfold().hasLabel('VertexType6')) .by(unfold().hasLabel('VertexType7')) .by(unfold().hasLabel('VertexType8')) Original Traversal ================== [GraphStep(vertex,[]), UnionStep([[HasStep([~label.eq(VertexType1)]), RangeGlobalStep(0,1), EndStep], [HasStep([~label.eq(VertexType2)]), RangeGlobalStep(0,1), EndStep], [HasStep([~label.eq(VertexType3)]), RangeGlobalStep(0,1), EndStep], [HasStep([~label.eq(VertexType4)]), RangeGlobalStep(0,1), EndStep], [HasStep([~label.eq(VertexType5)]), RangeGlobalStep(0,1), EndStep], [HasStep([~label.eq(VertexType6)]), RangeGlobalStep(0,1), EndStep], [HasStep([~label.eq(VertexType7)]), RangeGlobalStep(0,1), EndStep], [HasStep([~label.eq(VertexType8)]), RangeGlobalStep(0,1), EndStep]]), FoldStep, ProjectStep([VertexType1, VertexType2, VertexType3, VertexType4, VertexType5, VertexType6, VertexType7, VertexType8],[[UnfoldStep, HasStep([~label.eq(VertexType1)])], [UnfoldStep, HasStep([~label.eq(VertexType2)])], [UnfoldStep, HasStep([~label.eq(VertexType3)])], [UnfoldStep, HasStep([~label.eq(VertexType4)])], [UnfoldStep, HasStep([~label.eq(VertexType5)])], [UnfoldStep, HasStep([~label.eq(VertexType6)])], [UnfoldStep, HasStep([~label.eq(VertexType7)])], [UnfoldStep, HasStep([~label.eq(VertexType8)])]])] Converted Traversal =================== Neptune steps: [ NeptuneGraphQueryStep(Vertex) { JoinGroupNode { PatternNode[VL(?1, <~label>, ?2, <~>) . project distinct ?1 .] UnionNode { JoinGroupNode { JoinGroupNode { PatternNode[VL(?1, <~label>, ?3, <~>) . ContainsFilter(?3 in ()) .] }, finishers=[limit(1)] Bind {?1 as ?4} } JoinGroupNode { JoinGroupNode { PatternNode[VL(?1, <~label>, ?5, <~>) . ContainsFilter(?5 in ()) .] }, finishers=[limit(1)] Bind {?1 as ?6} } JoinGroupNode { JoinGroupNode { PatternNode[VL(?1, <~label>, ?7, <~>) . ContainsFilter(?7 in ()) .] }, finishers=[limit(1)] Bind {?1 as ?8} } JoinGroupNode { JoinGroupNode { PatternNode[VL(?1, <~label>, ?9, <~>) . ContainsFilter(?9 in ()) .] }, finishers=[limit(1)] Bind {?1 as ?10} } JoinGroupNode { JoinGroupNode { PatternNode[VL(?1, <~label>, ?11, <~>) . ContainsFilter(?11 in ()) .] }, finishers=[limit(1)] Bind {?1 as ?12} } JoinGroupNode { JoinGroupNode { PatternNode[VL(?1, <~label>, ?13, <~>) . ContainsFilter(?13 in ()) .] }, finishers=[limit(1)] Bind {?1 as ?14} } JoinGroupNode { JoinGroupNode { PatternNode[VL(?1, <~label>, ?15, <~>) . ContainsFilter(?15 in ()) .] }, finishers=[limit(1)] Bind {?1 as ?16} } JoinGroupNode { JoinGroupNode { PatternNode[VL(?1, <~label>, ?17, <~>) . ContainsFilter(?17 in ()) .] }, finishers=[limit(1)] Bind {?1 as ?18} } } Bind {Coalesce(?4, ?6, ?8, ?10, ?12, ?14, ?16, ?18) as ?19} }, {path=[Vertex(?1):GraphStep, -V-e-r-t-e-x-(-?-4-)-:-G-r-a-p-h-S-t-e-p-, -V-e-r-t-e-x-(-?-6-)-:-G-r-a-p-h-S-t-e-p-, -V-e-r-t-e-x-(-?-8-)-:-G-r-a-p-h-S-t-e-p-, -V-e-r-t-e-x-(-?-1-0-)-:-G-r-a-p-h-S-t-e-p-, -V-e-r-t-e-x-(-?-1-2-)-:-G-r-a-p-h-S-t-e-p-, -V-e-r-t-e-x-(-?-1-4-)-:-G-r-a-p-h-S-t-e-p-, -V-e-r-t-e-x-(-?-1-6-)-:-G-r-a-p-h-S-t-e-p-, -V-e-r-t-e-x-(-?-1-8-)-:-G-r-a-p-h-S-t-e-p-, -V-e-r-t-e-x-(-?-1-9-)-:-U-n-i-o-n-S-t-e-p-], maxVarId=20} }, NeptuneTraverserConverterStep ] + not converted into Neptune steps: FoldStep,ProjectStep([VertexType1, VertexType2, VertexType3, VertexType4, VertexType5, VertexType6, VertexType7, VertexType8],[[UnfoldStep, HasStep([~label.eq(VertexType1)])], [UnfoldStep, HasStep([~label.eq(VertexType2)])], [UnfoldStep, HasStep([~label.eq(VertexType3)])], [UnfoldStep, HasStep([~label.eq(VertexType4)])], [UnfoldStep, HasStep([~label.eq(VertexType5)])], [UnfoldStep, HasStep([~label.eq(VertexType6)])], [UnfoldStep, HasStep([~label.eq(VertexType7)])], [UnfoldStep, HasStep([~label.eq(VertexType8)])]]), Optimized Traversal =================== Neptune steps: [ NeptuneGraphQueryStep(Vertex) { JoinGroupNode { UnionNode { JoinGroupNode { JoinGroupNode { PatternNode[VL(?1, <~label>, ?3=, <~>) .], {estimatedCardinality=251669484} }, finishers=[limit(1)], {estimatedCardinality=1} Bind {?1 as ?4} } JoinGroupNode { JoinGroupNode { PatternNode[VL(?1, <~label>, ?5=, <~>) .], {estimatedCardinality=99941106} }, finishers=[limit(1)], {estimatedCardinality=1} Bind {?1 as ?6} } JoinGroupNode { JoinGroupNode { PatternNode[VL(?1, <~label>, ?7=, <~>) .], {estimatedCardinality=221647266} }, finishers=[limit(1)], {estimatedCardinality=1} Bind {?1 as ?8} } JoinGroupNode { JoinGroupNode { PatternNode[VL(?1, <~label>, ?9=, <~>) .], {estimatedCardinality=78325288} }, finishers=[limit(1)], {estimatedCardinality=1} Bind {?1 as ?10} } JoinGroupNode { JoinGroupNode { PatternNode[VL(?1, <~label>, ?11=, <~>) .], {estimatedCardinality=39299200} }, finishers=[limit(1)], {estimatedCardinality=1} Bind {?1 as ?12} } JoinGroupNode { JoinGroupNode { PatternNode[VL(?1, <~label>, ?13=, <~>) .], {estimatedCardinality=210783068} }, finishers=[limit(1)], {estimatedCardinality=1} Bind {?1 as ?14} } JoinGroupNode { JoinGroupNode { PatternNode[VL(?1, <~label>, ?15=, <~>) .], {estimatedCardinality=98800974} }, finishers=[limit(1)], {estimatedCardinality=1} Bind {?1 as ?16} } JoinGroupNode { JoinGroupNode { PatternNode[VL(?1, <~label>, ?17=, <~>) .], {estimatedCardinality=99342578} }, finishers=[limit(1)], {estimatedCardinality=1} Bind {?1 as ?18} } } Bind {Coalesce(?4, ?6, ?8, ?10, ?12, ?14, ?16, ?18) as ?19} }, {path=[Vertex(?1):GraphStep, -V-e-r-t-e-x-(-?-4-)-:-G-r-a-p-h-S-t-e-p-, -V-e-r-t-e-x-(-?-6-)-:-G-r-a-p-h-S-t-e-p-, -V-e-r-t-e-x-(-?-8-)-:-G-r-a-p-h-S-t-e-p-, -V-e-r-t-e-x-(-?-1-0-)-:-G-r-a-p-h-S-t-e-p-, -V-e-r-t-e-x-(-?-1-2-)-:-G-r-a-p-h-S-t-e-p-, -V-e-r-t-e-x-(-?-1-4-)-:-G-r-a-p-h-S-t-e-p-, -V-e-r-t-e-x-(-?-1-6-)-:-G-r-a-p-h-S-t-e-p-, -V-e-r-t-e-x-(-?-1-8-)-:-G-r-a-p-h-S-t-e-p-, -V-e-r-t-e-x-(-?-1-9-)-:-U-n-i-o-n-S-t-e-p-], maxVarId=20} }, NeptuneTraverserConverterStep, NeptuneMemoryTrackerStep ] + not converted into Neptune steps: FoldStep,ProjectStep([VertexType1, VertexType2, VertexType3, VertexType4, VertexType5, VertexType6, VertexType7, VertexType8],[[UnfoldStep, NeptuneHasStep([~label.eq(VertexType1)])], [UnfoldStep, NeptuneHasStep([~label.eq(VertexType2)])], [UnfoldStep, NeptuneHasStep([~label.eq(VertexType3)])], [UnfoldStep, NeptuneHasStep([~label.eq(VertexType4)])], [UnfoldStep, NeptuneHasStep([~label.eq(VertexType5)])], [UnfoldStep, NeptuneHasStep([~label.eq(VertexType6)])], [UnfoldStep, NeptuneHasStep([~label.eq(VertexType7)])], [UnfoldStep, NeptuneHasStep([~label.eq(VertexType8)])]]), WARNING: >> [FoldStep] << (or one of the children for each step) is not supported natively yet Predicates ========== # of predicates: 31