root/BH13SPARQLBuilder/src/org/biohackathon/SPARQLBuilder/OWL/AcquiredStructureAnalyzer.java @ 128

リビジョン 128, 15.4 KB (コミッタ: nori, 10 年 前)

VOID対応版

  • 属性 svn:mime-type の設定値 text/plain
行番号 
1package org.biohackathon.SPARQLBuilder.OWL;
2
3import java.util.ArrayList;
4import java.util.HashMap;
5
6import jp.riken.accc.db.rdf.crawler.dataStructure.sparql.JenaModelGenerator;
7import jp.riken.accc.db.rdf.crawler.dataStructure.sparql.URICollection;
8
9import com.hp.hpl.jena.query.Query;
10import com.hp.hpl.jena.query.QueryExecution;
11import com.hp.hpl.jena.query.QueryExecutionFactory;
12import com.hp.hpl.jena.query.QueryFactory;
13import com.hp.hpl.jena.query.QuerySolution;
14import com.hp.hpl.jena.query.ResultSet;
15import com.hp.hpl.jena.rdf.model.Literal;
16import com.hp.hpl.jena.rdf.model.Model;
17import com.hp.hpl.jena.rdf.model.Property;
18import com.hp.hpl.jena.rdf.model.Resource;
19
20//public class OWLQueryBuilderForCrawlerImpl implements OWLQueryBuilder {
21public class AcquiredStructureAnalyzer implements RDFSchemaAnalyzer {
22
23        private Model model = null;
24        private String endpointURI = null;
25        private String[] graphURIs = null;
26
27        public String getEndpointURI(){
28                return endpointURI;
29        }
30
31        public String[] getGraphURIs(){
32                return graphURIs;
33        }
34       
35       
36        public static void main(String[] args) throws Exception{
37                JenaModelGenerator jmGene = new JenaModelGenerator("c:\\temp\\reactomeF18s.ttl");
38                AcquiredStructureAnalyzer impl
39                        = new AcquiredStructureAnalyzer(jmGene.getEndpointURI(), jmGene.getGraphURIs(), jmGene.getModel());
40//              System.out.println("--------------------------");
41//              SClass[] scs = impl.getOWLClasses(null, null, null, true);
42//              System.out.println("list classes:---------------");
43//              for(SClass sc: scs){
44//                      System.out.println(sc.toString());
45//              }
46//              System.out.println("--------------------------");
47               
48                ClassLink[] cls = impl.getNextClass(null,"http://www.biopax.org/release/biopax-level3.owl#Protein",100,true );
49                for(ClassLink cl: cls){
50                        System.out.println(cl.toString());
51                }
52                System.out.println("--------------------------");
53               
54        }
55       
56       
57        public AcquiredStructureAnalyzer(String endpointURI, String[] graphURIs, Model model){
58                this.model = model;
59                this.endpointURI = endpointURI;
60                this.graphURIs = graphURIs;
61        }
62
63        private String[] filterGraphURIs(String[] orgGraphURIs){
64                // TODO
65                return graphURIs;
66        }
67
68       
69        public SClass[] listClasses(String[] graphURIs, boolean countInstances) throws Exception{
70                return getOWLClasses(graphURIs, null, null, countInstances);
71        }
72               
73               
74
75       
76        public SClass[] getOWLClasses(String[] graphURIs, String[] keywords, String language, boolean countInstances) throws Exception{
77                String[] targetGraphURIs = filterGraphURIs(graphURIs);
78
79                StringBuffer queryStr = new StringBuffer();
80                queryStr.append("PREFIX owl: <http://www.w3.org/2002/07/owl#>\n");
81                queryStr.append("PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n");
82                queryStr.append("PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n");
83                queryStr.append("SELECT DISTINCT ?c ?pLabel ?entities\n");
84//              if (targetGraphURIs != null) {
85//                      for (String graphURI : targetGraphURIs) {
86//                              queryStr.append("FROM <");
87//                              queryStr.append(graphURI);
88//                              queryStr.append(">\n");
89//                      }
90//              }
91                queryStr.append("WHERE{\n");
92                queryStr.append(" ?cp <").append(URICollection.PROPERTY_VOID_CLASS).append("> ?c. \n");
93                queryStr.append(" ?cp <");
94                queryStr.append(URICollection.PROPERTY_VOID_ENTITIES);
95                queryStr.append("> ?entities. \n");
96                queryStr.append(" OPTIONAL{ ?c <");
97                queryStr.append(URICollection.PROPERTY_RDFS_LABEL);
98                queryStr.append("> ?pLabel. }\n");
99
100                if (keywords != null && keywords.length != 0) {
101
102                        queryStr.append(" ?c rdfs:label ");
103                        queryStr.append("?keywords").append(".\n");
104                        queryStr.append("  filter((LANG(?keywords) = \'").append(language);
105                        queryStr.append("\') && \n (");
106
107                        for (int i = 0; i < keywords.length; i++) {
108                                if (i > 0)
109                                        queryStr.append(" || \n ");
110
111                                queryStr.append("regex(str(").append("?keywords")
112                                                .append("),\"");
113                                queryStr.append(keywords[i]);
114                                queryStr.append("\", \"i\" )");
115
116                        }
117                        queryStr.append("))\n");
118
119                }
120                queryStr.append("}");
121                System.out.println(queryStr.toString());
122
123                Query query = QueryFactory.create(queryStr.toString());
124
125                QueryExecution qexec = null;
126                ResultSet results = null;
127                try {
128//                      long start = System.currentTimeMillis();
129                        qexec = QueryExecutionFactory.create(query, model);
130                        results = qexec.execSelect();
131//                      long end = System.currentTimeMillis();
132//                      System.out.println("EXEC TIME: " + (end - start));
133                } catch (Exception ex) {
134                        ex.printStackTrace();
135                        throw ex;
136                }
137
138                HashMap<String, SClass> classMap = new HashMap<String, SClass>();
139                for (; results.hasNext();) {
140                        QuerySolution sol = results.next();
141                        Resource res = sol.getResource("c");
142                        if (res != null && res.getURI() != null) {
143                                String uri = res.getURI();
144                                int numOfInstances = 0;
145                                if (countInstances) {
146                                        numOfInstances = sol.getLiteral("entities").getInt();
147                                } //
148                                Literal labelLiteral = sol.getLiteral("pLabel");
149                                SClass sClass = null;
150                                if (classMap.containsKey(uri)) {
151                                        sClass = classMap.get(uri);
152                                } else {
153                                        sClass = new SClass(uri, null, numOfInstances);
154                                        classMap.put(uri, sClass);
155                                }
156                                if (labelLiteral != null) {
157                                        String label = labelLiteral.getString();
158                                        String lang = labelLiteral.getLanguage();
159                                        sClass.addLabel(new Label(label, lang));
160                                }
161                        }
162                }
163                qexec.close();
164                return classMap.values().toArray(new SClass[0]);
165        }
166
167/*
168       
169        public Instance[] getInstances(String[] graphURIs, String keyword) throws Exception;
170*/
171
172
173        public ClassLink[] getNextClass(String[] graphURIs, String originClass, int limit, boolean countLinks) throws Exception{
174                String[] targetGraphURIs = filterGraphURIs(graphURIs);
175
176                StringBuffer queryStr = new StringBuffer();
177                queryStr.append("PREFIX owl: <http://www.w3.org/2002/07/owl#>\n");
178                queryStr.append("PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n");
179                queryStr.append("PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n");
180
181                // SELECT
182                queryStr.append("SELECT DISTINCT ?indPropCat ?c ?dat ?d ?p ?numLnkInsStart ?numLnkInsEnd ?numInsDom ?numInsRan ?numTriples\n");
183
184//              if (targetGraphURIs != null) {
185//                      for (String graphURI : targetGraphURIs) {
186//                              queryStr.append("FROM <");
187//                              queryStr.append(graphURI);
188//                              queryStr.append(">\n");
189//                      }
190//              }
191
192                queryStr.append("WHERE{\n");
193                queryStr.append(" ?cr <").append(URICollection.PROPERTY_RDF_TYPE).append("> <").append(URICollection.RESOURCE_SB_CLASS_RELATION).append(">. \n");
194                queryStr.append(" ?propPart <").append(URICollection.PROPERTY_SB_CLASS_RELATION).append("> ?cr. \n");
195                queryStr.append(" ?propPart <").append(URICollection.PROPERTY_VOID_PROPERTY).append("> ?p. \n");
196               
197                queryStr.append(" {");
198                queryStr.append(" ?cr <").append(URICollection.PROPERTY_SB_SUBJECT_CLASS).append("> <" + originClass + ">. \n");
199                queryStr.append(" ?cr <").append(URICollection.PROPERTY_SB_OBJECT_CLASS).append("> ?d. \n");
200                queryStr.append(" ?cr <").append(URICollection.PROPERTY_VOID_DISTINCT_SUBJECTS).append("> ?numLnkInsStart. \n");
201                queryStr.append(" ?cr <").append(URICollection.PROPERTY_VOID_DISTINCT_OBJECTS).append("> ?numLnkInsEnd. \n");
202                queryStr.append(" ?cr <").append(URICollection.PROPERTY_VOID_TRIPLES).append("> ?numTriples. \n");
203//              queryStr.append(" ?cr <http://sparqlbuilder.org/startClassLimitedQ> ?isStartClsLim. \n");
204//              queryStr.append(" ?cr <http://sparqlbuilder.org/endClassLimitedQ> ?isEndClsLim. \n");
205                queryStr.append("}\n");
206                queryStr.append(" UNION\n");
207                queryStr.append(" {");
208                queryStr.append(" ?cr <").append(URICollection.PROPERTY_SB_SUBJECT_CLASS).append("> <" + originClass + ">. \n");
209                queryStr.append(" ?cr <").append(URICollection.PROPERTY_SB_OBJECT_DATATYPE).append("> ?dat. \n");
210                queryStr.append(" ?cr <").append(URICollection.PROPERTY_VOID_DISTINCT_SUBJECTS).append("> ?numLnkInsStart. \n");
211                queryStr.append(" ?cr <").append(URICollection.PROPERTY_VOID_DISTINCT_OBJECTS).append("> ?numLnkInsEnd. \n");
212                queryStr.append(" ?cr <").append(URICollection.PROPERTY_VOID_TRIPLES).append("> ?numTriples. \n");
213//              queryStr.append(" ?cr <http://sparqlbuilder.org/startClassLimitedQ> ?isStartClsLim. \n");
214//              queryStr.append(" ?cr <http://sparqlbuilder.org/endClassLimitedQ> ?isEndClsLim. \n");
215                queryStr.append("}\n");
216                queryStr.append(" UNION\n");
217                queryStr.append(" {");
218                queryStr.append(" ?cr <").append(URICollection.PROPERTY_SB_OBJECT_CLASS).append("> <" + originClass + ">. \n");
219                queryStr.append(" ?cr <").append(URICollection.PROPERTY_SB_SUBJECT_CLASS).append("> ?d. \n");
220                queryStr.append(" ?cr <").append(URICollection.PROPERTY_VOID_DISTINCT_SUBJECTS).append("> ?numLnkInsEnd. \n");
221                queryStr.append(" ?cr <").append(URICollection.PROPERTY_VOID_DISTINCT_OBJECTS).append("> ?numLnkInsStart. \n");
222                queryStr.append(" ?cr <").append(URICollection.PROPERTY_VOID_TRIPLES).append("> ?numTriples. \n");
223//              queryStr.append(" ?cr <http://sparqlbuilder.org/startClassLimitedQ> ?isEndClsLim. \n");
224//              queryStr.append(" ?cr <http://sparqlbuilder.org/endClassLimitedQ> ?isStartClsLim. \n");
225                queryStr.append("}\n");
226               
227//              queryStr.append(" ?propPart <").append(URICollection.PROPERTY_RDF_TYPE).append("> <").append(URICollection.PROPERTY_VOID_PROPERTY_PARTITION).append(">. \n");
228                queryStr.append(" ?propPart <").append(URICollection.PROPERTY_SB_PROPERTY_CATEGORY).append("> ?indPropCat. \n");
229
230                queryStr.append(" ?propPart <").append(URICollection.PROPERTY_VOID_DISTINCT_SUBJECTS).append("> ?numInsDom. \n");
231                queryStr.append(" ?propPart <").append(URICollection.PROPERTY_VOID_DISTINCT_OBJECTS).append("> ?numInsRan. \n");
232       
233                queryStr.append("}\n");
234               
235       
236                if (limit > 0) {
237                        queryStr.append("limit ");
238                        queryStr.append(limit);
239                        queryStr.append("\n");
240                }
241
242//              System.out.println("getNextClasses SPARQL Query: ");
243//              System.out.println(queryStr.toString());
244
245                Query query = QueryFactory.create(queryStr.toString());
246                QueryExecution qexec = null;
247                ResultSet results = null;
248                try {
249                        long start = System.currentTimeMillis();
250                        qexec = QueryExecutionFactory.create(query, model);
251                        results = qexec.execSelect();
252                        long end = System.currentTimeMillis();
253                        System.out.println("EXEC TIME: " + (end - start));
254                } catch (Exception ex) {
255                        ex.printStackTrace();
256                        throw ex;
257                }
258
259                ArrayList<ClassLink> solCLs = new ArrayList<ClassLink>();
260                for (; results.hasNext();) {
261                        QuerySolution sol = results.next();
262                        Resource pro = sol.getResource("p");
263                        String clsURI = null;
264                        String datURI = null;
265                        if (pro != null) {
266                                int indPropCat = 4;
267                                Literal indPropCatLit = sol.getLiteral("indPropCat");
268                                if( indPropCatLit != null ){
269                                        indPropCat = indPropCatLit.getInt();
270                                }
271                                if( indPropCat < 4 ) {
272                                String proURI = pro.getURI();
273                                Resource ccls = sol.getResource("c");
274                                Resource dcls = sol.getResource("d");
275                                Resource dat = sol.getResource("dat");
276                                Direction direction = null;
277                                if(ccls != null && dcls == null ){
278                                        // direction forward
279                                        direction = Direction.forward;
280                                        clsURI = ccls.getURI();
281                                }else{
282                                        if( ccls == null && dcls != null ){
283                                                direction = Direction.reverse;
284                                                clsURI = dcls.getURI();
285                                        }else{
286                                                if( ccls == null && dat != null && dcls == null ){
287                                                        clsURI = null;
288                                                        direction = Direction.forward;
289                                                        datURI = dat.getURI();
290                                                }
291                                        }
292                                }
293                               
294                               
295                                int numTriples = 0;
296                                Literal numTriplesLit = sol.getLiteral("numTriples");
297                                if( numTriplesLit != null ){
298                                        numTriples = numTriplesLit.getInt();
299                                }
300
301                                int numLnkInsStart = 0;
302                                Literal numInsStartLit = sol.getLiteral("numLnkInsStart");
303                                if( numInsStartLit != null ){
304                                        numLnkInsStart = numInsStartLit.getInt();
305                                }
306                                int numLnkInsEnd = 0;
307                                Literal numInsEndLit = sol.getLiteral("numLnkInsEnd");
308                                if( numInsEndLit != null ){
309                                        numLnkInsEnd = numInsEndLit.getInt();
310                                }
311
312                                int numInsDom = 0;
313                                Literal numInsDomLit = sol.getLiteral("numInsDom");
314                                if( numInsDomLit != null ){
315                                        numInsDom = numInsDomLit.getInt();
316                                }
317                                int numInsRan = 0;
318                                Literal numInsRanLit = sol.getLiteral("numInsRan");
319                                if( numInsRanLit != null ){
320                                        numInsRan = numInsRanLit.getInt();
321                                }
322
323                                boolean isStartClsLim = false;
324                                Literal isStartClsLimLit = sol.getLiteral("isStartClsLim");
325                                if( isStartClsLimLit != null ){
326                                        isStartClsLim = isStartClsLimLit.getBoolean();
327                                }
328                                boolean isEndClsLim = false;
329                                Literal isEndClsLimLit = sol.getLiteral("isEndClsLim");
330                                if( isEndClsLimLit != null ){
331                                        isEndClsLim = isEndClsLimLit.getBoolean();
332                                }
333                               
334                                ClassLink cl = new ClassLink(proURI, clsURI, datURI, direction,
335                                                numTriples, numInsDom, numInsRan,  numLnkInsStart, numLnkInsEnd, isStartClsLim, isEndClsLim);
336                                solCLs.add(cl);
337
338                                }
339                        }
340                }
341                qexec.close(); 
342                return solCLs.toArray(new ClassLink[0]);
343        }
344
345       
346       
347        /*
348
349        public ClassLink[] getNextClassViaInstanceLink(String[] graphURIs, String originClass, int limit) throws Exception;
350
351        public Path[] getPaths(String startClass, String endClass, int mode, boolean countLinks) throws Exception;
352
353        public String createSPARQL(Path path) throws Exception;
354
355 InstanceLink[] getNextInstancesViaInstanceLink(String[] graphURIs, String originInstance,
356                        int limit) throws Exception;
357*/
358
359        public LabelMap[] getLabels(String[] graphURIs, String[] resourceURIs,
360                        String language) throws Exception {
361                if (resourceURIs == null || resourceURIs.length == 0) {
362                        return new LabelMap[0];
363                }
364                StringBuffer queryStr = new StringBuffer();
365                queryStr.append("PREFIX owl: <http://www.w3.org/2002/07/owl#>\n");
366                queryStr.append("PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n");
367                queryStr.append("PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n");
368                queryStr.append("SELECT DISTINCT ?res ?label \n");
369                if (graphURIs != null) {
370                        for (String graphURI : graphURIs) {
371                                queryStr.append("FROM <");
372                                queryStr.append(graphURI);
373                                queryStr.append(">\n");
374                        }
375                }
376                queryStr.append("WHERE{\n");
377                queryStr.append("  ?res rdfs:label ?label.\n");
378                queryStr.append("  FILTER(?res IN (");
379                boolean f = false;
380                for (String resourceURI : resourceURIs) {
381                        if (f) {
382                                queryStr.append(", ");
383                        }
384                        f = true;
385                        queryStr.append("<");
386                        queryStr.append(resourceURI);
387                        queryStr.append(">");
388                }
389                queryStr.append("))\n");
390                queryStr.append("}");
391
392//              System.out.println(queryStr.toString());
393
394                Query query = QueryFactory.create(queryStr.toString());
395                QueryExecution qexec = QueryExecutionFactory.create(query, model);
396               
397                ResultSet results = qexec.execSelect();
398                HashMap<String, LabelMap> lMap = new HashMap<String, LabelMap>();
399                for (; results.hasNext();) {
400                        QuerySolution sol = results.next();
401                        String uri = sol.getResource("res").getURI();
402                        Literal literal = sol.getLiteral("label");
403                        if (literal != null) {
404                                String label = literal.getString();
405                                String lang = literal.getLanguage();
406                                if (language != null && language.equals(lang)) {
407                                        Label lbl = new Label(label, lang);
408                                        if (lMap.containsKey(uri)) {
409                                                LabelMap lm = lMap.get(uri);
410                                                lm.addLabel(lbl);
411                                        } else {
412                                                LabelMap lm = new LabelMap(uri, new Label[] { lbl });
413                                                lMap.put(uri, lm);
414                                        }
415                                }
416                        }
417                }
418                return lMap.values().toArray(new LabelMap[0]);
419        }
420
421/*
422        public ClassLink[] countLinks(String[] graphURIs, String startClassURI, ClassLink[] classLinks) throws Exception;
423        public SClass[] countInstances(String[] graphURIs, SClass[] classes) throws Exception;
424       
425*/
426
427}
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。