2017-08-24 69 views
0

好吧,我有一個存儲父「SentenceFromUser」用一些隨機抽題的子類(如「你是做什麼」)一個XML文件(有限制完成:裏森納在耶拿行不通

hasWordOnFirst 一些什麼

什麼是個人)

然後我有定義爲超類稱爲OpenQuestion和ClosedQuestion。在這段代碼中,我想看看我的問題將在哪個超類中排序。在Protege中,我可以啓動Reasoner並立即獲取哪個類型的問題。但是對於耶拿而言,Reasoner並沒有真正與我自己一起工作(通過這段代碼)創造了問題。我希望有人能幫助我...代碼:

public class main { 
    public static void main (String[] args) {  
     String state = "learn"; 

     while(0 == 0) { 

      OntModel m1 = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); 
      m1.read("src/test/new.xml", "RDF/XML"); 
      m1.setStrictMode(false); 
      String uri = "http://www.semanticweb.org/ontologies/2017/7/untitled-ontology-3#"; 

      Scanner scan = new Scanner(System.in); 
      System.out.println("Enter a question:"); 
      String input = scan.nextLine(); 
      if (input.equals("exit")) { 
       break; 
      } 

      String[] words = input.split("\\s+");  
      for (int i = 0; i < words.length; i++) {     
       words[i] = words[i].replaceAll("[^\\w]", ""); 
      } 

      //create new question 
      OntClass sentenceFromUser = m1.getOntClass(uri + "SentenceFromUser"); 
      String questionName = "Question" + ThreadLocalRandom.current().nextInt(1, 100000); 
      Resource newResQuestion = m1.createResource(uri + questionName);                  
      sentenceFromUser.addSubClass(newResQuestion);     

      OntClass savedQuestion = m1.getOntClass(uri + questionName);                 

      savedQuestion.addSuperClass(createHasValue(uri, "hasWordOnFirst", words[0], m1)); 
      for (int counter = 1; counter < words.length; counter++) {    
       OntClass newSuperClass = createHasValue(uri, "hasWord", words[counter], m1); 
       if(newSuperClass != null) { 
        savedQuestion.addSuperClass(newSuperClass); 
       } 
       else { 
        if(state.equals("learn")) {            
         OntClass word = m1.getOntClass(uri + "Word"); 

         ExtendedIterator<OntClass> subClasses = word.listSubClasses(); 

         while(subClasses.hasNext()) { 
          OntClass sc = subClasses.next(); 
          String subClass = sc.getURI().toString().replaceAll(uri, ""); 
          System.out.print(subClass + "\n"); 
          ExtendedIterator<OntClass> subClassesOfSC = sc.listSubClasses(); 
          while(subClassesOfSC.hasNext()) { 
           OntClass scosc = subClassesOfSC.next(); 
           String subClassOfSubClass = scosc.getURI().toString().replaceAll(uri, ""); 
           System.out.print("-" + subClassOfSubClass + "\n"); 
          }       
         }  

         scan = new Scanner(System.in); 
         System.out.println("In which Category would you put '" + words[counter] + "'");                   
         input = scan.nextLine(); 

         OntClass category = m1.getOntClass(uri + input); 

         Individual newWord = m1.createIndividual(uri + words[counter], category); 

         counter--; 
        } 
       } 
      }               

      saveModel(m1, "src/test/new.xml", "RDF/XML"); 

      OntModel m2 = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); 
      m2.read("src/test/new.xml", "RDF/XML");     

      Reasoner r = ReasonerRegistry.getOWLReasoner(); 
      r = r.bindSchema(m2); 

      OntModelSpec ontModelSpec = OntModelSpec.OWL_DL_MEM; 
      ontModelSpec.setReasoner(r); 

      OntModel model = ModelFactory.createOntologyModel(ontModelSpec, m2);    

      OntClass question = model.getOntClass(uri + questionName); 


      ExtendedIterator<OntClass> superClasses = question.listSuperClasses(); 

      output(superClasses, uri);   

      //delete question 
      OntClass oldResQuestion = m2.getOntClass(uri + questionName); 
      if(oldResQuestion != null) { 
       oldResQuestion.remove(); 
      }   

      saveModel(m2, "src/test/new.xml", "RDF/XML"); 
     } 
    } 

輸出功能

public static void output(ExtendedIterator<OntClass> superClasses, String uri) { 
      while(superClasses.hasNext()) { 
       OntResource sc = (OntResource)superClasses.next();      

       if (sc.getURI() != null) {       
        String superClass = sc.getURI().toString().replaceAll(uri, ""); 
        System.out.print(superClass); 
        //String firstSuperClass = question.getSuperClass().getURI().toString().replaceAll(uri, "");  
        switch (superClass) { 
         case "OpenQuestion": 
          System.out.print("open question (W-)\n");      
          return;      
         case "ClosedQuestion": 
          System.out.print("closed question (Yes/No)\n"); 
          return; 
         default:       
          break; 
        } 
       }            

      } 
      return; 
     } 

createHasValue功能

public static OntClass createHasValue(String uri, String propertyName, String individualName, OntModel m) { 
    Property p = m.getProperty(uri + propertyName);    
    try { 
     Individual i = m.getIndividual(uri + individualName.toLowerCase()); 
     return(m.createHasValueRestriction(null, p, i)); 
    } 
    catch (Exception e) { 
     return null; 
    }     
} 

saveModel功能

public static void saveModel(OntModel m, String file, String type) { 
    FileOutputStream outputStream; 
    try { 
     outputStream = new FileOutputStream(file); 
     m. write(outputStream, type); 
    } catch (FileNotFoundException e) {   
     e.printStackTrace(System.out); 
    } finally { 
     m.close(); 
    } 
} 
+0

恩,究竟是什麼不工作?請提供樣本數據+預期結果+實際結果。謝謝 – AKSW

回答

0

我相信這裏有兩個問題:

hasWordOnFirst some what 

的生存需要一個類的表達而不是個人;解析器將推斷what爲一個類,在個人what上進行截取。你的意思是使用oneOf {what}

其次,您對OntModel使用write()。你想寫出推斷的語句嗎?在那種情況下,如write()的javadoc所述,您需要writeAll()