@Override
    protected Traverser.Admin<Map<String, E>> processNextStart() throws NoSuchElementException {
        final Traverser.Admin<S> traverser = this.starts.next();
        final Map<String, E> bindings = new LinkedHashMap<>(this.selectKeys.size(), 1.0f);
        try {
            for (final String selectKey : this.selectKeys) {
                final E end = this.getScopeValue(this.pop, selectKey, traverser);
                final TraversalProduct product = TraversalUtil.produce(end, this.traversalRing.next());

                if (!product.isProductive()) break;

                bindings.put(selectKey, (E) product.get());
            }

            // bindings should be the same size as unique keys or else there was an unproductive by() in which case
            // we filter with an EmptyTraverser.
            if (bindings.size() != selectKeysSet.size()) return EmptyTraverser.instance();

        } catch (KeyNotFoundException nfe) {
            return EmptyTraverser.instance();
        } finally {
            this.traversalRing.reset();
        }

        return PathProcessor.processTraverserPathLabels(traverser.split(bindings, this), this.keepLabels);
    }
@author Marko A. Rodriguez (http://markorodriguez.com)
@author Stephen Mallette (http://stephen.genoprime.com)
gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectStep.java