root/SPARQLBuilderWWW2016/src/java/org/biohackathon/SPARQLBuilder/OWL/AcquiredStructureAnalyzer.java @ 267

リビジョン 267, 15.7 KB (コミッタ: atsuko, 9 年 前)

メタデータ仕様変更,フェデレートサーチ対応向け

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