docs: def _get_edge_tuple(source,
                      target,
                      edge_data: EdgeData,
                      ) -> Tuple[str, str, str, Optional[str], Tuple[str, Optional[Tuple], Optional[Tuple]]]:
      """Convert an edge to a consistent tuple.
  
      :param BaseEntity source: The source BEL node
      :param BaseEntity target: The target BEL node
      :param edge_data: The edge's data dictionary
      :return: A tuple that can be hashed representing this edge. Makes no promises to its structure.
      """
      return (
          source.as_bel(),
          target.as_bel(),
          _get_citation_str(edge_data),
          edge_data.get(EVIDENCE),
          canonicalize_edge(edge_data),
      )