【问题标题】:Reasoner in jena doesn't work耶拿的推理机不起作用
【发布时间】:2017-08-24 12:53:50
【问题描述】:

好的,我有一个 xml 文件,其中存储了超类“SentenceFromUser”和一些随机问题的子类(比如“你在做什么”)(有限制:

hasWordOnFirst 一些什么

等等

什么是个体)

然后我有 定义 超类,称为 OpenQuestion 和 ClosedQuestion。在这段代码中,我想看看我的问题将在这两个超类中的哪一个中排序。在 Protege 中,我可以启动 Reasoner 并立即得到哪种问题。但是对于 Jena,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;
    }                   
}

保存模型功能

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();
    }
}

【问题讨论】:

  • Ehm,究竟是什么不起作用?请提供样本数据+预期结果+实际结果。谢谢

标签: java jena owl protege reasoner


【解决方案1】:

我认为这里有两个问题:

hasWordOnFirst some what

一个存在需要一个阶级表达而不是一个个体;解析器将推断what 是一个类,对个人what 进行双关语。你的意思是使用oneOf {what}

其次,您将write() 用于OntModel。你想写出推断的陈述吗?在这种情况下,正如 write() 的 javadoc 所说,您需要 writeAll()

【讨论】:

    猜你喜欢
    • 2010-10-13
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    相关资源
    最近更新 更多