docs: def _add_variant_gene_relationship(self, patient_var_map, gene_coordinate_map):
          """
          Right now it is unclear the best approach on how to connect
          variants to genes.  In most cases has_affected_locus/GENO:0000418
          is accurate; however, there are cases where a variant is in the intron
          on one gene and is purported to causally affect another gene down or
          upstream.  In these cases we must first disambiguate which gene
          is the affected locus, and which gene(s) are predicated to be
          causully influenced by (RO:0002566)
  
          UPDATE 8-30: In the latest dataset we no longer have 1-many mappings
          between variants and genes, but leaving this here in case we see
          these in the future
  
          The logic followed here is:
          if mutation type contains downstream/upstream and more than one
          gene of interest, investigate coordinates of all genes to
          see if we can disambiguate which genes are which
          :return: None
          """
          # genotype = Genotype(self.graph)
          dipper_util = DipperUtil()
          model = Model(self.graph)
          # Note this could be compressed in someway to remove one level of for looping
          for patient in patient_var_map:
              for variant_id, variant in patient_var_map[patient].items():
                  variant_bnode = self.make_id("{0}".format(variant_id), "_")
                  genes_of_interest = variant['genes_of_interest']
                  if len(genes_of_interest) == 1:
                      # Assume variant is variant allele of gene
                      gene = genes_of_interest[0]
                      gene_id = dipper_util.get_ncbi_id_from_symbol(gene)
                      self._add_gene_to_graph(
                          gene, variant_bnode, gene_id,
                          self.globaltt['has_affected_feature'])
  
                  elif re.search(r'upstream|downstream', variant['type'], flags=re.I):
                      # Attempt to disambiguate
                      ref_gene = []
                      up_down_gene = []
                      unmatched_genes = []
                      for gene in variant['genes_of_interest']:
                          if gene_id and gene_id != '' and gene_id in gene_coordinate_map:
                              if gene_coordinate_map[gene_id]['start'] \
                                      <= variant['position']\
                                      <= gene_coordinate_map[gene_id]['end']:
                                  gene_info = {
                                      'symbol': gene,
                                      'strand': gene_coordinate_map[gene_id]['strand']
                                  }
                                  ref_gene.append(gene_info)
                              else:
                                  up_down_gene.append(gene)
                          else:
                              unmatched_genes.append(gene)
                      if len(ref_gene) == 1:
                          self._add_gene_to_graph(
                              ref_gene[0]['symbol'], variant_bnode, gene_id,
                              self.globaltt['has_affected_feature'])
  
                          # update label with gene
                          gene_list = [ref_gene[0]['symbol']]  # build label expects list
                          variant_label = self._build_variant_label(
                              variant['build'], variant['chromosome'],
                              variant['position'], variant['reference_allele'],
                              variant['variant_allele'], gene_list)
                          model.addLabel(variant_bnode, variant_label)
  
                      # In some cases there are multiple instances
                      # of same gene from dupe rows in the source
                      # Credit http://stackoverflow.com/a/3844832
                      elif len(ref_gene) > 0 and ref_gene[1:] == ref_gene[:-1]:
                          self._add_gene_to_graph(
                              ref_gene[0]['symbol'], variant_bnode, gene_id,
                              self.globaltt['has_affected_feature'])
  
                          # build label function expects list
                          gene_list = [ref_gene[0]['symbol']]
                          variant_label = self._build_variant_label(
                              variant['build'], variant['chromosome'],
                              variant['position'], variant['reference_allele'],
                              variant['variant_allele'], gene_list)
                          model.addLabel(variant_bnode, variant_label)
  
                      # Check if reference genes are on different strands
                      elif len(ref_gene) == 2:
                          strands = [st['strand'] for st in ref_gene]
                          if "minus" in strands and "plus" in strands:
                              for r_gene in ref_gene:
                                  self._add_gene_to_graph(
                                      r_gene['symbol'], variant_bnode, gene_id,
                                      self.globaltt['has_affected_feature'])
                          else:
                              LOG.warning(
                                  "unable to map intron variant to gene coordinates: %s",
                                  variant)
                              for r_gene in ref_gene:
                                  self._add_gene_to_graph(
                                      r_gene['symbol'], variant_bnode, gene_id,
                                      self.globaltt['causally_influences'])
                      elif re.search(r'intron', variant['type'], flags=re.I):
                          LOG.warning(
                              "unable to map intron variant to gene coordinates_2: %s",
                              variant)
                      for neighbor in up_down_gene:
                          self._add_gene_to_graph(
                              neighbor, variant_bnode, gene_id,
                              self.globaltt['causally_influences'])
                      # Unmatched genes are likely because we cannot map to an NCBIGene
                      # or we do not have coordinate information
                      for unmatched_gene in unmatched_genes:
                          self._add_gene_to_graph(
                              unmatched_gene, variant_bnode, gene_id,
                              self.globaltt['causally_influences'])
  
          return