@Override
    public void addStart(final Traverser.Admin<T> start) {
        if (null == this.bypassTraversal) {
            final T o = start.get();
            if (o instanceof Element) {
                // if the property is not present then it has noStarts which means hasNext() return false
                final Property<V> p = ((Element) o).property(propertyKey);
                if (p.isPresent())
                    this.value = p.value();
                else
                    noStarts = true;
            } else if (o instanceof Map)
                this.value = (V) ((Map) o).get(propertyKey);
            else
                throw new IllegalStateException(String.format(
                        "The by(\"%s\") modulator can only be applied to a traverser that is an Element or a Map - it is being applied to [%s] a %s class instead",
                        propertyKey, o, o.getClass().getSimpleName()));
        } else {
            final Iterator<V> itty = TraversalUtil.applyAll(start, this.bypassTraversal);
            if (itty.hasNext()) {
                this.value = itty.next();
            } else {
                noStarts = true;
            }
        }
    }
If there is a "start" traverser this method will return {@code true} and otherwise {@code false} and in either
case will always return as such, irrespective of calls to {@link #next()}. Calling methods should account for
this behavior on their own.
gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/ValueTraversal.java