def tree(self, path):
        ret = {}
        try:
            items = self.read(path)
        except (etcd.EtcdKeyNotFound, ValueError):
            return None
        except etcd.EtcdConnectionFailed:
            log.error("etcd: failed to perform 'tree' operation on path {0} due to connection error".format(path))
            return None

        for item in items.children:
            comps = str(item.key).split('/')
            if item.dir is True:
                if item.key == path:
                    continue
                ret[comps[-1]] = self.tree(item.key)
            else:
                ret[comps[-1]] = item.value
        return ret
overall strategy: deal with jp (and all jp-related elements) first, and
dataset/ETHPy150Open saltstack/salt/salt/utils/etcd_util.py/EtcdClient.tree--crossover with--dataset/ETHPy150Open pycantonese/pycantonese/pycantonese/search.py/perform_search