'Returns a list of concepts that are descendants of the given concept, using "is-a" relations.
Creates a subgraph of "is-a" related concepts up to the given depth,
then takes the fringe (i.e., leaves) of the subgraph.'

def taxonomy(self, concept, depth=3, fringe=2):

    def traversable(node, edge):
        return ((edge.node2 == node) and (edge.type == 'is-a'))
    if (not isinstance(concept, Node)):
        concept = self[concept]
    g = self.copy(nodes=concept.flatten(depth, traversable))
    g = g.fringe(depth=fringe)
    g = [self[n.id] for n in g if (n != concept)]
    return g
