    def get_ancestor_ephemeral_nodes(self, selected_nodes):
        node_names = {}
        for node_id in selected_nodes:
            if node_id not in self.manifest.nodes:
                continue
            node = self.manifest.nodes[node_id]
            # sources don't have ancestors and this results in a silly select()
            if node.resource_type == NodeType.Source:
                continue
            node_names[node_id] = node.name

        include_spec = [
            '+{}'.format(node_names[node])
            for node in selected_nodes if node in node_names
        ]
        if not include_spec:
            return set()

        all_ancestors = self.select_nodes(self.linker.graph, include_spec, [])

        res = []
        for ancestor in all_ancestors:
            ancestor_node = self.manifest.nodes.get(ancestor, None)

            if ancestor_node and self.is_ephemeral_model(ancestor_node):
                res.append(ancestor)

        return set(res)