docs: def make_association_id(definedby, sub, pred, obj, attributes=None):
          """
          A method to create unique identifiers for OBAN-style associations,
          based on all the parts of the association
          If any of the items is empty or None, it will convert it to blank.
          It effectively digests the  string of concatonated values.
          Subclasses of Assoc can submit an additional array of attributes
          that will be appeded to the ID.
  
          Note this is equivalent to a RDF blank node
  
          :param definedby: The (data) resource that provided the annotation
          :param subject:
          :param predicate:
          :param object:
          :param attributes:
  
          :return:
  
          """
  
          items_to_hash = [definedby, sub, pred, obj]
          if attributes is not None and len(attributes) > 0:
              items_to_hash += attributes
  
          items_to_hash = [x for x in items_to_hash if x is not None]
  
          assoc_id = ':'.join(('MONARCH', GraphUtils.digest_id('+'.join(items_to_hash))))
          assert assoc_id is not None
          return assoc_id