code: @Override
      @SuppressWarnings("unchecked")
      public <V> Iterator<VertexProperty<V>> properties(String... propertyKeys) {
          Objects.requireNonNull(propertyKeys, "propertyKeys cannot be null");
          // check we have properties with key
          if (!properties.isEmpty()) {
              // no properties in filter
              if (propertyKeys.length == 0) {
                  // all properties (return a copy since properties iterator can be modified by calling remove())
                  return properties.entrySet().stream()
                      .flatMap(entry -> entry.getValue().stream())
                      .map(item -> (VertexProperty<V>)item)
                      .collect(Collectors.toList())
                      .iterator();
              }
              // one property in filter
              if (propertyKeys.length == 1) {
                  // get list for key
                  Collection<?> list = properties.get(propertyKeys[0]);
                  if (list != null) {
                      // all properties (return a copy since properties iterator can be modified by calling remove())
                      return list.stream()
                          .map(item -> (VertexProperty<V>)item)
                          .collect(Collectors.toList())
                          .iterator();
                  }
                  // nothing on key
                  return Collections.emptyIterator();
              }
              // loop property keys (return a copy since properties iterator can be modified by calling remove())
              return Arrays.stream(propertyKeys)
                  .flatMap(key -> ((Collection<?>)properties.getOrDefault(key, Collections.EMPTY_LIST)).stream())
                  .map(item -> (VertexProperty<V>)item)
                  .collect(Collectors.toList())
                  .iterator();
          }
          // nothing
          return Collections.emptyIterator();
      }
docs: {@inheritDoc}