Ejemplo n.º 1
0
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)
Ejemplo n.º 3
0
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)
Ejemplo n.º 4
0
def neighbor_by_relation(ontology_graph: ontol.Ontology, term, relation):
    return ontology_graph.parents(term, relations=[relation])