def get_all_paths_to_root(node_id: str, ontology: Ontology, min_distance_from_root: int = 0, relations: List[str] = None, nodeids_blacklist: List[str] = None, previous_path: Union[None, List[str]] = None, root_node=None) -> Set[Tuple[str]]: """get all possible paths connecting a go term to its root terms Args: node_id (str): a valid GO id for the starting term ontology (Ontology): the go ontology min_distance_from_root (int): return only terms at a specified minimum distance from root terms relations (List[str]): the list of relations to be used nodeids_blacklist (List[str]): a list of node ids to exclude from the paths previous_path (Union[None, List[str]]): the path to get to the current node Returns: Set[Tuple[str]]: the set of paths connecting the specified term to its root terms, each of which contains a sequence of terms ids """ if previous_path is None: previous_path = [] new_path = previous_path[:] if not nodeids_blacklist or node_id not in nodeids_blacklist: new_path.append(node_id) parents = [ parent for parent in ontology.parents(node=node_id, relations=relations) if ontology.node(parent)["depth"] >= min_distance_from_root ] parents_same_root = [] if root_node: for parent in parents: parent_root = None if "meta" in parent and "basicPropertyValues" in parent["meta"]: for basic_prop_val in parent["meta"]["basicPropertyValues"]: if basic_prop_val["pred"] == "OIO:hasOBONamespace": parent_root = basic_prop_val["val"] if parent_root and parent_root == root_node: parents_same_root.append(parent) parents = parents_same_root if len(parents) > 0: # go up the tree, following a depth first visit paths_to_return = set() for parent in parents: for path in get_all_paths_to_root( node_id=parent, ontology=ontology, previous_path=new_path, min_distance_from_root=min_distance_from_root, relations=relations, nodeids_blacklist=nodeids_blacklist, root_node=root_node): paths_to_return.add(path) return paths_to_return if len(new_path) == 0: return {(node_id, )} else: return {tuple(new_path)}
def _set_num_subsumers_in_subgraph(ontology: Ontology, root_id: str, relations: List[str] = None): if "num_subsumers" not in ontology.node(root_id): parents = set(ontology.parents(root_id)) parents.discard(root_id) parents = list(parents) if not parents or all( ["set_subsumers" in ontology.node(parent) for parent in parents]): subsumers = {subsumer for parent in parents for subsumer in ontology.node(parent)["set_subsumers"]} | \ {root_id} ontology.node(root_id)["num_subsumers"] = len(subsumers) ontology.node(root_id)["set_subsumers"] = subsumers for child_id in ontology.children(node=root_id): _set_num_subsumers_in_subgraph(ontology, child_id, relations)
def _set_num_subsumers_in_subgraph(ontology: Ontology, root_id: str, relations: List[str] = None): parents = ontology.parents(root_id) if len(parents) == 1: ontology.node(root_id)["num_subsumers"] = ontology.node( parents[0])["num_subsumers"] + 1 else: ontology.node(root_id)["num_subsumers"] = len( ontology.ancestors(node=root_id, relations=relations, reflexive=True)) for child_id in ontology.children(node=root_id, relations=relations): _set_num_subsumers_in_subgraph(ontology=ontology, root_id=child_id, relations=relations)
def neighbor_by_relation(ontology_graph: ontol.Ontology, term, relation): return ontology_graph.parents(term, relations=[relation])