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

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