root/BH13SPARQLBuilder/src/org/biohackathon/SPARQLBuilder/OWL/OWLQueryBuilderImpl.java @ 19

リビジョン 19, 21.7 KB (コミッタ: nori, 11 年 前)

試験のために、getNextClassesのSPARQLクエリを簡素なものに一時変更、
TODO: オプション設定できるようにする

  • 属性 svn:mime-type の設定値 text/plain
Rev行番号 
[2]1package org.biohackathon.SPARQLBuilder.OWL;
2
3import java.util.ArrayList;
4import java.util.Collection;
5import java.util.HashMap;
6import java.util.HashSet;
7import java.util.Set;
8
9
10import com.hp.hpl.jena.query.Query;
11import com.hp.hpl.jena.query.QueryExecution;
12import com.hp.hpl.jena.query.QueryExecutionFactory;
13import com.hp.hpl.jena.query.QueryFactory;
14import com.hp.hpl.jena.query.QuerySolution;
15import com.hp.hpl.jena.query.ResultSet;
[10]16import com.hp.hpl.jena.rdf.model.Literal;
[2]17import com.hp.hpl.jena.rdf.model.Resource;
[5]18
[2]19/**
20 * 繧ッ繧ィ繝ェ繧堤函謌舌☆繧九◆繧√�讖溯�繧呈署萓帙☆繧区ク繧ッ繝ゥ繧ケ
21 * @author Norio KOBAYASHI
22 * @since 28.01.2014
23 * @version 29.01.2014
24 */
25public class OWLQueryBuilderImpl implements OWLQueryBuilder {
26
27        // private Model model = null;
28        private String endpointURI = null;
29
30       
31        /**
32         * 繧「繧ッ繧サ繧ケ縺吶kSPARQL endpoint縺ョURI繧呈欠螳壹☆繧区ァ区�蟄�
33         *
34         * @param endpointURI縲€繧「繧ッ繧サ繧ケ縺吶kSPARQL endpoint縺ョURI
35         * @throws Exception
36         * @since 28.01.2014
37         */
38        public OWLQueryBuilderImpl(String endpointURI) {
39                this.endpointURI = endpointURI;
40        }
41
42        /**
43         * 繝�せ繝医↓菴ソ逕ィ縺吶kmain繝。繧ス繝�ラ
44         * <p>
45         * 繧ッ繧ィ繝ェ繝薙Ν繝€繝シ縺ョ譛ャ逡ェ繝励Ο繧ー繝ゥ繝縺ァ縺ッ縺薙�繝。繧ス繝�ラ縺ッ菴ソ逕ィ縺励↑縺�
46         * </p>
47         * @param args 菴ソ逕ィ縺励↑縺�
48         * @throws Exception
49         * @since 28.01.2014
50         */
51        public static void main(String[] args) throws Exception {
52                String sparqlEndpoint = "http://dbpedia.org/sparql";
53                String keyword = "artiste";
54                String[] graphURIs = new String[0];
55
56                OWLQueryBuilder builder = new OWLQueryBuilderImpl(sparqlEndpoint);
[10]57                SClass[] clz = builder.getOWLClasses(graphURIs, keyword);
58                for(SClass cls: clz){
[2]59                        System.out.println(cls);
60                }
61
62                System.out.println("CLS");
[10]63                ClassLink[] cls = builder.getNextClass(null, clz[0].getClassURI(), 0);
[2]64                if( cls != null ){
65                        for( ClassLink cl: cls){
66                                System.out.println(cl.toString());
67                        }
68                }
69
70                System.out.println("CLS-INS");
[10]71                cls = builder.getNextClassViaInstanceLink(null, clz[0].getClassURI(), 100);
[2]72                if( cls != null ){
73                        for( ClassLink cl: cls){
74                                System.out.println(cl.toString());
75                        }
76                }
77
78                System.out.println("Instances");
79                Instance[] ins = builder.getInstances(null, "\"A.C. Reed\"@en");
80                if( ins != null ){
81                        for( Instance in: ins){
82                                System.out.println(in.toString());
83                        }
84                }
85
86               
87                System.out.println("INS-INS");
88                ins = builder.getInstances(null, "\"A.C. Reed\"@en");
89                InstanceLink[] iLinks = builder.getNextInstancesViaInstanceLink(null, ins[0].getInstanceURI(), 100);
90               
91
92               
93                if( iLinks != null ){
94                        for( InstanceLink in: iLinks){
95                                System.out.println(in.toString());
96                        }
97                }
98               
99               
100        }
101
102       
103        /**
104         * 譏守、コ逧�↓RDF縺ァ譖ク縺九l縺ヲ縺�k繧ッ繝ゥ繧ケ繧貞叙蠕励☆繧�
105         * <p>
106         * 謖�ョ壹&繧後◆graphURIs縺ョ荳ュ縺九i縲√く繝シ繝ッ繝シ繝峨↓繝偵ャ繝医☆繧九Λ繝吶Ν繧呈戟縺、繧ッ繝ゥ繧ケ��dfs:Class�峨r縺吶∋縺ヲ霑斐☆
107         * <br>
108         * </p>
109         *
110         * @param graphURIs縲€讀懃エ「蟇セ雎。縺ョgraph縺ョURI驟榊� (null繧�聞縺�縺ョ驟榊�繧ょ庄)
111         * @param keyword ��ull繧�ゥコ譁�ュ励�荳榊庄��
112         * @return 繧ッ繝ゥ繧ケURI縺ョ驟榊�
113         * @throws Exception
114         * @since 28.01.2014
115         */
[10]116        public SClass[] getOWLClasses(String[] graphURIs, String keyword)
[2]117                        throws Exception {
118                StringBuffer queryStr = new StringBuffer();
119                queryStr.append("PREFIX owl: <http://www.w3.org/2002/07/owl#>\n");
120                queryStr.append("PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n");
121                queryStr.append("PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n");
[10]122                queryStr.append("SELECT DISTINCT ?c ?pLabel (COUNT(?i) AS ?numOfInstances)\n");
[2]123                if (graphURIs != null) {
124                        for (String graphURI : graphURIs) {
125                                queryStr.append("FROM <");
126                                queryStr.append(graphURI);
127                                queryStr.append(">\n");
128                        }
129                }
130                queryStr.append("WHERE{\n");
131               
132                queryStr.append(" {?c rdf:type rdfs:Class} UNION {?c rdf:type owl:Class}\n");
133
134                queryStr.append("      ?c rdfs:label ?label.\n");
[10]135                queryStr.append("      ?c rdfs:label ?pLabel.\n");
136                queryStr.append("      ?i rdf:type ?c.\n");
[2]137
138//              queryStr.append("      ?c rdfs:label ");
139//              queryStr.append(keyword);
140//              queryStr.append(".");
141
142                queryStr.append("  FILTER (\n");
143                queryStr.append("    REGEX( ?label , \"");
144                queryStr.append(keyword);
145                queryStr.append("\" , \"i\" )\n");
146                queryStr.append("  )");
[10]147                queryStr.append("\n}  GROUP BY ?c ?pLabel");
[2]148
[18]149// System.out.println(queryStr.toString());
[2]150               
151                Query query = QueryFactory.create(queryStr.toString());
152                QueryExecution qexec = QueryExecutionFactory.sparqlService(endpointURI,
153                                query);
154
155                ResultSet results = qexec.execSelect();
[10]156                HashMap<String,SClass> classMap = new HashMap<String,SClass>();
[2]157                for (; results.hasNext();) {
158                        QuerySolution sol = results.next();
159                        Resource res = sol.getResource("c");
160                        String uri = res.getURI();
[10]161                        int numOfInstances = sol.getLiteral("numOfInstances").getInt();
162//System.out.println(numOfInstances);
163                        Literal labelLiteral = sol.getLiteral("pLabel");
164                        SClass sClass = null;
165                        if( classMap.containsKey(uri)){
166                                sClass = classMap.get(uri);
167                        }
168                        else{
169                                        sClass = new SClass(uri, null, numOfInstances);
170                                        classMap.put(uri, sClass);
171                        }
172                                if( labelLiteral != null ){
173                                        String label = labelLiteral.getString();
174                                        String lang = labelLiteral.getLanguage();
175                                        sClass.addLabel(new Label(label, lang));
176                                }
[2]177                }
178                qexec.close();
[10]179                return classMap.values().toArray(new SClass[0]);
[2]180        }
181
182
183        /**
184         *縲€繧、繝ウ繧ケ繧ソ繝ウ繧ケ繧貞叙蠕励☆繧�
185         * <p>
186         * 謖�ョ壹&繧後◆graphURIs縺ョ荳ュ縺九i縲√く繝シ繝ッ繝シ繝峨↓繝偵ャ繝医☆繧九Λ繝吶Ν繧呈戟縺、繧、繝ウ繧ケ繧ソ繝ウ繧ケ繧偵☆縺ケ縺ヲ霑斐☆
187         * <br>
188         * 縺薙%縺ァ繧、繝ウ繧ケ繧ソ繝ウ繧ケ縺ィ縺ッ縲〉df:type縺ョ荳サ隱槭→縺励※險倩ソー縺輔l縺ヲ縺�k繧ゅ�繧偵>縺�
189         * <br>
190         * </p>
191         *
192         * @param graphURIs縲€讀懃エ「蟇セ雎。縺ョgraph縺ョURI驟榊� (null繧�聞縺�縺ョ驟榊�繧ょ庄)
193         * @param keyword ��ull繧�ゥコ譁�ュ励�荳榊庄��
194         * @return 繧ッ繝ゥ繧ケURI縺ョ驟榊�
195         * @throws Exception
196         * @since 28.01.2014
197         */
198        public Instance[] getInstances(String[] graphURIs, String keyword)
199                        throws Exception {
200                StringBuffer queryStr = new StringBuffer();
201                queryStr.append("PREFIX owl: <http://www.w3.org/2002/07/owl#>\n");
202                queryStr.append("PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n");
203                queryStr.append("PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n");
204                queryStr.append("SELECT DISTINCT ?ins ?c \n");
205                if (graphURIs != null) {
206                        for (String graphURI : graphURIs) {
207                                queryStr.append("FROM <");
208                                queryStr.append(graphURI);
209                                queryStr.append(">\n");
210                        }
211                }
212                queryStr.append("WHERE{\n");
213//              queryStr.append(" {?c rdf:type rdfs:Class} UNION {?c rdf:type owl:Class}\n");
214
215               
216                queryStr.append("      ?ins rdf:type ?c.\n");
217                queryStr.append("      ?ins rdfs:label ");
218                queryStr.append(keyword);
219                queryStr.append(".\n");
220                queryStr.append(" FILTER (?c != rdf:Property)");
221                queryStr.append("}");
222                               
223// System.out.println(queryStr.toString());
224               
225                Query query = QueryFactory.create(queryStr.toString());
226                QueryExecution qexec = QueryExecutionFactory.sparqlService(endpointURI,
227                                query);
228
229                ResultSet results = qexec.execSelect();
230                HashMap<String, HashSet<String>> instanceMap = new HashMap<String, HashSet<String>>();
231                for (; results.hasNext();) {
232                        QuerySolution sol = results.next();
233                        Resource cls = sol.getResource("c");
234                        Resource ins = sol.getResource("ins");
235                        String clsURI = cls.getURI();
236                        String insURI = ins.getURI();
237                        if( instanceMap.containsKey(insURI)){
238                                HashSet<String> classes = instanceMap.get(insURI);
239                                classes.add(clsURI);
240                        }else{
241                                HashSet<String> classes = new HashSet<String>();
242                                instanceMap.put(insURI, classes);
243                                classes.add(clsURI);
244                        }
245                }
246                qexec.close();
247                Set<String> keySet = instanceMap.keySet();
248                ArrayList<Instance> instanceList = new ArrayList<Instance>();
249                for(String key: keySet){
250                        Instance ins = new Instance(key, instanceMap.get(key).toArray(new String[0]));
251                        instanceList.add(ins);
252                }
253                return instanceList.toArray(new Instance[0]);
254        }
255
256       
257        /**
258         *縲€謖�ョ壹&繧後◆繧ッ繝ゥ繧ケ繧定オキ轤ケ縺ィ縺励€∵�遉コ逧�↓險倩ソー縺輔l縺ヲ縺�kOWL縺ョproperty蛻カ邏�r隱ソ縺ケ縲√◎縺ョproperty蛻カ邏�〒
259         * 髢「騾」縺・縺代i繧後※縺�k繧ッ繝ゥ繧ケ繧堤カイ鄒�噪縺ォ蜿門セ励☆繧�
260         * <p>
261         * 蜃ヲ逅�ッセ雎。繝��繧ソ繧暖raphURIs縺ァ謖�ョ壹☆繧九%縺ィ縺後〒縺阪k
262         * <br>
263         * <br>
264         * </p>
265         *
266         * @param graphURIs縲€讀懃エ「蟇セ雎。縺ョgraph縺ョURI驟榊� 縲€(null繧�聞縺�縺ョ驟榊�繧ょ庄)
267         * @param originClass 襍キ轤ケ縺ィ縺ェ繧九け繝ゥ繧ケ縺ョURI縲€��ull荳榊庄��
268         * @param limit 隗」縺ィ縺励※霑斐&繧後kClassLink驟榊�縺ョ髟キ縺輔�荳企剞蛟、繧呈欠螳壹☆繧九€�荳企剞蛟、繧定ィュ螳壹@縺ェ縺�エ蜷医�0莉・荳九�蛟、繧呈欠螳壹☆繧�
269         * @return ClassLink縺ョ驟榊�縲ゅ%縺薙↓縺ッ縲∝叙蠕励&繧後◆繧ッ繝ゥ繧ケ縺ィ髢「菫ゅ▼縺代i繧後※縺�k繝励Ο繝代ユ繧」縲�未菫ゅ�蜷代″縺悟性縺セ繧後k縲�
270         * @throws Exception
271         * @since 28.01.2014
272         */
273        public ClassLink[] getNextClass(String[] graphURIs, String originClass,
274                        int limit) throws Exception {
275                StringBuffer queryStr = new StringBuffer();
276                queryStr.append("PREFIX owl: <http://www.w3.org/2002/07/owl#>\n");
277                queryStr.append("PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n");
278                queryStr.append("PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n");
[19]279//              queryStr.append("SELECT DISTINCT ?p ?pDirection ?c (COUNT(?s) AS ?numOfLinks) \n");
280                queryStr.append("SELECT DISTINCT ?p ?pDirection ?c \n");
[2]281                if (graphURIs != null) {
282                        for (String graphURI : graphURIs) {
283                                queryStr.append("FROM <");
284                                queryStr.append(graphURI);
285                                queryStr.append(">\n");
286                        }
287                }
288                queryStr.append("WHERE{\n");
289                queryStr.append("  { ?c rdf:type rdfs:Class. }\n  UNION\n  { ?c rdf:type owl:Class. }\n");
290                queryStr.append("  { ?p rdfs:domain <");
291                queryStr.append(originClass);
[19]292                queryStr.append(">.\n    ?p rdfs:range ?c.\n");
293//              queryStr.append("    ?o ?p ?s.");
294                queryStr.append("}\n  UNION\n");
[2]295                queryStr.append("  { ?p rdfs:range <");
296                queryStr.append(originClass);
[5]297                queryStr.append(">.\n");
298                queryStr.append("    ?p rdfs:domain ?c.\n");
[19]299//              queryStr.append("    ?s ?p ?o.");
300                queryStr.append("}\n");
[5]301
302                queryStr.append("    ?p ?pDirection ?c.\n");
303
304               
305                queryStr.append("  ?s rdf:type ?c.\n");
[19]306//              queryStr.append("  ?o rdf:type <");
307//              queryStr.append(originClass);
308//              queryStr.append(">.\n");
309                queryStr.append("}\n");
310//              queryStr.append("GROUP BY ?p ?pDirection ?c\n");
[2]311                if (limit > 0) {
312                        queryStr.append("limit ");
313                        queryStr.append(limit);
314                        queryStr.append("\n");
315                }
316               
[5]317                System.out.println(queryStr.toString());       
[2]318       
319                Query query = QueryFactory.create(queryStr.toString());
320                QueryExecution qexec = QueryExecutionFactory.sparqlService(endpointURI,
321                                query);
322
323                ResultSet results = qexec.execSelect();
324                ArrayList<ClassLink> solCLs = new ArrayList<ClassLink>();
325                for (; results.hasNext();) {
326                        QuerySolution sol = results.next();
327                        Resource pro = sol.getResource("p");
328                        Resource cls = sol.getResource("c");
329                        Resource dir = sol.getResource("pDirection");
330                        String proURI = pro.getURI();
331                        String clsURI = cls.getURI();
332                        String dirURI = dir.getURI();
333
334//                      System.out.println(pro.getURI() + " " + cls.getURI() + " " + dir.getURI());
335                       
336                       
337                        Direction direction = null;
338                        if( dirURI.equals("http://www.w3.org/2000/01/rdf-schema#domain") || dirURI.equals("rdfs:domain")){
339                                direction = Direction.reverse;
340                        }
341                        if( dirURI.equals("http://www.w3.org/2000/01/rdf-schema#range") || dirURI.equals("rdfs:range")){
342                                if( direction != null ){
343                                        direction = Direction.both;
344                                }else{
345                                direction = Direction.forward;
346                                }
347                        }
348//                      System.out.println(direction);
[5]349                        int numOfLinks = sol.getLiteral("numOfLinks").getInt();
350                        ClassLink cl = new ClassLink(proURI, clsURI, direction, numOfLinks);
[2]351                        solCLs.add(cl);
352                }
353                qexec.close();
354                return solCLs.toArray(new ClassLink[0]);
355        }
356       
357       
358        /**
359         *縲€謖�ョ壹&繧後◆繧ッ繝ゥ繧ケ繧定オキ轤ケ縺ィ縺励€√◎縺ョ繧ッ繝ゥ繧ケ縺ォ螻槭@縺ヲ縺�k繧、繝ウ繧ケ繧ソ繝ウ繧ケ縺ィ繝ェ繝ウ繧ッ縺悟シオ繧峨l縺ヲ縺�k繧、繝ウ繧ケ繧ソ繝ウ繧ケ縺ョ髮�粋繧貞叙蠕励@縲∝叙蠕励@縺溘う繝ウ繧ケ繧ソ繝ウ繧ケ縺ョ繧ッ繝ゥ繧ケ繧堤カイ鄒�噪縺ォ蜿門セ励☆繧�
360         * <p>
361         * 縺薙%縺ァ繧、繝ウ繧ケ繧ソ繝ウ繧ケ縺ィ縺ッ縲〉df:type縺ョ荳サ隱槭→縺励※險倩ソー縺輔l縺ヲ縺�k繧ゅ�繧偵>縺�
362         * <br>
363         * 蜃ヲ逅�ッセ雎。繝��繧ソ繧暖raphURIs縺ァ謖�ョ壹☆繧九%縺ィ縺後〒縺阪k
364         * <br>
365         * </p>
366         *
367         * @param graphURIs縲€讀懃エ「蟇セ雎。縺ョgraph縺ョURI驟榊� 縲€(null繧�聞縺�縺ョ驟榊�繧ょ庄)
368         * @param originClass 襍キ轤ケ縺ィ縺ェ繧九け繝ゥ繧ケ縺ョURI縲€��ull荳榊庄��
369         * @param limit 隗」縺ィ縺励※霑斐&繧後kClassLink驟榊�縺ョ髟キ縺輔�荳企剞蛟、繧呈欠螳壹☆繧九€�荳企剞蛟、繧定ィュ螳壹@縺ェ縺�エ蜷医�0莉・荳九�蛟、繧呈欠螳壹☆繧�
370         * @return ClassLink縺ョ驟榊�縲ゅ%縺薙↓縺ッ縲∝叙蠕励&繧後◆繧ッ繝ゥ繧ケ縺ィ髢「菫ゅ▼縺代i繧後※縺�k繝励Ο繝代ユ繧」縲�未菫ゅ�蜷代″縺悟性縺セ繧後k縲�
371         * @throws Exception
372         * @since 28.01.2014
373         */
374        public ClassLink[] getNextClassViaInstanceLink(String[] graphURIs, String originClass,
375                        int limit) throws Exception {
376                StringBuffer queryStr = new StringBuffer();
377                queryStr.append("PREFIX owl: <http://www.w3.org/2002/07/owl#>\n");
378                queryStr.append("PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n");
379                queryStr.append("PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n");
380                queryStr.append("SELECT DISTINCT ?pf ?pr ?c \n");
381                if (graphURIs != null) {
382                        for (String graphURI : graphURIs) {
383                                queryStr.append("FROM <");
384                                queryStr.append(graphURI);
385                                queryStr.append(">\n");
386                        }
387                }
388                queryStr.append("WHERE{\n");
389                queryStr.append("  ?ins rdf:type ?c.\n");
390                queryStr.append("  ?insOrg rdf:type <");
391                queryStr.append(originClass);
392                queryStr.append(">.\n");
393                queryStr.append("  { ?ins ?pr ?insOrg. }\n  UNION { ?insOrg ?pf ?ins. }\n");
394                queryStr.append("}\n");
395                if (limit > 0) {
396                        queryStr.append("limit ");
397                        queryStr.append(limit);
398                        queryStr.append("\n");
399                }
400               
401//              System.out.println(queryStr.toString());       
402       
403                Query query = QueryFactory.create(queryStr.toString());
404                QueryExecution qexec = QueryExecutionFactory.sparqlService(endpointURI,
405                                query);
406
407                ResultSet results = qexec.execSelect();
408                ArrayList<ClassLink> solCLs = new ArrayList<ClassLink>();
409                for (; results.hasNext();) {
410                        QuerySolution sol = results.next();
411                        Resource proForward = sol.getResource("pf");
412                        Resource proReverse = sol.getResource("pr");
413                        Resource cls = sol.getResource("c");
414                        Direction direction = null;
415                        String propURI = null;
416                        if( proForward != null ){
417                                if( proReverse != null ){
418                                        direction = Direction.both;
419                                }else{
420                                        direction = Direction.forward;
421                                }
422                                propURI = proForward.getURI();
423                        }else{
424                                direction = Direction.reverse;
425                                propURI = proReverse.getURI();
426                        }
427                        String clsURI = cls.getURI();
428//                      System.out.println(propURI + " " + clsURI + " " + direction);
429                       
430                        ClassLink cl = new ClassLink(propURI, clsURI, direction, 0);
431                        solCLs.add(cl);
432                }
433                qexec.close();
434                return solCLs.toArray(new ClassLink[0]);
435        }
436
437       
438       
439        public Path[] getPaths(String startClass, String endClass) throws Exception {
440                OWLClassGraph graph = new OWLClassGraph(startClass, endClass);
[16]441                return graph.getPaths(this, 0);
[2]442        }
443
444        public String createSPARQL(Path path) throws Exception {
445                return null;
446        }
447
448
449       
450       
451/*
452        private String executeSelect(String sparqlQuery) throws Exception {
453                HttpClient client = HttpClientBuilder.create().build();
454                HttpPost httppost = new HttpPost(endpointURI);
455                httppost.setHeader("Content-Type", "application/x-www-form-urlencoded");
456                httppost.setHeader("Accept", "application/sparql-results+xml");
457                List<NameValuePair> nvpList = new ArrayList<NameValuePair>();
458                nvpList.add(new BasicNameValuePair("query", sparqlQuery));
459                // nvpList.add(new BasicNameValuePair("format",
460                // outputFormat.getMime()));
461                httppost.setEntity(new UrlEncodedFormEntity(nvpList, Charset
462                                .forName("UTF-8")));
463                HttpResponse response = client.execute(httppost);
464                // System.out.println("[StatusLine] " + response.getStatusLine());
465                HttpEntity entity = response.getEntity();
466                String entityString = EntityUtils.toString(entity, "UTF-8");
467                return entityString;
468        }
469*/
470       
471        /**
472         *縲€謖�ョ壹&繧後◆繧、繝ウ繧ケ繧ソ繝ウ繧ケ繧定オキ轤ケ縺ィ縺励€√◎縺ョ繧、繝ウ繧ケ繧ソ繝ウ繧ケ縺ォ繝ェ繝ウ繧ッ縺悟シオ繧峨l縺ヲ縺�k繧、繝ウ繧ケ繧ソ繝ウ繧ケ縺ョ髮�粋繧貞叙蠕励☆繧九€�
473         *縲€蜿門セ励&繧後◆蜷�う繝ウ繧ケ繧ソ繝ウ繧ケ縺ョ繧ッ繝ゥ繧ケ繧らカイ鄒�噪縺ォ蜿門セ励☆繧�
474         * <p>
475         * 縺薙%縺ァ繧、繝ウ繧ケ繧ソ繝ウ繧ケ縺ィ縺ッ縲〉df:type縺ョ荳サ隱槭→縺励※險倩ソー縺輔l縺ヲ縺�k繧ゅ�繧偵>縺�
476         * <br>
477         * 蜃ヲ逅�ッセ雎。繝��繧ソ繧暖raphURIs縺ァ謖�ョ壹☆繧九%縺ィ縺後〒縺阪k
478         * <br>
479         * </p>
480         *
481         * @param graphURIs縲€讀懃エ「蟇セ雎。縺ョgraph縺ョURI驟榊� 縲€(null繧�聞縺�縺ョ驟榊�繧ょ庄)
482         * @param originInstance 襍キ轤ケ縺ィ縺ェ繧九う繝ウ繧ケ繧ソ繝ウ繧ケ縺ョURI縲€��ull荳榊庄��
483         * @param limit 隗」縺ィ縺励※霑斐&繧後kInstanceLink驟榊�縺ョ髟キ縺輔�荳企剞蛟、繧呈欠螳壹☆繧九€�荳企剞蛟、繧定ィュ螳壹@縺ェ縺�エ蜷医�0莉・荳九�蛟、繧呈欠螳壹☆繧�
484         * @return InstanceLink縺ョ驟榊�縲ゅ%縺薙↓縺ッ縲∝叙蠕励&繧後◆繧ッ繝ゥ繧ケ縺ィ髢「菫ゅ▼縺代i繧後※縺�k繝励Ο繝代ユ繧」縲�未菫ゅ�蜷代″縺悟性縺セ繧後k縲�
485         * @throws Exception
486         * @since 28.01.2014
487         */
488        public InstanceLink[] getNextInstancesViaInstanceLink(String[] graphURIs, String originInstance,
489                        int limit) throws Exception {
490                StringBuffer queryStr = new StringBuffer();
491                queryStr.append("PREFIX owl: <http://www.w3.org/2002/07/owl#>\n");
492                queryStr.append("PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n");
493                queryStr.append("PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n");
494                queryStr.append("SELECT DISTINCT ?pf ?pr ?ins ?c \n");
495                if (graphURIs != null) {
496                        for (String graphURI : graphURIs) {
497                                queryStr.append("FROM <");
498                                queryStr.append(graphURI);
499                                queryStr.append(">\n");
500                        }
501                }
502                queryStr.append("WHERE{\n");
503//              queryStr.append("  { ?c rdf:type rdfs:Class. }\n  UNION\n  { ?c rdf:type owl:Class. }\n");
504                queryStr.append("  ?ins rdf:type ?c.\n");
505                queryStr.append("  { ?ins ?pr <");
506                queryStr.append(originInstance);
507                queryStr.append(">. }\n  UNION { <");
508                queryStr.append(originInstance);
509                queryStr.append("> ?pf ?ins. }\n");
510
511                queryStr.append(" FILTER (?c != rdf:Property)");
512
513                queryStr.append("}\n");
514                if (limit > 0) {
515                        queryStr.append("limit ");
516                        queryStr.append(limit);
517                        queryStr.append("\n");
518                }
519               
520//              System.out.println(queryStr.toString());       
521       
522                Query query = QueryFactory.create(queryStr.toString());
523                QueryExecution qexec = QueryExecutionFactory.sparqlService(endpointURI,
524                                query);
525
526                ResultSet results = qexec.execSelect();
527                HashMap<String, InstanceLink> insLinkMap = new HashMap<String, InstanceLink>();
528                for (; results.hasNext();) {
529                        QuerySolution sol = results.next();
530                        Resource proForward = sol.getResource("pf");
531                        Resource proReverse = sol.getResource("pr");
532                        Resource ins = sol.getResource("ins");
533                        Resource cls = sol.getResource("c");
534                        Direction direction = null;
535                        String propURI = null;
536                        if( proForward != null ){
537                                if( proReverse != null ){
538                                        direction = Direction.both;
539                                }else{
540                                        direction = Direction.forward;
541                                }
542                                propURI = proForward.getURI();
543                        }else{
544                                direction = Direction.reverse;
545                                propURI = proReverse.getURI();
546                        }
547                        String clsURI = cls.getURI();
548                        String insURI = ins.getURI();
549                        String key = propURI + "\t" + insURI + "\t" + direction;
550                        if( insLinkMap.containsKey(key)){
551                                InstanceLink insLink = insLinkMap.get(key);
552                                insLink.addLinkedClassURI(clsURI);
553                        }else{
554                                InstanceLink insLink = new InstanceLink(propURI, insURI, new String[]{clsURI}, direction);
555                                insLinkMap.put(key, insLink);
556                        }
557                }
558                qexec.close();
559                Collection<InstanceLink> values = insLinkMap.values();
560                return values.toArray(new InstanceLink[0]);
561        }
562
[19]563       
564        public LabelMap[] getLabels(String[] graphURIs, String[] resourceURIs, String language) throws Exception{
565                if( resourceURIs == null || resourceURIs.length == 0 ){
566                        return new LabelMap[0];
567                }
568                StringBuffer queryStr = new StringBuffer();
569                queryStr.append("PREFIX owl: <http://www.w3.org/2002/07/owl#>\n");
570                queryStr.append("PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n");
571                queryStr.append("PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n");
572                queryStr.append("SELECT DISTINCT ?res ?label \n");
573                if (graphURIs != null) {
574                        for (String graphURI : graphURIs) {
575                                queryStr.append("FROM <");
576                                queryStr.append(graphURI);
577                                queryStr.append(">\n");
578                        }
579                }
580                queryStr.append("WHERE{\n");
581                queryStr.append("  ?res rdfs:label ?label.\n");
582                queryStr.append("  FILTER(?res IN (");
583                boolean f = false;
584                for( String resourceURI: resourceURIs ){
585                        if(f){
586                                queryStr.append(", ");
587                        }
588                        f = true;
589                        queryStr.append("<");
590                        queryStr.append(resourceURI);
591                        queryStr.append(">");
592                }
593                queryStr.append("))\n");
594                queryStr.append("}");
595               
596                System.out.println(queryStr.toString());       
597       
598                Query query = QueryFactory.create(queryStr.toString());
599                QueryExecution qexec = QueryExecutionFactory.sparqlService(endpointURI,
600                                query);
601
602                ResultSet results = qexec.execSelect();
603                HashMap<String, LabelMap> lMap = new HashMap<String, LabelMap>();
604                HashMap<String, InstanceLink> insLinkMap = new HashMap<String, InstanceLink>();
605                for (; results.hasNext();) {
606                        QuerySolution sol = results.next();
607                        String uri = sol.getResource("res").getURI();
608                        Literal literal = sol.getLiteral("label");
609                        if( literal != null ){
610                                String label = literal.getString();
611                                String lang = literal.getLanguage();
612                                if( language != null && language.equals(lang)){
613                                        Label lbl = new Label(label, lang);
614                                        if( lMap.containsKey(uri)){
615                                                LabelMap lm = lMap.get(uri);
616                                                lm.addLabel(lbl);
617                                        }else{
618                                                LabelMap lm = new LabelMap(uri, new Label[]{lbl});
619                                                lMap.put(uri, lm);
620                                        }
621                                }
622                        }
623                }
624                return lMap.values().toArray(new LabelMap[0]);
625               
626               
627        }
628       
[2]629}
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。