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)