docs: def from_jgif(graph_jgif_dict):
      """Build a BEL graph from a JGIF JSON object.
  
      :param dict graph_jgif_dict: The JSON object representing the graph in JGIF format
      :rtype: BELGraph
      """
      graph = BELGraph()
  
      root = graph_jgif_dict['graph']
  
      if 'label' in root:
          graph.name = root['label']
  
      if 'metadata' in root:
          metadata = root['metadata']
  
          for key in METADATA_INSERT_KEYS:
              if key in metadata:
                  graph.document[key] = metadata[key]
  
      parser = BELParser(graph)
      parser.bel_term.addParseAction(parser.handle_term)
  
      for node in root['nodes']:
          node_label = node.get('label')
  
          if node_label is None:
              log.warning('node missing label: %s', node)
              continue
  
          try:
              parser.bel_term.parseString(node_label)
          except NakedNameWarning as e:
              log.info('Naked name: %s', e)
          except ParseException:
              log.info('Parse exception for %s', node_label)
  
      for i, edge in enumerate(root['edges']):
          relation = edge.get('relation')
          if relation is None:
              log.warning('no relation for edge: %s', edge)
  
          if relation in {'actsIn', 'translocates'}:
              continue  # don't need legacy BEL format
  
          edge_metadata = edge.get('metadata')
          if edge_metadata is None:
              log.warning('no metadata for edge: %s', edge)
              continue
  
          bel_statement = edge.get('label')
          if bel_statement is None:
              log.debug('No BEL statement for edge %s', edge)
  
          evidences = edge_metadata.get('evidences')
  
          if relation in UNQUALIFIED_EDGES:
              pass  # FIXME?
  
          else:
              if not evidences:  # is none or is empty list
                  log.debug('No evidence for edge %s', edge)
                  continue
  
              for evidence in evidences:
                  citation = evidence.get('citation')
  
                  if not citation:
                      continue
  
                  if 'type' not in citation or 'id' not in citation:
                      continue
  
                  summary_text = evidence['summary_text'].strip()
  
                  if not summary_text or summary_text == placeholder_evidence:
                      continue
  
                  parser.control_parser.clear()
                  parser.control_parser.citation = reformat_citation(citation)
                  parser.control_parser.evidence = summary_text
                  parser.control_parser.annotations.update(evidence[EXPERIMENT_CONTEXT])
  
                  try:
                      parser.parseString(bel_statement, line_number=i)
                  except Exception as e:
                      log.warning('JGIF relation parse error: %s for %s', e, bel_statement)
  
      return graph