docs: protected void updatePropertiesInternal(Iterable<Property> properties, Iterable<PropertyRemoveMutation> propertyRemoves) {
          if (propertyRemoves != null) {
              this.propertyRemoveMutations = new ConcurrentSkipListSet<>();
              for (PropertyRemoveMutation propertyRemoveMutation : propertyRemoves) {
                  removePropertyInternal(
                          propertyRemoveMutation.getKey(),
                          propertyRemoveMutation.getName(),
                          propertyRemoveMutation.getVisibility()
                  );
                  this.propertyRemoveMutations.add(propertyRemoveMutation);
              }
          }
  
          for (Property property : properties) {
              if (property.getKey() == null) {
                  throw new IllegalArgumentException("key is required for property");
              }
              Object propertyValue = property.getValue();
              if (propertyValue instanceof PropertyValue && !((PropertyValue) propertyValue).isStore()) {
                  continue;
              }
              Property existingProperty = getProperty(property.getKey(), property.getName(), property.getVisibility());
              if (existingProperty == null) {
                  this.properties.add(property);
              } else {
                  if (existingProperty instanceof MutableProperty) {
                      ((MutableProperty) existingProperty).update(property);
                  } else {
                      throw new SecureGraphException("Could not update property of type: " + existingProperty.getClass().getName());
                  }
              }
          }
      }