<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def add_qualified_edge( self, u, v, *, relation: str, evidence: str, citation: Union[str, Mapping[str, str]], annotations: Optional[AnnotationsHint] = None, subject_modifier: Optional[Mapping] = None, object_modifier: Optional[Mapping] = None, **attr ) -> str: """Add a qualified edge. Qualified edges have a relation, evidence, citation, and optional annotations, subject modifications, and object modifications. :param u: The source node :param v: The target node :param relation: The type of relation this edge represents :param evidence: The evidence string from an article :param citation: The citation data dictionary for this evidence. If a string is given, assumes it's a PubMed identifier and auto-fills the citation type. :param annotations: The annotations data dictionary :param subject_modifier: The modifiers (like activity) on the subject node. See data model documentation. :param object_modifier: The modifiers (like activity) on the object node. See data model documentation. :return: The hash of the edge """

        attr.update({
            RELATION: relation,
            EVIDENCE: evidence,
        })

        if isinstance(citation, str):
            attr[CITATION] = {
                CITATION_TYPE: CITATION_TYPE_PUBMED,
                CITATION_REFERENCE: citation,
            }
        elif isinstance(citation, dict):
            attr[CITATION] = citation
        else:
            raise TypeError

        if annotations:  # clean up annotations
            attr[ANNOTATIONS] = _clean_annotations(annotations)

        if subject_modifier:
            attr[SUBJECT] = subject_modifier

        if object_modifier:
            attr[OBJECT] = object_modifier

        return self._help_add_edge(u, v, attr)