docs: def upsert_object_property(self, identifier, properties, ignore_constraints=False):
          """Manipulate an object's property set. Inserts or updates properties in
          given dictionary. If a property key does not exist in the object's
          property set it is created. If the value is None an existing property is
          deleted.
  
          Existing object properties that are not present in the given property
          set remain unaffacted.
  
          Deleting mandatory properties or updating immutable properties results
          in a ValueError. These constraints can be disabled using the
          ignore_constraints parameter.
  
          Parameters
          ----------
          identifier : string
              Unique object identifier
          properties : Dictionary()
              Dictionary of property names and their new values.
          ignore_constraints : Boolean
              Flag indicating whether to ignore immutable and mandatory property
              constraints (True) or nore (False, Default).
  
          Returns
          -------
          ObjectHandle
              Handle to updated object or None if object does not exist
          """
          # Retrieve the object with the gievn identifier. This is a (sub-)class
          # of ObjectHandle
          obj = self.get_object(identifier)
          if not obj is None:
              # Modify property set of retrieved object handle. Raise exception if
              # and of the upserts is not valid.
              for key in properties:
                  value = properties[key]
                  # If the update affects an immutable property raise exception
                  if not ignore_constraints and key in self.immutable_properties:
                      raise ValueError('update to immutable property: ' + key)
                  # Check whether the operation is an UPSERT (value != None) or
                  # DELETE (value == None)
                  if not value is None:
                      obj.properties[key] = value
                  else:
                      # DELETE. Make sure the property is not mandatory
                      if not ignore_constraints and key in self.mandatory_properties:
                          raise ValueError('delete mandatory property: ' + key)
                      elif key in obj.properties:
                          del obj.properties[key]
              # Update object in database
              self.replace_object(obj)
          # Return object handle
          return obj