docs: def process_gene_interaction(self, limit):
          """
          The gene interaction file includes identified interactions,
          that are between two or more gene (products).
          In the case of interactions with >2 genes, this requires creating
          groups of genes that are involved in the interaction.
          From the wormbase help list: In the example WBInteraction000007779
          it would likely be misleading to suggest that lin-12 interacts with
          (suppresses in this case) smo-1 ALONE or that lin-12 suppresses let-60
          ALONE; the observation in the paper; see Table V in paper PMID:15990876
          was that a lin-12 allele (heterozygous lin-12(n941/+)) could suppress
          the "multivulva" phenotype induced synthetically by simultaneous
          perturbation of BOTH smo-1 (by RNAi) AND let-60 (by the n2021 allele).
          So this is necessarily a three-gene interaction.
  
          Therefore, we can create groups of genes based on their "status" of
          Effector | Effected.
  
          Status:  IN PROGRESS
  
          :param limit:
          :return:
  
          """
  
          raw = '/'.join((self.rawdir, self.files['gene_interaction']['file']))
  
          if self.test_mode:
              graph = self.testgraph
          else:
              graph = self.graph
          model = Model(graph)
          LOG.info("Processing gene interaction associations")
          line_counter = 0
  
          with gzip.open(raw, 'rb') as csvfile:
              filereader = csv.reader(
                  io.TextIOWrapper(csvfile, newline=""), delimiter='\t',
                  quotechar="'")
  
              for row in filereader:
                  line_counter += 1
                  if re.match(r'#', ''.join(row)):
                      continue
  
                  (interaction_num, interaction_type, interaction_subtype,
                   summary, citation) = row[0:5]
                  # print(row)
                  interaction_id = 'WormBase:'+interaction_num
  
                  # TODO deal with subtypes
                  interaction_type_id = None
                  if interaction_type == 'Genetic':
                      interaction_type_id = self.globaltt['genetically interacts with']
                  elif interaction_type == 'Physical':
                      interaction_type_id = self.globaltt['molecularly_interacts_with']
                  elif interaction_type == 'Regulatory':
                      interaction_type_id = self.globaltt['regulates']
                  else:
                      LOG.info(
                          "An interaction type I don't understand %s", interaction_type)
  
                  num_interactors = (len(row) - 5) / 3
                  if num_interactors != 2:
                      LOG.info(
                          "Skipping interactions with !=2 participants:\n %s",
                          str(row))
                      continue
  
                  gene_a_id = 'WormBase:'+row[5]
                  gene_b_id = 'WormBase:'+row[8]
  
                  if self.test_mode \
                          and gene_a_id not in self.test_ids['gene'] \
                          and gene_b_id not in self.test_ids['gene']:
                      continue
  
                  assoc = InteractionAssoc(
                      graph, self.name, gene_a_id, gene_b_id, interaction_type_id)
                  assoc.set_association_id(interaction_id)
                  assoc.add_association_to_graph()
                  assoc_id = assoc.get_association_id()
                  # citation is not a pmid or WBref - get this some other way
                  model.addDescription(assoc_id, summary)
  
                  if not self.test_mode and limit is not None and line_counter > limit:
                      break
  
          return