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

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

Path 探索アルゴリズム変更

  • 属性 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.ArrayList;
12import java.util.LinkedList;
13import java.util.List;
14import 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, boolean converge){
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        this.startClass = startClass;
47        addNode(startClass);
48        this.endClass = endClass;
49        addNode(endClass);
50        nsteps = 3;
51        limit = 1000;
52        prunecut = 100;
53    }
54
55    public Path[] getPaths(RDFSchemaAnalyzer rdfsa, boolean countLink){
56        List<List<ClassLink>> paths = null;
57        paths = searchPaths(rdfsa, countLink);           
58        Path[] patharray = new Path[paths.size()];
59        ListIterator<List<ClassLink>> pit = paths.listIterator();
60        int i = 0;
61        while ( pit.hasNext() ){
62            patharray[i] = new Path();
63            patharray[i].setStartClass(startClass);
64            List<ClassLink> path = pit.next();
65            patharray[i].setClassLinks(path);
66            ListIterator<ClassLink> cit = path.listIterator();
67            int min = Integer.MAX_VALUE;
68            while ( cit.hasNext() ){
69                ClassLink cl = cit.next();
70                if ( cl.getNumOfLinks() < min ){
71                    min = cl.getNumOfLinks();
72                }
73            }
74            patharray[i].setWidth(min);
75            i++;
76        }
77        return patharray;
78    }
79       
80    private List<List<ClassLink>> searchPaths(RDFSchemaAnalyzer rdfsa, boolean countLinks){
81        List<List<ClassLink>> paths = new ArrayList<>();
82        List<LinkAndPath> lp = new LinkedList<>();
83        lp.add(new LinkAndPath(new ClassLink("",startClass,null,Direction.both,0,0,0,0,0,false,false), new LinkedList<ClassLink>(), "", false));
84        try{
85          for ( int i = 0; i < nsteps; i++ ){
86              ListIterator<LinkAndPath> lit = lp.listIterator();
87              List<LinkAndPath> nextlp = new LinkedList<>();
88              while ( lit.hasNext() ){
89                  LinkAndPath crrlp = lit.next();
90                  ClassLink[] classLinks = rdfsa.getNextClass(null, crrlp.classLink.getLinkedClassURI(), limit, countLinks);
91                  for ( int j = 0 ; j < classLinks.length; j++ ){
92                      List<ClassLink> crrpath = new LinkedList<>(crrlp.path);
93                      crrpath.add(classLinks[j]);
94                      if ( classLinks[j].getLinkedClassURI() == null ){ continue; }
95                      if ( classLinks[j].getLinkedClassURI().equals(endClass) ){
96                          paths.add(new LinkedList<>(crrpath));
97                          continue;
98                      }
99                      if ( countLinks == true && classLinks[j].getNumOfLinks() <= th){
100                          continue;
101                      }
102                      if ( i >= 2 ){
103                          if ( crrlp.classLink.getPropertyURI().equals(classLinks[j].getPropertyURI()) &&
104                           crrlp.classLink.getDirection() != classLinks[j].getDirection() &&
105                           crrlp.originalClassURI.equals( classLinks[j].getLinkedClassURI()) ){
106                              System.out.println("P1");
107                              continue;
108                          }
109                          if ( checkPruning(crrlp.classLink, classLinks[j]) ){
110                              System.out.println("P2");
111                              continue;
112                          }
113                      }
114                     
115                      nextlp.add(new LinkAndPath(classLinks[j], crrpath, crrlp.classLink.getLinkedClassURI(), false));
116                  }
117              }
118              lp = nextlp;
119          }
120        }catch(Exception e){
121            System.err.println(e);
122        }
123        return paths; 
124    }
125
126/*   
127    private List<List<ClassLink>> searchPathsWithCut(OWLQueryBuilderImpl qb){
128        List<List<ClassLink>> paths = new ArrayList<>();
129        ClassLink crrLink = new ClassLink(null,startClass,Direction.both,0,0,0,0,0);
130        List<LinkAndPath> lp = new LinkedList<>();
131        lp.add(new LinkAndPath(crrLink, new LinkedList<ClassLink>()));
132        try{
133          for ( int i = 0; i < nsteps; i++ ){
134              ListIterator<LinkAndPath> lit = lp.listIterator();
135              List<LinkAndPath> nextlp = new LinkedList<>();
136              while ( lit.hasNext() ){
137                  LinkAndPath crrlp = lit.next();
138                  ClassLink[] classLinks = null;
139                  classLinks = qb.getNextClass(null, crrlp.classLink.getLinkedClassURI(), limit, true);
140                  for ( int j = 0 ; j < classLinks.length; j++ ){
141                      if ( classLinks[j].getNumOfLinks() == 0 ){ continue; }
142                      List<ClassLink> crrpath = new LinkedList<>(crrlp.path);
143                      crrpath.add(classLinks[j]);
144                      if ( classLinks[j].getLinkedClassURI().equals(endClass) ){
145                          paths.add(new LinkedList<>(crrpath));
146                          continue;
147                      }
148                      if (classLinks[j].getNumOfLinks() <= th ){
149                          continue; //cut by the number of instances
150                      }
151                      // Divergence & Convergence Decision
152                      boolean con = false;
153                      boolean div = false;
154                      if ( decideConvergence(classLinks[j]) ){ // convergence
155                          con = true;
156                      }
157                      if ( decideDivergence(classLinks[j]) ){ // divergence
158                          div = true;
159                      }
160                      if ( crrlp.converge == true && div == true ){ // converge & 縲€diverge
161                          continue; // cut by the differences of entropies
162                      }
163                      // crr & next are the same arcs
164                      if ( crrlp.classLink.getPropertyURI().equals(classLinks[j].getPropertyURI()) &&
165                           crrlp.classLink.getDirection() != classLinks[j].getDirection() &&
166                           crrlp.originalClassURI.equals( classLinks[j].getLinkedClassURI()) ){
167                          continue;
168                      }
169                     
170                      nextlp.add(new LinkAndPath(classLinks[j], crrpath, crrlp.classLink.getLinkedClassURI(), con));
171                  }
172              }
173              lp = nextlp;
174          }
175        }catch(Exception e){
176            System.err.println(e);
177        }
178        return paths; 
179    }
180*/
181   
182      private boolean checkPruning(ClassLink classLink1, ClassLink classLink2){
183          // true -> prune link2, false -> add link2
184          int noi1 = classLink1.getNumOfOriginInstances();
185          int nli1 = classLink1.getNumOfLinkedInstances();
186          int noi2 = classLink2.getNumOfOriginInstances();
187          int nli2 = classLink2.getNumOfLinkedInstances();
188          if ( noi1 == 0 || nli1 == 0 || noi2 == 0 || nli2 == 0 ){
189              return true;
190          }
191          return ( noi1 / nli1 > prunecut && nli2 / noi2 > prunecut );
192      }
193   
194/*    private boolean decideConvergence(ClassLink classLink){
195        double con = getValueForConvergence(classLink.getNumOfOriginInstances(),
196                                              classLink.getNumOfLinkedInstances(),
197                                              classLink.getNumOfLinks());
198        if ( con > concut  ){
199            return true;
200        }
201        return false;
202    }
203*/
204   
205/*   
206    private boolean decideDivergence(ClassLink classLink){
207        double con = getValueForConvergence(classLink.getNumOfOriginInstances(),
208                                              classLink.getNumOfLinkedInstances(),
209                                              classLink.getNumOfLinks());
210        if ( con < divcut  ){
211            return true;
212        }
213        return false;
214    }
215*/
216   
217/*   
218    private double getValueForConvergence(int numOfOriginInstances, int numOfLinkedInstances, int numOfLinks){
219        //return (double) numOfLinks / (double) numOfLinkedInstances ;
220        // Convergence plus, Divergence minus
221        return Math.log((double)numOfOriginInstances) - Math.log((double)numOfLinkedInstances);
222    }
223    */
224    private int getMinCutOfPath(){
225        int min = Integer.MAX_VALUE;
226        //KOKO
227        return min;
228    }
229   
230}
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。