docs: def _process_genes(self, limit=None):
          """
          This method processes the KEGG gene IDs.
          The label for the gene is pulled as
          the first symbol in the list of gene symbols;
          the rest are added as synonyms.
          The long-form of the gene name is added as a definition.
          This is hardcoded to just processes human genes.
  
          Triples created:
          <gene_id> is a SO:gene
          <gene_id> rdfs:label <gene_name>
  
          :param limit:
          :return:
  
          """
  
          LOG.info("Processing genes")
          if self.test_mode:
              graph = self.testgraph
          else:
              graph = self.graph
          model = Model(graph)
          line_counter = 0
          family = Family(graph)
          geno = Genotype(graph)
          raw = '/'.join((self.rawdir, self.files['hsa_genes']['file']))
          with open(raw, 'r', encoding="iso-8859-1") as csvfile:
              filereader = csv.reader(csvfile, delimiter='\t', quotechar='\"')
              for row in filereader:
                  line_counter += 1
                  (gene_id, gene_name) = row
  
                  gene_id = 'KEGG-'+gene_id.strip()
  
                  # the gene listing has a bunch of labels
                  # that are delimited, as:
                  # DST, BP240, BPA, BPAG1, CATX-15, CATX15, D6S1101, DMH, DT,
                  # EBSB2, HSAN6, MACF2; dystonin; K10382 dystonin
                  # it looks like the list is semicolon delimited
                  # (symbol, name, gene_class)
                  # where the symbol is a comma-delimited list
  
                  # here, we split them up.
                  # we will take the first abbreviation and make it the symbol
                  # then take the rest as synonyms
  
                  gene_stuff = re.split('r;', gene_name)
                  symbollist = re.split(r',', gene_stuff[0])
                  first_symbol = symbollist[0].strip()
  
                  if gene_id not in self.label_hash:
                      self.label_hash[gene_id] = first_symbol
  
                  if self.test_mode and gene_id not in self.test_ids['genes']:
                      continue
  
                  # Add the gene as a class.
                  geno.addGene(gene_id, first_symbol)
  
                  # add the long name as the description
                  if len(gene_stuff) > 1:
                      description = gene_stuff[1].strip()
                      model.addDefinition(gene_id, description)
  
                  # add the rest of the symbols as synonyms
                  for i in enumerate(symbollist, start=1):
                      model.addSynonym(gene_id, i[1].strip())
  
                  if len(gene_stuff) > 2:
                      ko_part = gene_stuff[2]
                      ko_match = re.search(r'K\d+', ko_part)
                      if ko_match is not None and len(ko_match.groups()) == 1:
                          ko = 'KEGG-ko:'+ko_match.group(1)
                          family.addMemberOf(gene_id, ko)
  
                  if not self.test_mode and limit is not None and line_counter > limit:
                      break
  
          LOG.info("Done with genes")
          return