def METHOD_NAME(self, concepts, limit=1000, require_time=False, ignore_meta=False):
    """Return all patients having all concepts
    Args:
        concepts: The concepts
        limit: The maximum number of results. Defaults to 1000.
        require_time: If set only concepts that have the timestamp property will be used.
    """
    q = "WITH [{}] AS cs ".format(",".join(["'{}'".format(c) for c in concepts]))
    if not require_time:
        q += '''MATCH (c:Concept)<-[:HAS '''
        if not ignore_meta:
            q += '''{metaPresence: 'True', metaSubject: 'Patient'}'''
        q += ''']-(:Document)<-[:HAS]-(pt:Patient)
        WHERE c.conceptId in cs
        WITH pt, size(cs) as inputCnt, count(DISTINCT c) as cnt
        WHERE cnt = inputCnt
        '''
    else:
        q += '''MATCH (c:Concept)<-[r:HAS {metaPresence: 'True', metaSubject:
        'Patient'}]-(:Document)<-[:HAS]-(pt:Patient) \n
        WHERE c.conceptId in cs AND exists(r.timestamp) \n
        WITH pt, size(cs) as inputCnt, count(DISTINCT c) as cnt \n
        WHERE cnt = inputCnt \n
        '''
    q += ' RETURN pt LIMIT {}'.format(limit)
    data = self.execute(q).data() # Do not like this too much 
    return [n['pt']['patientId'] for n in data], q