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

Last change on this file since 1013 was 1013, checked in by business@…, 10 years ago

changed Ontology ncboId to unique, extended range of fulltext query

  • Property svn:keywords set to Author Date Rev
File size: 4.7 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: 1013 $
11 * $Author: business@keesvanbochove.nl $
12 * $Date: 2010-10-28 18:05:27 +0000 (do, 28 okt 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        static constraints = {
23                ncboId(unique: true)     // For now, we just want one version of each NCBO ontology in the database
24        }       
25
26        /**
27         * Find child terms
28         * @return A set containing all terms that reside under this ontology
29         */
30        Set<Term> giveTerms() {
31                Term.findAllByOntology(this)
32        }
33
34        Object giveTermByName(String name) {
35                giveTerms().find {
36                        it.name == name
37                }
38
39                /* TODO: find out why the following doesn't work (probably more efficient):
40                Term.find {
41                        it.name == name
42                        it.ontology == this
43                }
44                }*/
45        }
46
47        static Ontology getBioPortalOntology(int ncboId) {
48                getBioPortalOntology(ncboId as String)
49        }
50        static Ontology getBioPortalOntology(String ncboId) {
51                // Get ontology from BioPortal via Ontocat
52                // TODO: maybe make a static OntologyService instance to be more efficient, and decorate it with caching?
53                uk.ac.ebi.ontocat.OntologyService os = new uk.ac.ebi.ontocat.bioportal.BioportalOntologyService()
54                uk.ac.ebi.ontocat.Ontology o = os.getOntology(ncboId)
55
56                // Instantiate and return Ontology object
57                new dbnp.data.Ontology(
58                        name: o.label,
59                        description: o.description,
60                        url: o.properties['homepage'] ?: "http://bioportal.bioontology.org/ontologies/${o.id}",
61                        versionNumber: o.versionNumber,
62                        ncboId: o.ontologyAccession,
63                        ncboVersionedId: o.id
64                );
65        }
66
67
68        /**
69         * Return the Ontology by ncboId, or create it if nonexistent.
70         * @param ncboId
71         * @return Ontology
72         */
73        static Ontology getOrCreateOntologyByNcboId( String ncboId ) {
74                return getOrCreateOntologyByNcboId( ncboId as int )
75        }
76        static Ontology getOrCreateOntologyByNcboId( int ncboId ) {
77                println "find ${ncboId} in ${list()*.ncboId}"
78                def ontology = findByNcboId( ncboId as String )
79
80                // got an ontology?
81                if (!ontology) {
82                        // no, fetch it from the webservice
83                        ontology = getBioPortalOntology( ncboId )
84
85                        if (ontology && ontology.validate() && ontology.save(flush:true)) {
86                                ontology.refresh()
87                        }
88                }
89
90                return ontology
91        }
92
93        static Ontology getBioPortalOntologyByTerm(String termId) {
94                // Get ontology from BioPortal via Ontocat
95                // TODO: maybe make a static OntologyService instance to be more efficient, and decorate it with caching?
96                uk.ac.ebi.ontocat.OntologyService os = new uk.ac.ebi.ontocat.bioportal.BioportalOntologyService()
97                uk.ac.ebi.ontocat.OntologyTerm term = os.getTerm( termId );
98                println( term );
99                uk.ac.ebi.ontocat.Ontology o = os.getOntology( term.getOntologyAccession() );
100                println( o );
101
102                // Instantiate and return Ontology object
103                new dbnp.data.Ontology(
104                        name: o.label,
105                        description: o.description,
106                        url: o.properties['homepage'] ?: "http://bioportal.bioontology.org/ontologies/${o.id}",
107                        versionNumber: o.versionNumber,
108                        ncboId: o.ontologyAccession,
109                        ncboVersionedId: o.id
110                );
111        }
112
113        /**
114         * Instantiate Ontotology class by searching the web service for (versioned)id.
115         * @param       ontologyId (bioportal versionedId)
116         * @return      ontology instance
117         */
118        static Ontology getBioPortalOntologyByVersionedId(String ncboVersionedId) {
119                try {
120                        // use the NCBO REST service to fetch ontology information
121                        def url = "http://rest.bioontology.org/bioportal/ontologies/" + ncboVersionedId
122                        def xml = new URL(url).getText()
123                        def data = new XmlParser().parseText(xml)
124                        def bean = data.data.ontologyBean
125
126                        // instantiate Ontology with the proper values
127                        def ontology = new dbnp.data.Ontology(
128                                name: bean.displayLabel.text(),
129                                description: bean.description.text(),
130                                url: bean.homepage.text(),
131                                versionNumber: bean.versionNumber.text(),
132                                ncboId: bean.ontologyId.text() as int,
133                                ncboVersionedId: bean.id.text() as int
134                        )
135
136                        // validate ontology
137                        if (ontology.validate()) {
138                                // proper instance
139                                return ontology
140                        } else {
141                                // it does not validate
142                                println ".encountered errors instantiating Ontology by versionedId [" + ncboVersionedId + "] :"
143                                ontology.errors.each() {
144                                        println "  -" + it
145                                }
146                                throw new Exception("instantiating Ontology by (versioned) id [" + ncboVersionedId + "] failed")
147                        }
148                } catch (Exception e) {
149                        // whoops?!
150                        return false
151                }
152        }
153}
Note: See TracBrowser for help on using the repository browser.