root/BH13SPARQLBuilder/src/org/biohackathon/SPARQLBuilder/OWL/OWLClassGraph.java @ 154

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

QueryPathGenerator? にgetFactory を追加

  • 属性 svn:mime-type の設定値 text/plain
Rev行番号 
[2]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 */
[67]11import java.util.ArrayList;
12import java.util.LinkedList;
13import java.util.List;
14import java.util.ListIterator;
[2]15
16public class OWLClassGraph extends LabeledMultiDigraph{
17    String startClass;
18    String endClass;
19    int nsteps;
20    int limit;
[34]21    int th;
[47]22    double concut;
23    double divcut;
[2]24       
25    public class LinkAndPath{
[67]26        String originalClassURI; // originalClasssURI -classLink.propertyURI-> classLink.linkedClassURL
[2]27        ClassLink classLink;
28        List<ClassLink> path;
[45]29        boolean converge;
[67]30       
[2]31        public LinkAndPath(ClassLink classLink, List<ClassLink> path){
32           this.classLink = classLink;
33           this.path = path;
[45]34           this.converge = false;
[2]35        }
[45]36       
[90]37        public LinkAndPath(ClassLink classLink, List<ClassLink> path, String originalClassURI, boolean converge){
[45]38           this.classLink = classLink;
39           this.path = path;
[67]40           this.originalClassURI = originalClassURI;
[45]41           this.converge = converge;
42        }
[2]43    }
44   
[3]45    public OWLClassGraph(String startClass, String endClass){
[2]46        super();
[3]47        this.startClass = startClass;
48        addNode(startClass);
49        this.endClass = endClass;
50        addNode(endClass);
[113]51        nsteps = 3;
[3]52        limit = 1000;
[90]53        //th = 0;
54        //concut = 2.0;
55        //divcut = - 2.0;
[2]56    }
[154]57
[82]58    public Path[] getPaths(RDFSchemaAnalyzer rdfsa, boolean countLink){
[47]59        List<List<ClassLink>> paths = null;
[154]60        paths = searchPaths(rdfsa, countLink);           
[2]61        Path[] patharray = new Path[paths.size()];
62        ListIterator<List<ClassLink>> pit = paths.listIterator();
63        int i = 0;
64        while ( pit.hasNext() ){
[3]65            patharray[i] = new Path();
[2]66            patharray[i].setStartClass(startClass);
67            List<ClassLink> path = pit.next();
68            patharray[i].setClassLinks(path);
[8]69            ListIterator<ClassLink> cit = path.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            patharray[i].setWidth(min);
[2]78            i++;
79        }
80        return patharray;
81    }
[45]82       
[82]83    private List<List<ClassLink>> searchPaths(RDFSchemaAnalyzer rdfsa, boolean countLinks){
[15]84        List<List<ClassLink>> paths = new ArrayList<>();
85        List<LinkAndPath> lp = new LinkedList<>();
[114]86        lp.add(new LinkAndPath(new ClassLink("",startClass,null,Direction.both,0,0,0,0,0,false,false), new LinkedList<ClassLink>(), "", false));
[2]87        try{
88          for ( int i = 0; i < nsteps; i++ ){
89              ListIterator<LinkAndPath> lit = lp.listIterator();
[15]90              List<LinkAndPath> nextlp = new LinkedList<>();
[2]91              while ( lit.hasNext() ){
92                  LinkAndPath crrlp = lit.next();
[90]93                  ClassLink[] classLinks = rdfsa.getNextClass(null, crrlp.classLink.getLinkedClassURI(), limit, countLinks);
[2]94                  for ( int j = 0 ; j < classLinks.length; j++ ){
[15]95                      List<ClassLink> crrpath = new LinkedList<>(crrlp.path);
[2]96                      crrpath.add(classLinks[j]);
[134]97                      if ( classLinks[j].getLinkedClassURI() == null ){ continue; }
[2]98                      if ( classLinks[j].getLinkedClassURI().equals(endClass) ){
[15]99                          paths.add(new LinkedList<>(crrpath));
[34]100                          continue;
[2]101                      }
[34]102                      if ( countLinks == true && classLinks[j].getNumOfLinks() <= th){
103                          continue;
104                      }
[115]105                      if ( i >= 2 ){
106                          if ( crrlp.classLink.getPropertyURI().equals(classLinks[j].getPropertyURI()) &&
[90]107                           crrlp.classLink.getDirection() != classLinks[j].getDirection() &&
108                           crrlp.originalClassURI.equals( classLinks[j].getLinkedClassURI()) ){
[115]109                              continue;
110                          }
[90]111                      }
112                     
113                      nextlp.add(new LinkAndPath(classLinks[j], crrpath, crrlp.classLink.getLinkedClassURI(), false));
[2]114                  }
115              }
[3]116              lp = nextlp;
[2]117          }
[15]118        }catch(Exception e){
119            System.err.println(e);
120        }
[21]121        return paths; 
[2]122    }
[82]123
124/*   
[45]125    private List<List<ClassLink>> searchPathsWithCut(OWLQueryBuilderImpl qb){
126        List<List<ClassLink>> paths = new ArrayList<>();
[51]127        ClassLink crrLink = new ClassLink(null,startClass,Direction.both,0,0,0,0,0);
[45]128        List<LinkAndPath> lp = new LinkedList<>();
129        lp.add(new LinkAndPath(crrLink, new LinkedList<ClassLink>()));
130        try{
131          for ( int i = 0; i < nsteps; i++ ){
132              ListIterator<LinkAndPath> lit = lp.listIterator();
133              List<LinkAndPath> nextlp = new LinkedList<>();
134              while ( lit.hasNext() ){
135                  LinkAndPath crrlp = lit.next();
136                  ClassLink[] classLinks = null;
[53]137                  classLinks = qb.getNextClass(null, crrlp.classLink.getLinkedClassURI(), limit, true);
[45]138                  for ( int j = 0 ; j < classLinks.length; j++ ){
[53]139                      if ( classLinks[j].getNumOfLinks() == 0 ){ continue; }
[45]140                      List<ClassLink> crrpath = new LinkedList<>(crrlp.path);
141                      crrpath.add(classLinks[j]);
142                      if ( classLinks[j].getLinkedClassURI().equals(endClass) ){
143                          paths.add(new LinkedList<>(crrpath));
144                          continue;
145                      }
[67]146                      if (classLinks[j].getNumOfLinks() <= th ){
147                          continue; //cut by the number of instances
148                      }
149                      // Divergence & Convergence Decision
[45]150                      boolean con = false;
[47]151                      boolean div = false;
[52]152                      if ( decideConvergence(classLinks[j]) ){ // convergence
[45]153                          con = true;
154                      }
[52]155                      if ( decideDivergence(classLinks[j]) ){ // divergence
[47]156                          div = true;
157                      }
158                      if ( crrlp.converge == true && div == true ){ // converge & 縲€diverge
[67]159                          continue; // cut by the differences of entropies
[45]160                      }
[67]161                      // crr & next are the same arcs
162                      if ( crrlp.classLink.getPropertyURI().equals(classLinks[j].getPropertyURI()) &&
163                           crrlp.classLink.getDirection() != classLinks[j].getDirection() &&
164                           crrlp.originalClassURI.equals( classLinks[j].getLinkedClassURI()) ){
165                          continue;
166                      }
167                     
168                      nextlp.add(new LinkAndPath(classLinks[j], crrpath, crrlp.classLink.getLinkedClassURI(), con));
[45]169                  }
170              }
171              lp = nextlp;
172          }
173        }catch(Exception e){
174            System.err.println(e);
175        }
176        return paths; 
177    }
[82]178*/
[47]179   
[82]180/*   
[52]181    private boolean decideConvergence(ClassLink classLink){
182        double con = getValueForConvergence(classLink.getNumOfOriginInstances(),
183                                              classLink.getNumOfLinkedInstances(),
184                                              classLink.getNumOfLinks());
185        if ( con > concut  ){
186            return true;
187        }
188        return false;
189    }
[82]190*/
[52]191   
[82]192/*   
[52]193    private boolean decideDivergence(ClassLink classLink){
194        double con = getValueForConvergence(classLink.getNumOfOriginInstances(),
195                                              classLink.getNumOfLinkedInstances(),
196                                              classLink.getNumOfLinks());
197        if ( con < divcut  ){
198            return true;
199        }
200        return false;
201    }
[82]202*/
203   
204/*   
[47]205    private double getValueForConvergence(int numOfOriginInstances, int numOfLinkedInstances, int numOfLinks){
[48]206        //return (double) numOfLinks / (double) numOfLinkedInstances ;
[50]207        // Convergence plus, Divergence minus
208        return Math.log((double)numOfOriginInstances) - Math.log((double)numOfLinkedInstances);
[47]209    }
[82]210    */
[2]211}
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。