Github user spmallette commented on a diff in the pull request:
https://github.com/apache/tinkerpop/pull/882#discussion_r207183855
--- Diff: docs/src/recipes/shortest-path.asciidoc ---
@@ -136,3 +158,44 @@ g.withSack(0.0).V().as("from"). <1>
<7> Order the output by the start vertex id and then the end vertex id
(for better readability).
<8> Deduplicate vertex pairs (the shortest path from `v[1]` to `v[6]` is
the same as the path from `v[6]` to `v[1]`).
+Again, this can be translated into an OLAP query using the
`shortestPath()` step.
+
+[gremlin-groovy,existing]
+----
+result = g.withComputer().V().
+ shortestPath().
+ with(ShortestPath.distance, 'weight').
+ with(ShortestPath.includeEdges, true).
+ filter(count(local).is(gt(1))).
+ group().
+ by(project('from','to').
+ by(limit(local, 1)).
+ by(tail(local, 1))).
+ unfold().
+ order().
+ by(select(keys).select('from').id()).
+ by(select(keys).select('to').id()).toList()
+----
+
+The obvious difference in the result is the absence of property values in
the OLAP result. Since OLAP traversers are not
+allowed to leave the local star graph, it's not possible to have the exact
same result in an OLAP query. However, the determined
+shortest paths can be passed back into the OLTP `GraphTraversalSource`,
which can then be used to query the values.
+
+[gremlin-groovy,existing]
+----
+g.withSideEffect('v', []). <1>
+ inject(result.toArray()).as('kv').select(values).
+ unfold().
+ map(unfold().as('v_or_e').
+ coalesce(V().where(eq('v_or_e')).store('v'),
+ select('v').tail(local, 1).bothE().where(eq('v_or_e'))).
+ values('name','weight').
+ fold()).
+ group().
+ by(select('kv').select(keys)).unfold().
+ order().
+ by(select(keys).select('from').id()).
+ by(select(keys).select('to').id()).toList()
+----
+
+<1> The side-effect `v` is used to keep track of the last processed
vertex, hence it needs to be an order-preserving list. Without this explicit
definition `v` would become a `BulkSet` which doesn't preserve the insert order.
--- End diff --
interesting
---