Except Retain Pattern
Clone this wiki locally
Attention: this Wiki hosts an outdated version of the TinkerPop framework and Gremlin language documentation.
In many instances its desirable to traverse to only those elements that have not been seen in a previous step. Specific use cases are:
- “Who are my friends friends that are not already my friends?”
- “What is liked by the people that like the same things as me that I don’t already like?”
The solution to these types of problems is provided by the except pattern. Its opposite is the retain pattern—only traverse to those vertices that have been seen in a previous step.
gremlin> g = TinkerGraphFactory.createTinkerGraph() ==>tinkergraph[vertices:6 edges:6] gremlin> g.v(1).out ==>v ==>v ==>v gremlin> g.v(1).out.out ==>v ==>v
Both the first and the second emit
v. To ensure that
v is not traversed to on the second step, its necessary to save the results seen after the first
out. There are three high-level pipes called
retain. In the examples below,
x stores all the values seen up to the
aggregate step. Note that, everything in
out is “drained” into
x before going to the next
gremlin> x =  gremlin> g.v(1).out.aggregate(x).out.except(x) ==>v
gremlin> x =  gremlin> g.v(1).out.aggregate(x).out.retain(x) ==>v
With named steps it is possible to
retain previously (and actually forward) objects in the pipeline.
gremlin> g.v(1).as('x').out('created').in('created').except('x') ==>v ==>v