source: trunk/grails-app/domain/dbnp/data/Ontology.groovy @ 569

Last change on this file since 569 was 569, checked in by duh, 13 years ago
  • commit related to bug # 107

-- extended Ontology domain class with a getOrCreateOntologyByNcboId(...) method which can be used as a replacement for findByNcboId(...). This method now returns the Ontology if it exists, or creates it (by using the bioportal webservices) on the fly.
-- changed the runtime bootstrap 'hack' to use getOrCreateOntologyByNcboId(...) instead
-- removed the ontology create code from the TemplateEditor? (added in #567)

  • Property svn:keywords set to Date Rev Author
File size: 4.5 KB
Line 
1package dbnp.data
2
3/**
4 * This class describes an existing ontology, of which terms can be stored (actually 'cached' would be a better description)
5 * in the (global) Term store.
6 * This information is mapped from the BioPortal NCBO REST service, e.g.: http://rest.bioontology.org/bioportal/ontologies/38802
7 * @see http://www.bioontology.org/wiki/index.php/NCBO_REST_services
8 *
9 * Revision information:
10 * $Rev: 569 $
11 * $Author: duh $
12 * $Date: 2010-06-16 12:57:34 +0000 (wo, 16 jun 2010) $
13 */
14class Ontology implements Serializable {
15        String name             // BioPortal: displayLabel
16        String description      // BioPortal: description
17        String url              // BioPortal: homepage
18        String versionNumber    // BioPortal: versionNumber
19        int ncboId              // BioPortal: ontologyId
20        int ncboVersionedId     // BioPortal: id
21
22        /**
23         * Find child terms
24         * @return A set containing all terms that reside under this ontology
25         */
26        Set<Term> giveTerms() {
27                Term.findAllByOntology(this)
28        }
29
30        Object giveTermByName(String name) {
31                giveTerms().find {
32                        it.name == name
33                }
34
35                /* TODO: find out why the following doesn't work (probably more efficient):
36                Term.find {
37                        it.name == name
38                        it.ontology == this
39                }
40                }*/
41        }
42
43        static Ontology getBioPortalOntology(String ncboId) {
44                // Get ontology from BioPortal via Ontocat
45                // TODO: maybe make a static OntologyService instance to be more efficient, and decorate it with caching?
46                uk.ac.ebi.ontocat.OntologyService os = new uk.ac.ebi.ontocat.bioportal.BioportalOntologyService()
47                uk.ac.ebi.ontocat.Ontology o = os.getOntology(ncboId)
48
49                // Instantiate and return Ontology object
50                new dbnp.data.Ontology(
51                        name: o.label,
52                        description: o.description,
53                        url: o.properties['homepage'] ?: "http://bioportal.bioontology.org/ontologies/${o.id}",
54                        versionNumber: o.versionNumber,
55                        ncboId: o.ontologyAccession,
56                        ncboVersionedId: o.id
57                );
58        }
59
60
61        /**
62         * Return the Ontology by ncboId, or create it if nonexistent.
63         * @param ncboId
64         * @return Ontology
65         */
66        static Ontology getOrCreateOntologyByNcboId( Integer ncboId ) {
67                return getOrCreateOntologyByNcboId( ncboId as String )
68        }
69        static Ontology getOrCreateOntologyByNcboId( String ncboId ) {
70                def ontology = findByNcboId( ncboId )
71
72                // got an ontology?
73                if (!ontology) {
74                        // no, fetch it from the webservice
75                        ontology = getBioPortalOntology( ncboId )
76
77                        if (ontology && ontology.validate() && ontology.save(flush:true)) {
78                                ontology.refresh()
79                        }
80                }
81
82                return ontology
83        }
84
85        static Ontology getBioPortalOntologyByTerm(String termId) {
86                // Get ontology from BioPortal via Ontocat
87                // TODO: maybe make a static OntologyService instance to be more efficient, and decorate it with caching?
88                uk.ac.ebi.ontocat.OntologyService os = new uk.ac.ebi.ontocat.bioportal.BioportalOntologyService()
89                uk.ac.ebi.ontocat.OntologyTerm term = os.getTerm( termId );
90                println( term );
91                uk.ac.ebi.ontocat.Ontology o = os.getOntology( term.getOntologyAccession() );
92                println( o );
93
94                // Instantiate and return Ontology object
95                new dbnp.data.Ontology(
96                        name: o.label,
97                        description: o.description,
98                        url: o.properties['homepage'] ?: "http://bioportal.bioontology.org/ontologies/${o.id}",
99                        versionNumber: o.versionNumber,
100                        ncboId: o.ontologyAccession,
101                        ncboVersionedId: o.id
102                );
103        }
104
105        /**
106         * Instantiate Ontotology class by searching the web service for (versioned)id.
107         * @param       ontologyId (bioportal versionedId)
108         * @return      ontology instance
109         */
110        static Ontology getBioPortalOntologyByVersionedId(String ncboVersionedId) {
111                try {
112                        // use the NCBO REST service to fetch ontology information
113                        def url = "http://rest.bioontology.org/bioportal/ontologies/" + ncboVersionedId
114                        def xml = new URL(url).getText()
115                        def data = new XmlParser().parseText(xml)
116                        def bean = data.data.ontologyBean
117
118                        // instantiate Ontology with the proper values
119                        def ontology = new dbnp.data.Ontology(
120                                name: bean.displayLabel.text(),
121                                description: bean.description.text(),
122                                url: bean.homepage.text(),
123                                versionNumber: bean.versionNumber.text(),
124                                ncboId: bean.ontologyId.text() as int,
125                                ncboVersionedId: bean.id.text() as int
126                        )
127
128                        // validate ontology
129                        if (ontology.validate()) {
130                                // proper instance
131                                return ontology
132                        } else {
133                                // it does not validate
134                                println ".encountered errors instantiating Ontology by versionedId [" + ncboVersionedId + "] :"
135                                ontology.errors.each() {
136                                        println "  -" + it
137                                }
138                                throw new Exception("instantiating Ontology by (versioned) id [" + ncboVersionedId + "] failed")
139                        }
140                } catch (Exception e) {
141                        // whoops?!
142                        return false
143                }
144        }
145}
Note: See TracBrowser for help on using the repository browser.