To explain what I am doing from a sql point of view is as follows.
If un-optimized, I first execute a query to return the "outB" edges,
then for each edge I execute another query the retrieve the inV().
The optimization is to makes this happen in one query. Reducing round
trips has order of magnitude performance benefits for sqlg.
When I do not collapse the steps into one I see that the .select("e",
"B") part happens in SelectStep.map where the labeled object is
retrieved from Path.objects() where the object was saved as it was
touched by the traverser.
Now that I have collapsed the steps there is no place where the edge is
traversed and stored on the path.
Instead I retrieve the labeled edges and the vertices all in one step.
At the "//what to do" part I have all the information (The final inV()
vertex and a map of the labeled edges) but I need to make it such that
the select step will be able to find the labeled edges on the path. In
this example the labeled map contains only the edge with "e" as the key.
Hope it makes some sense.
Thanks
Pieter
On 01/07/2015 20:02, Marko Rodriguez wrote:
> Hi,
>
> I don't quite understand what you are trying to accomplish (attention span of
> a tootsie fly), but here are some notes:
>
> 1. Look at AbstractStep.prepareTraveserForNextStep()
> 2. B_O_…Traverser specify the requirements that the Traverser satisfies:
> B_O_P_S_SE_SL_Traverser =
> Bulk+Object+Path+Sack+SideEffect+SingleLoop. In other words, a very meaty
> traverser, indeed.
>
> What do you want "// What to do?" to do?
>
> Marko.
>
> http://markorodriguez.com
>
> On Jul 1, 2015, at 11:32 AM, pieter-gmail <[email protected]> wrote:
>
>> Hi,
>>
>> I am trying to optimize queries with 'as' in it.
>>
>> Currently I can optimize consecutive VertexStep and EdgeVertexStep
>> (without labels) by combining them into one step.
>>
>> Now I am trying to achieve the same but with 'as' in the traversal.
>>
>> e.g.
>>
>> Vertex a1 = g.addVertex(T.label, "A", "name", "a1");
>> Vertex b1 = g.addVertex(T.label, "B", "name", "b1");
>> Vertex b2 = g.addVertex(T.label, "B", "name", "b2");
>> Edge e1 = a1.addEdge("outB", b1);
>> Edge e2 = a1.addEdge("outB", b2);
>>
>> g.tx().commit();
>>
>> GraphTraversal<Vertex, Map<String, Element>> traversal = g.traversal()
>> .V(a1)
>> .outE("outB")
>> .as("e")
>> .inV()
>> .as("B")
>> .select("e", "B");
>>
>> I combine all consecutive VertexStep, EdgeVertexStep into one step,
>> execute one query and with the result I can construct the labeled edge
>> ("e") and vertices ("B").
>>
>> So far in the combined step I have all the information, but alas what now?
>>
>> public class SqlgVertexStepCompiled<S extends SqlgElement, E extends
>> SqlgElement> extends FlatMapStep<S, E> {
>>
>> ...
>>
>> @Override
>> protected Traverser<E> processNextStart() {
>> while (true) {
>> if (this.iterator.hasNext()) {
>> Pair<E, Map<String, Object>> next = this.iterator.next();
>> E e = next.getLeft();
>> Map<String, Object> labeledObjects = next.getRight();
>> for (String label : labeledObjects.keySet()) {
>> //What to do
>> this.head.path().extend(labeledObjects.get(label), label);
>> }
>> return this.head.split(e, this);
>> } else {
>> this.head = this.starts.next();
>> this.iterator = this.flatMapCustom(this.head);
>> }
>> }
>> }
>>
>> ...
>>
>> Any pointers?
>>
>> btw, what does all those strange traverser names mean,
>> B_O_P_S_SE_SL_Traverser...
>>
>> Thanks
>> Pieter
>