This is an automated email from the ASF dual-hosted git repository. andreac pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit a18ee9fd30fbab5b0c7247269ba0c9dc2e6690a0 Merge: 7d4cfcfb38 a6f77163ff Author: Andrea Child <[email protected]> AuthorDate: Fri Sep 26 13:42:37 2025 -0700 Merge branch '3.8-dev' CHANGELOG.asciidoc | 5 +- docs/src/upgrade/release-3.8.x.asciidoc | 89 +++++++++ .../optimization/RepeatUnrollStrategy.java | 49 +++-- .../process/traversal/util/TraversalHelper.java | 18 ++ .../optimization/RepeatUnrollStrategyTest.java | 139 ++++++++----- .../traversal/util/TraversalHelperTest.java | 49 ++++- .../Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs | 16 ++ gremlin-go/driver/cucumber/gremlin.go | 16 ++ .../gremlin-javascript/test/cucumber/gremlin.js | 16 ++ gremlin-python/src/main/python/radish/gremlin.py | 18 +- .../integrated/RepeatUnrollStrategy.feature | 221 +++++++++++++++++++++ 11 files changed, 567 insertions(+), 69 deletions(-) diff --cc gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RepeatUnrollStrategyTest.java index 724fdabcb6,1bd2675346..23bd4996dc --- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RepeatUnrollStrategyTest.java +++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RepeatUnrollStrategyTest.java @@@ -174,4 -181,47 +178,47 @@@ public class RepeatUnrollStrategyTest .variablesArePreserved(); } } + + /** + * Applies RepeatUnrollStrategy (with and without LazyBarrierStrategy) to the given original traversal and verifies the expected optimized traversal. + * + * @param original the original traversal to apply strategies to + * @param expectedOptimized the expected optimized traversal + * @param otherStrategies any other strategies that should also be applied + */ + private static void testRepeatUnrollStrategy(Traversal.Admin<?, ?> original, Traversal<?, ?> expectedOptimized, Collection<TraversalStrategy<?>> otherStrategies) { - final String repr = translator.translate(original.getBytecode()).getScript(); ++ final String repr = original.getGremlinLang().getGremlin("__"); + final TraversalStrategies strategiesWithLazy = new DefaultTraversalStrategies(); + strategiesWithLazy.addStrategies(RepeatUnrollStrategy.instance()); + Traversal.Admin<?, ?> clonedOriginal = original.clone(); + + // adding LazyBarrierStrategy as RepeatUnrollStrategy adds barriers and the existence of this strategy + // triggers those additions. if they are not there they will not be present and most of these assertions + // assume this strategy present + strategiesWithLazy.addStrategies(LazyBarrierStrategy.instance()); + for (final TraversalStrategy<?> strategy : otherStrategies) { + strategiesWithLazy.addStrategies(strategy); + } + clonedOriginal.setStrategies(strategiesWithLazy); + clonedOriginal.applyStrategies(); + assertEquals("With LazyBarrierStrategy: " + repr, expectedOptimized, clonedOriginal); + + final TraversalStrategies strategiesWithoutLazy = new DefaultTraversalStrategies(); + strategiesWithoutLazy.addStrategies(RepeatUnrollStrategy.instance()); + for (final TraversalStrategy<?> strategy : otherStrategies) { + strategiesWithoutLazy.addStrategies(strategy); + } + clonedOriginal = original.clone(); + clonedOriginal.setStrategies(strategiesWithoutLazy); + clonedOriginal.applyStrategies(); + final Traversal.Admin<?, ?> optimizedWithoutBarriers = expectedOptimized.asAdmin().clone(); + + // remove all the barriers as LazyBarrierStrategy is not present and therefore RepeatUnrollStrategy should + // not add any + TraversalHelper.getStepsOfAssignableClassRecursively(NoOpBarrierStep.class, optimizedWithoutBarriers).forEach(s -> { + TraversalHelper.copyLabels(s, s.getPreviousStep(), true); + s.getTraversal().removeStep(s); + }); + assertEquals("Without LazyBarrierStrategy: " + repr, optimizedWithoutBarriers, clonedOriginal); + } } diff --cc gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs index 7877d713c0,032054180f..956bce7b88 --- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs +++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs @@@ -582,9 -582,25 +582,25 @@@ namespace Gremlin.Net.IntegrationTest.G {"g_withoutStrategiesXReferenceElementStrategyX_V", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithoutStrategies(typeof(ReferenceElementStrategy)).V()}}, {"g_withStrategiesXRepeatUnrollStrategyX_V_repeatXoutX_timesX2X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new RepeatUnrollStrategy()).V().Repeat(__.Out()).Times(2)}}, {"g_withoutStrategiesXRepeatUnrollStrategyX_V_repeatXoutX_timesX2X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithoutStrategies(typeof(RepeatUnrollStrategy)).V().Repeat(__.Out()).Times(2)}}, + {"g_withStrategiesXRepeatUnrollStrategyX_V_repeatXinX_timesX2X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new RepeatUnrollStrategy()).V().Repeat(__.In()).Times(2)}}, + {"g_withoutStrategiesXRepeatUnrollStrategyX_V_repeatXinX_timesX2X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithoutStrategies(typeof(RepeatUnrollStrategy)).V().Repeat(__.In()).Times(2)}}, + {"g_withStrategiesXRepeatUnrollStrategyX_V_repeatXout_hasXname_notStartingWithXzXXX_timesX2X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new RepeatUnrollStrategy()).V().Repeat(__.Out().Has("name", TextP.NotStartingWith("z"))).Times(2)}}, + {"g_withoutStrategiesXRepeatUnrollStrategyX_V_repeatXout_hasXname_notStartingWithXzXXX_timesX2X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithoutStrategies(typeof(RepeatUnrollStrategy)).V().Repeat(__.Out().Has("name", TextP.NotStartingWith("z"))).Times(2)}}, + {"g_withStrategiesXRepeatUnrollStrategyX_V_repeatXin_hasXage_gtX20XXX_timesX2X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new RepeatUnrollStrategy()).V().Repeat(__.In().Has("age", P.Gt(20))).Times(2)}}, + {"g_withoutStrategiesXRepeatUnrollStrategyX_V_repeatXin_hasXage_gtX20XXX_timesX2X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithoutStrategies(typeof(RepeatUnrollStrategy)).V().Repeat(__.In().Has("age", P.Gt(20))).Times(2)}}, + {"g_withStrategiesXRepeatUnrollStrategyX_V_repeatXboth_hasXage_ltX30XXX_timesX2X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new RepeatUnrollStrategy()).V().Repeat(__.Both().Has("age", P.Lt(30))).Times(2)}}, + {"g_withoutStrategiesXRepeatUnrollStrategyX_V_repeatXboth_hasXage_ltX30XXX_timesX2X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithoutStrategies(typeof(RepeatUnrollStrategy)).V().Repeat(__.Both().Has("age", P.Lt(30))).Times(2)}}, + {"g_withStrategiesXRepeatUnrollStrategyX_V_repeatXbothE_otherV_hasXage_ltX30XXX_timesX2X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new RepeatUnrollStrategy()).V().Repeat(__.BothE().OtherV().Has("age", P.Lt(30))).Times(2)}}, + {"g_withoutStrategiesXRepeatUnrollStrategyX_V_repeatXbothE_otherV_hasXage_ltX30XXX_timesX2X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithoutStrategies(typeof(RepeatUnrollStrategy)).V().Repeat(__.BothE().OtherV().Has("age", P.Lt(30))).Times(2)}}, + {"g_withStrategiesXRepeatUnrollStrategyX_V_repeatXboth_limitX1XX_timesX2X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new RepeatUnrollStrategy()).V().Repeat(__.Both().Limit<object>(1)).Times(2)}}, + {"g_withoutStrategiesXRepeatUnrollStrategyX_V_repeatXboth_limitX1XX_timesX2X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithoutStrategies(typeof(RepeatUnrollStrategy)).V().Repeat(__.Both().Limit<object>(1)).Times(2)}}, + {"g_withStrategiesXRepeatUnrollStrategyX_V_repeatXboth_aggregateXxXX_timesX2X_limitX5X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new RepeatUnrollStrategy()).V().Order().Repeat(__.Both().Order().Aggregate("x")).Times(2).Limit<object>(5)}}, + {"g_withoutStrategiesXRepeatUnrollStrategyX_V_repeatXboth_aggregateXxXX_timesX2X_limitX5X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithoutStrategies(typeof(RepeatUnrollStrategy)).V().Order().Repeat(__.Both().Order().Aggregate("x")).Times(2).Limit<object>(5)}}, + {"g_withStrategiesXRepeatUnrollStrategyX_V_repeatXboth_sampleX1XX_timesX2X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new RepeatUnrollStrategy()).V().Repeat(__.Both().Sample(1)).Times(2)}}, + {"g_withoutStrategiesXRepeatUnrollStrategyX_V_repeatXboth_sampleX1XX_timesX2X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithoutStrategies(typeof(RepeatUnrollStrategy)).V().Repeat(__.Both().Sample(1)).Times(2)}}, - {"g_withStrategiesXReservedKeysVerificationStrategyXthrowException_trueXX_addVXpersonX_propertyXid_123X_propertyXname_markoX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new ReservedKeysVerificationStrategy(throwException: true)).AddV("person").Property("id", 123).Property("name", "marko")}}, - {"g_withStrategiesXReservedKeysVerificationStrategyXthrowException_trueXX_addVXpersonX_propertyXage_29X_propertyXname_markoX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new ReservedKeysVerificationStrategy(throwException: true, keys: new HashSet<string> { "age" })).AddV("person").Property("age", 29).Property("name", "marko")}}, - {"g_withoutStrategiesXReservedKeysVerificationStrategyX_addVXpersonX_propertyXid_123X_propertyXname_markoX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithoutStrategies(typeof(ReservedKeysVerificationStrategy)).AddV("person").Property("id", 123).Property("name", "marko").Values<object>()}}, + {"g_withStrategiesXReservedKeysVerificationStrategyXthrowException_trueXX_addVXpersonX_propertyXid_123X_propertyXname_markoX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new ReservedKeysVerificationStrategy(throwException: true)).AddV((string) "person").Property("id", 123).Property("name", "marko")}}, + {"g_withStrategiesXReservedKeysVerificationStrategyXthrowException_trueXX_addVXpersonX_propertyXage_29X_propertyXname_markoX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new ReservedKeysVerificationStrategy(throwException: true, keys: new HashSet<string> { "age" })).AddV((string) "person").Property("age", 29).Property("name", "marko")}}, + {"g_withoutStrategiesXReservedKeysVerificationStrategyX_addVXpersonX_propertyXid_123X_propertyXname_markoX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithoutStrategies(typeof(ReservedKeysVerificationStrategy)).AddV((string) "person").Property("id", 123).Property("name", "marko").Values<object>()}}, {"g_withoutStrategiesXSeedStrategyX_V", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithoutStrategies(typeof(SeedStrategy)).V()}}, {"g_withStrategiesXStandardVerificationStrategyX_V", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new StandardVerificationStrategy()).V()}}, {"g_withoutStrategiesXStandardVerificationStrategyX_V", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithoutStrategies(typeof(StandardVerificationStrategy)).V()}}, diff --cc gremlin-python/src/main/python/radish/gremlin.py index ffcb240aec,f20bf16759..eeab35434c --- a/gremlin-python/src/main/python/radish/gremlin.py +++ b/gremlin-python/src/main/python/radish/gremlin.py @@@ -553,15 -552,31 +553,31 @@@ world.gremlins = 'g_V_classic_recommendation': [(lambda g:g.V().has('name', 'DARK STAR').as_('a').out('followedBy').aggregate('stash').in_('followedBy').where(P.neq('a').and_(P.not_(P.within('stash')))).group_count().unfold().project('x', 'y', 'z').by(__.select(Column.keys).values('name')).by(__.select(Column.keys).values('performances')).by(__.select(Column.values)).order().by(__.select('z'), Order.desc).by(__.select('y'), Order.asc).limit(5).aggregate(Scope.local, 'm').select('x'))], 'g_V_classic_recommendation_ranked': [(lambda g:g.V().has('name', 'DARK STAR').as_('a').out('followedBy').aggregate('stash').in_('followedBy').where(P.neq('a').and_(P.not_(P.within('stash')))).group_count().unfold().project('x', 'y', 'z').by(__.select(Column.keys).values('name')).by(__.select(Column.keys).values('performances')).by(__.select(Column.values)).order().by(__.select('z'), Order.desc).by(__.select('y'), Order.asc).limit(5).aggregate(Scope.local, 'm'))], 'g_withStrategiesXReferenceElementStrategyX_V': [(lambda g:g.with_strategies(ReferenceElementStrategy()).V())], - 'g_withoutStrategiesXReferenceElementStrategyX_V': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization.ReferenceElementStrategy')]).V())], + 'g_withoutStrategiesXReferenceElementStrategyX_V': [(lambda g:g.without_strategies(ReferenceElementStrategy).V())], 'g_withStrategiesXRepeatUnrollStrategyX_V_repeatXoutX_timesX2X': [(lambda g:g.with_strategies(RepeatUnrollStrategy()).V().repeat(__.out()).times(2))], - 'g_withoutStrategiesXRepeatUnrollStrategyX_V_repeatXoutX_timesX2X': [(lambda g:g.without_strategies(RepeatUnrollStrategy).V().repeat(__.out()).times(2))], + 'g_withoutStrategiesXRepeatUnrollStrategyX_V_repeatXoutX_timesX2X': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.RepeatUnrollStrategy')]).V().repeat(__.out()).times(2))], + 'g_withStrategiesXRepeatUnrollStrategyX_V_repeatXinX_timesX2X': [(lambda g:g.with_strategies(RepeatUnrollStrategy()).V().repeat(__.in_()).times(2))], + 'g_withoutStrategiesXRepeatUnrollStrategyX_V_repeatXinX_timesX2X': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.RepeatUnrollStrategy')]).V().repeat(__.in_()).times(2))], + 'g_withStrategiesXRepeatUnrollStrategyX_V_repeatXout_hasXname_notStartingWithXzXXX_timesX2X': [(lambda g:g.with_strategies(RepeatUnrollStrategy()).V().repeat(__.out().has('name', TextP.not_starting_with('z'))).times(2))], + 'g_withoutStrategiesXRepeatUnrollStrategyX_V_repeatXout_hasXname_notStartingWithXzXXX_timesX2X': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.RepeatUnrollStrategy')]).V().repeat(__.out().has('name', TextP.not_starting_with('z'))).times(2))], + 'g_withStrategiesXRepeatUnrollStrategyX_V_repeatXin_hasXage_gtX20XXX_timesX2X': [(lambda g:g.with_strategies(RepeatUnrollStrategy()).V().repeat(__.in_().has('age', P.gt(20))).times(2))], + 'g_withoutStrategiesXRepeatUnrollStrategyX_V_repeatXin_hasXage_gtX20XXX_timesX2X': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.RepeatUnrollStrategy')]).V().repeat(__.in_().has('age', P.gt(20))).times(2))], + 'g_withStrategiesXRepeatUnrollStrategyX_V_repeatXboth_hasXage_ltX30XXX_timesX2X': [(lambda g:g.with_strategies(RepeatUnrollStrategy()).V().repeat(__.both().has('age', P.lt(30))).times(2))], + 'g_withoutStrategiesXRepeatUnrollStrategyX_V_repeatXboth_hasXage_ltX30XXX_timesX2X': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.RepeatUnrollStrategy')]).V().repeat(__.both().has('age', P.lt(30))).times(2))], + 'g_withStrategiesXRepeatUnrollStrategyX_V_repeatXbothE_otherV_hasXage_ltX30XXX_timesX2X': [(lambda g:g.with_strategies(RepeatUnrollStrategy()).V().repeat(__.both_e().other_v().has('age', P.lt(30))).times(2))], + 'g_withoutStrategiesXRepeatUnrollStrategyX_V_repeatXbothE_otherV_hasXage_ltX30XXX_timesX2X': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.RepeatUnrollStrategy')]).V().repeat(__.both_e().other_v().has('age', P.lt(30))).times(2))], + 'g_withStrategiesXRepeatUnrollStrategyX_V_repeatXboth_limitX1XX_timesX2X': [(lambda g:g.with_strategies(RepeatUnrollStrategy()).V().repeat(__.both().limit(1)).times(2))], + 'g_withoutStrategiesXRepeatUnrollStrategyX_V_repeatXboth_limitX1XX_timesX2X': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.RepeatUnrollStrategy')]).V().repeat(__.both().limit(1)).times(2))], + 'g_withStrategiesXRepeatUnrollStrategyX_V_repeatXboth_aggregateXxXX_timesX2X_limitX5X': [(lambda g:g.with_strategies(RepeatUnrollStrategy()).V().order().repeat(__.both().order().aggregate('x')).times(2).limit(5))], + 'g_withoutStrategiesXRepeatUnrollStrategyX_V_repeatXboth_aggregateXxXX_timesX2X_limitX5X': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.RepeatUnrollStrategy')]).V().order().repeat(__.both().order().aggregate('x')).times(2).limit(5))], + 'g_withStrategiesXRepeatUnrollStrategyX_V_repeatXboth_sampleX1XX_timesX2X': [(lambda g:g.with_strategies(RepeatUnrollStrategy()).V().repeat(__.both().sample(1)).times(2))], + 'g_withoutStrategiesXRepeatUnrollStrategyX_V_repeatXboth_sampleX1XX_timesX2X': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.RepeatUnrollStrategy')]).V().repeat(__.both().sample(1)).times(2))], 'g_withStrategiesXReservedKeysVerificationStrategyXthrowException_trueXX_addVXpersonX_propertyXid_123X_propertyXname_markoX': [(lambda g:g.with_strategies(ReservedKeysVerificationStrategy(throw_exception=True)).add_v('person').property('id', 123).property('name', 'marko'))], 'g_withStrategiesXReservedKeysVerificationStrategyXthrowException_trueXX_addVXpersonX_propertyXage_29X_propertyXname_markoX': [(lambda g:g.with_strategies(ReservedKeysVerificationStrategy(throw_exception=True, keys={'age'})).add_v('person').property('age', 29).property('name', 'marko'))], - 'g_withoutStrategiesXReservedKeysVerificationStrategyX_addVXpersonX_propertyXid_123X_propertyXname_markoX': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReservedKeysVerificationStrategy')]).add_v('person').property('id', 123).property('name', 'marko').values())], - 'g_withoutStrategiesXSeedStrategyX_V': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SeedStrategy')]).V())], + 'g_withoutStrategiesXReservedKeysVerificationStrategyX_addVXpersonX_propertyXid_123X_propertyXname_markoX': [(lambda g:g.without_strategies(ReservedKeysVerificationStrategy).add_v('person').property('id', 123).property('name', 'marko').values())], + 'g_withoutStrategiesXSeedStrategyX_V': [(lambda g:g.without_strategies(SeedStrategy).V())], 'g_withStrategiesXStandardVerificationStrategyX_V': [(lambda g:g.with_strategies(StandardVerificationStrategy()).V())], - 'g_withoutStrategiesXStandardVerificationStrategyX_V': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.StandardVerificationStrategy')]).V())], + 'g_withoutStrategiesXStandardVerificationStrategyX_V': [(lambda g:g.without_strategies(StandardVerificationStrategy).V())], 'g_withStrategiesXSubgraphStrategyXsubgraphAXX_V': [(lambda g:g.with_strategies(SubgraphStrategy(vertices=__.has('name', P.within('josh', 'lop', 'ripple')))).V())], 'g_withStrategiesXSubgraphStrategyXsubgraphAXX_E': [(lambda g:g.with_strategies(SubgraphStrategy(vertices=__.has('name', P.within('josh', 'lop', 'ripple')))).E())], 'g_withStrategiesXSubgraphStrategyXsubgraphAXX_VX4X_outE': [(lambda g, vid4=None:g.with_strategies(SubgraphStrategy(vertices=__.has('name', P.within('josh', 'lop', 'ripple')))).V(vid4).out_e())],
