docs: def meta_select(self, predicate=None, semiJoinDataset=None, semiJoinMeta=None):
          """
          *Wrapper of* ``SELECT``
  
          Wrapper of the :meth:`~.select` function filtering samples only based on metadata.
  
          :param predicate: logical predicate on the values of the rows
          :param semiJoinDataset: an other GMQLDataset 
          :param semiJoinMeta: a list of metadata
          :return: a new GMQLDataset
  
          
          Example 1::
          
              output_dataset = dataset.meta_select(dataset['patient_age'] < 70)
              # This statement can be written also as
              output_dataset = dataset[ dataset['patient_age'] < 70 ]
  
          Example 2::
  
              output_dataset = dataset.meta_select( (dataset['tissue_status'] == 'tumoral') &
                                                  (tumor_tag != 'gbm') | (tumor_tag == 'brca'))
              # This statement can be written also as
              output_dataset = dataset[ (dataset['tissue_status'] == 'tumoral') &
                                      (tumor_tag != 'gbm') | (tumor_tag == 'brca') ]
  
          Example 3::
  
              JUN_POLR2A_TF = HG19_ENCODE_NARROW.meta_select( JUN_POLR2A_TF['antibody_target'] == 'JUN',
                                                              semiJoinDataset=POLR2A_TF, semiJoinMeta=['cell'])
  
          The meta selection predicate can use all the classical equalities and disequalities
          {>, <, >=, <=, ==, !=} and predicates can be connected by the classical logical symbols
          {& (AND), | (OR), ~ (NOT)} plus the *isin* function.
  
          """
  
          return self.select(meta_predicate=predicate, semiJoinDataset=semiJoinDataset, semiJoinMeta=semiJoinMeta)