Step - or

or(a, b, ...) keeps a traverser when at least one child traversal produces a result for it.

g.V().or(__.has("age", P.gt(30)), __.hasLabel("software")).values("name")

or() with no argument is the infix form a.or().b, with the operand rules of the infix and(); and() binds tighter, so a.and().b.or().c is or(and(a, b), c).

g.V().emit(__.has("name", "marko").or().loops().is(2)).repeat(__.out()).values("name")
// ["marko", "ripple", "lop"]

Rust: the prefix form or(vec![a, b]); the infix form is a DSL notation.