# owlents: using OWL directly in ontoProc

# Introduction

In Bioconductor 3.19, ontoProc can work with OWL RDF/XML serializations of ontologies, via the owlready2 python modules.

The `owl2cache` function retrieves OWL from a URL or file and places it in a cache to avoid repetitious retrievals. The default cache is the one defined by `BiocFileCache::BiocFileCache()`. Here we work with the cell ontology. `setup_entities2` will use basilisk to acquire owlready2 python modules that parse the OWL and produce an `ontology_index` instance (defined in CRAN package ontologyIndex).

    library(ontoProc)
    clont_path = owl2cache(url="http://purl.obolibrary.org/obo/cl.owl")
    # following fixup needed 10 august 2025
    tmp = readLines(clont_path)
    bad = grep("STATO_0000416", tmp)[1:2]  # see https://github.com/obophenotype/cell-ontology/issues/3237
    tmp = tmp[-bad]
    bad = grep("STATO_0000663", tmp)[1:2]  # see https://github.com/obophenotype/cell-ontology/issues/3237
    tmp = tmp[-bad]
    tf = tempfile()
    writeLines(tmp, tf)
    cle = setup_entities2(tf)
    cle

    ## Ontology with 19340 terms
    ##
    ## Properties:
    ##  id: character
    ##  name: character
    ##  parents: list
    ##  children: list
    ##  ancestors: list
    ##  obsolete: logical
    ## Roots:
    ##  BFO_0000002 - continuant
    ##  SO_0000704 - NA
    ##  BFO_0000003 - occurrent
    ##  SO_0001260 - sequence_collection
    ##  UBERON_0000464 - NA
    ##  UBERON_0000479 - NA
    ##  CL_0000000 - cell
    ##  UBERON_0000061 - NA
    ##  UBERON_0000481 - NA
    ##  UBERON_0000475 - NA
    ##  ... 421 more

The usual plotting approach works.

    sel = c("CL_0000492", "CL_0001054", "CL_0000236",
    "CL_0000625", "CL_0000576",
    "CL_0000623", "CL_0000451", "CL_0000556")
    onto_plot2(cle, sel)

# Illustration with Human Phenotype ontology

We’ll obtain and ad hoc selection of 15 UBERON term names and visualize the hierarchy.

    hpont_path = owl2cache(url="http://purl.obolibrary.org/obo/hp.owl")

    hpents = setup_entities2(hpont_path)
    kp = grep("UBER", names(hpents$name), value=TRUE)[21:30]
    onto_plot2(hpents, kp)

The prefixes of class names in the ontology give a sense of its scope.

    t(t(table(sapply(strsplit(names(hpents$name), "_"), "[", 1))))

    ##
    ##          [,1]
    ##   CHEBI   1853
    ##   CL      1192
    ##   GO      2523
    ##   HP     19944
    ##   HsapDv    16
    ##   MPATH     75
    ##   NBO       64
    ##   PATO     570
    ##   PR       206
    ##   RO         1
    ##   UBERON  5641

To characterize human phenotypes ontologically, CL, GO, CHEBI, and UBERON play significant roles.