* @param value the object to filter on
* @return the extended Pipeline
*/
public GremlinPipeline<S, ? extends Element> has(final String key, final Predicate predicate, final Object value) {
if (key.equals(Tokens.ID)) {
return this.add(new IdFilterPipe(predicate, value));
} else if (key.equals(Tokens.LABEL)) {
return this.add(new LabelFilterPipe(predicate, value));
} else {
final Pipe pipe = new PropertyFilterPipe(key, predicate, value);
return this.doQueryOptimization ? GremlinFluentUtility.optimizePipelineForQuery(this, pipe) : this.add(pipe);