root/SPARQLBuilderWWW/src/java/org/biohackathon/SPARQLBuilder/OWL/OWLClassGraph.java @ 203

リビジョン 201, 10.2 KB (コミッタ: atsuko, 10 年 前)

パス数を予め計算するための土台作成

  • 属性 svn:mime-type の設定値 text/plain
行番号 
1/*
2 * To change this template, choose Tools | Templates
3 * and open the template in the editor.
4 */
5package org.biohackathon.SPARQLBuilder.OWL;
6
7/**
8 *
9 * @author atsuko
10 */
11import java.util.*;
12//import java.util.LinkedList;
13//import java.util.List;
14//import java.util.ListIterator;
15
16public class OWLClassGraph extends LabeledMultiDigraph{
17    String startClass;
18    String endClass;
19    int nsteps;
20    int limit;
21    int th;
22    int prunecut;
23       
24    public class LinkAndPath{
25        String originalClassURI; // originalClasssURI -classLink.propertyURI-> classLink.linkedClassURL
26        ClassLink classLink;
27        List<ClassLink> path;
28        //boolean converge;
29       
30        public LinkAndPath(ClassLink classLink, List<ClassLink> path){
31           this.classLink = classLink;
32           this.path = path;
33           //this.converge = false;
34        }
35       
36        public LinkAndPath(ClassLink classLink, List<ClassLink> path, String originalClassURI){
37           this.classLink = classLink;
38           this.path = path;
39           this.originalClassURI = originalClassURI;
40           //this.converge = converge;
41        }
42    }
43   
44    public OWLClassGraph(String startClass, String endClass){
45        super();
46       
47        // start & end
48        this.startClass = startClass;
49        this.endClass = endClass;
50       
51        // parameters
52        nsteps = 3;
53        limit = 1000;
54        prunecut = 100;
55       
56    }
57
58    public Path[] getPaths(RDFSchemaAnalyzer rdfsa, boolean countLink){
59        List<List<ClassLink>> paths = null;
60        paths = searchPaths(rdfsa, countLink);
61        NavigableSet<Path> sortedpath = new TreeSet<Path>();
62        ListIterator<List<ClassLink>> pit = paths.listIterator();
63        int j = 0;
64        while ( pit.hasNext() ){
65            Path path = new Path();
66            path.setStartClass(startClass);
67            List<ClassLink> crrpath = pit.next();
68            path.setClassLinks(crrpath);
69            ListIterator<ClassLink> cit = crrpath.listIterator();
70            int min = Integer.MAX_VALUE;
71            while ( cit.hasNext() ){
72                ClassLink cl = cit.next();
73                if ( cl.getNumOfLinks() < min ){
74                    min = cl.getNumOfLinks();
75                }
76            }
77            path.setWidth(min);
78            sortedpath.add(path);
79            j++;
80        }
81        Path[] patharray = new Path[paths.size()];
82        Iterator<Path> pait = sortedpath.descendingIterator();
83        int i = 0;
84        while ( pait.hasNext() ){
85            patharray[i] = pait.next();
86            i++;
87        }
88        return patharray;
89    }
90   
91    private List<List<ClassLink>> searchPaths(RDFSchemaAnalyzer rdfsa, boolean countLinks){
92        List<List<ClassLink>> paths = new ArrayList<>();
93        List<LinkAndPath> lp = new LinkedList<>();
94        lp.add(new LinkAndPath(new ClassLink("",startClass,null,Direction.both,0,0,0,0,0,false,false), new LinkedList<ClassLink>(), ""));
95        try{
96          for ( int i = 0; i < nsteps; i++ ){
97              ListIterator<LinkAndPath> lit = lp.listIterator();
98              List<LinkAndPath> nextlp = new LinkedList<>();
99              while ( lit.hasNext() ){
100                  LinkAndPath crrlp = lit.next();
101                  ClassLink[] classLinks = rdfsa.getNextClass(null, crrlp.classLink.getLinkedClassURI(), limit, countLinks);
102                  for ( int j = 0 ; j < classLinks.length; j++ ){
103                      List<ClassLink> crrpath = new LinkedList<>(crrlp.path);
104                      crrpath.add(classLinks[j]);
105                      if ( classLinks[j].getLinkedClassURI() == null ){ continue; }
106                      if ( classLinks[j].getLinkedClassURI().equals(endClass) ){
107                          paths.add(new LinkedList<>(crrpath));
108                          continue;
109                      }
110                      if ( countLinks == true && classLinks[j].getNumOfLinks() <= th){
111                          continue;
112                      }
113                      if ( i >= 2 ){
114                          if ( crrlp.classLink.getPropertyURI().equals(classLinks[j].getPropertyURI()) &&
115                           crrlp.classLink.getDirection() != classLinks[j].getDirection() &&
116                           crrlp.originalClassURI.equals( classLinks[j].getLinkedClassURI()) ){
117                              //System.out.println("P1");
118                              continue;
119                          }
120                          if ( checkPruning(crrlp.classLink, classLinks[j]) ){
121                              //System.out.println("P2");
122                              continue;
123                          }
124                      }
125                      nextlp.add(new LinkAndPath(classLinks[j], crrpath, crrlp.classLink.getLinkedClassURI()));
126                  }
127              }
128              lp = nextlp;
129          }
130        }catch(Exception e){
131            System.err.println(e);
132        }
133        return paths; 
134    }
135
136/*   
137    private List<List<ClassLink>> searchPathsWithCut(OWLQueryBuilderImpl qb){
138        List<List<ClassLink>> paths = new ArrayList<>();
139        ClassLink crrLink = new ClassLink(null,startClass,Direction.both,0,0,0,0,0);
140        List<LinkAndPath> lp = new LinkedList<>();
141        lp.add(new LinkAndPath(crrLink, new LinkedList<ClassLink>()));
142        try{
143          for ( int i = 0; i < nsteps; i++ ){
144              ListIterator<LinkAndPath> lit = lp.listIterator();
145              List<LinkAndPath> nextlp = new LinkedList<>();
146              while ( lit.hasNext() ){
147                  LinkAndPath crrlp = lit.next();
148                  ClassLink[] classLinks = null;
149                  classLinks = qb.getNextClass(null, crrlp.classLink.getLinkedClassURI(), limit, true);
150                  for ( int j = 0 ; j < classLinks.length; j++ ){
151                      if ( classLinks[j].getNumOfLinks() == 0 ){ continue; }
152                      List<ClassLink> crrpath = new LinkedList<>(crrlp.path);
153                      crrpath.add(classLinks[j]);
154                      if ( classLinks[j].getLinkedClassURI().equals(endClass) ){
155                          paths.add(new LinkedList<>(crrpath));
156                          continue;
157                      }
158                      if (classLinks[j].getNumOfLinks() <= th ){
159                          continue; //cut by the number of instances
160                      }
161                      // Divergence & Convergence Decision
162                      boolean con = false;
163                      boolean div = false;
164                      if ( decideConvergence(classLinks[j]) ){ // convergence
165                          con = true;
166                      }
167                      if ( decideDivergence(classLinks[j]) ){ // divergence
168                          div = true;
169                      }
170                      if ( crrlp.converge == true && div == true ){ // converge & 縲€diverge
171                          continue; // cut by the differences of entropies
172                      }
173                      // crr & next are the same arcs
174                      if ( crrlp.classLink.getPropertyURI().equals(classLinks[j].getPropertyURI()) &&
175                           crrlp.classLink.getDirection() != classLinks[j].getDirection() &&
176                           crrlp.originalClassURI.equals( classLinks[j].getLinkedClassURI()) ){
177                          continue;
178                      }
179                     
180                      nextlp.add(new LinkAndPath(classLinks[j], crrpath, crrlp.classLink.getLinkedClassURI(), con));
181                  }
182              }
183              lp = nextlp;
184          }
185        }catch(Exception e){
186            System.err.println(e);
187        }
188        return paths; 
189    }
190*/
191   
192      private boolean checkPruning(ClassLink classLink1, ClassLink classLink2){
193          // true -> prune link2, false -> add link2
194          int noi1 = classLink1.getNumOfOriginInstances();
195          int nli1 = classLink1.getNumOfLinkedInstances();
196          int noi2 = classLink2.getNumOfOriginInstances();
197          int nli2 = classLink2.getNumOfLinkedInstances();
198          if ( noi1 == 0 || nli1 == 0 || noi2 == 0 || nli2 == 0 ){
199              return true;
200          }
201          return ( noi1 / nli1 > prunecut && nli2 / noi2 > prunecut );
202      }
203   
204/*    private boolean decideConvergence(ClassLink classLink){
205        double con = getValueForConvergence(classLink.getNumOfOriginInstances(),
206                                              classLink.getNumOfLinkedInstances(),
207                                              classLink.getNumOfLinks());
208        if ( con > concut  ){
209            return true;
210        }
211        return false;
212    }
213*/
214   
215/*   
216    private boolean decideDivergence(ClassLink classLink){
217        double con = getValueForConvergence(classLink.getNumOfOriginInstances(),
218                                              classLink.getNumOfLinkedInstances(),
219                                              classLink.getNumOfLinks());
220        if ( con < divcut  ){
221            return true;
222        }
223        return false;
224    }
225*/
226   
227/*   
228    private double getValueForConvergence(int numOfOriginInstances, int numOfLinkedInstances, int numOfLinks){
229        //return (double) numOfLinks / (double) numOfLinkedInstances ;
230        // Convergence plus, Divergence minus
231        return Math.log((double)numOfOriginInstances) - Math.log((double)numOfLinkedInstances);
232    }
233    */
234     
235   public void setWholeGraph(RDFSchemaAnalyzer rdfsa){
236       // setNodes
237       SClass[] classes = null;
238       try{
239           classes = rdfsa.getOWLClasses(null, null, null, true);
240       }catch(Exception e){
241           System.err.println(e); return;
242       }
243       for (int i = 0 ; i < classes.length; i++){
244           addNode(classes[i].getClassURI());
245       }
246       // setEdges
247       for (int i = 0 ; i < classes.length; i++){
248           try{
249               ClassLink[] classLinks = rdfsa.getNextClass(null, classes[i].getClassURI(), limit, true);
250               for (int j = 0 ; j < classLinks.length; j++){
251                   addEdge(i, labelednodes.get(classLinks[j].getLinkedClassURI()),
252                           classLinks[j].getPropertyURI(),
253                           classLinks[j].getDirection(),
254                           classLinks[j].getNumOfLinkedInstances());
255               }
256           }catch(Exception e){
257               System.err.println(e);
258           }
259       }
260   }
261}
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。