Java 保存本体后出现owl API错误

Java 保存本体后出现owl API错误,java,owl,ontology,owl-api,Java,Owl,Ontology,Owl Api,我正在从事一个java项目,在这个项目中我需要使用本体。 我有一个本体,我可以通过OWLAPI读取其中的内容,但是一旦我想添加一个新实例并向其添加dataProperties,我就不能再使用我的应用程序读取这个本体了。我觉得奇怪的是,它和protégé没关系 输出向我抛出以下错误: Avertissement: StandardWrapperValve[SearchPatient]: Servlet.service() for servlet SearchPatient threw exce

我正在从事一个java项目,在这个项目中我需要使用本体。 我有一个本体,我可以通过OWLAPI读取其中的内容,但是一旦我想添加一个新实例并向其添加dataProperties,我就不能再使用我的应用程序读取这个本体了。我觉得奇怪的是,它和protégé没关系

输出向我抛出以下错误:

Avertissement:   StandardWrapperValve[SearchPatient]: Servlet.service() for servlet SearchPatient threw exception
java.util.NoSuchElementException: No value present
at java.util.Optional.get(Optional.java:135)
at model.Ontology.lambda$null$6(Ontology.java:450)
at java.util.Iterator.forEachRemaining(Iterator.java:116)
at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
at model.Ontology.lambda$searchPatient$7(Ontology.java:449)
at java.util.Iterator.forEachRemaining(Iterator.java:116)
at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
at model.Ontology.searchPatient(Ontology.java:449)
at model.Ontology.getPatientInOntology(Ontology.java:144)
at com.mycompany.mavenwebapphadbpm.SearchPatient.processRequest(SearchPatient.java:57)
at com.mycompany.mavenwebapphadbpm.SearchPatient.doGet(SearchPatient.java:91)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:344)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:316)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:357)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:260)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:188)
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189)
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544)
at java.lang.Thread.run(Thread.java:748)
我已尝试按照OWLAPI示例中的指示进行保存,因此我不知道错误在哪里

这是我用来保存本体的代码:

onto.saveOntology(onto.getFormat(), man.getOntologyDocumentIRI(onto));
以及用于添加数据属性的代码:

public ArrayList<AddAxiom> addDataProperties(ArrayList<Info> data, OWLIndividual patient) {
    ArrayList<AddAxiom> axioms = new ArrayList<>();
    OWLDataFactory df = man.getOWLDataFactory();

    for (Info dp : data) {
        OWLDataProperty hasProp = df.getOWLDataProperty(IRI.create(owlIRI + "#" + dp.getRelation()));
        OWLDataPropertyAssertionAxiom axiom = null;
        System.out.println("Relation : " + dp.getRelation() + " valeur : " + dp.getValue());
        switch (dp.getType()) {
            case "String":
                axiom = df.getOWLDataPropertyAssertionAxiom(hasProp, patient, dp.getValue());
                break;
            case "int":
                axiom = df.getOWLDataPropertyAssertionAxiom(hasProp, patient, Integer.parseInt(dp.getValue()));
                break;
            case "float":
                axiom = df.getOWLDataPropertyAssertionAxiom(hasProp, patient, Float.parseFloat(dp.getValue()));
                break;
            case "boolean":
                if (dp.getValue() == null) {
                    axiom = df.getOWLDataPropertyAssertionAxiom(hasProp, patient, false);
                } else {
                    axiom = df.getOWLDataPropertyAssertionAxiom(hasProp, patient, true);
                }
                break;
        }
        AddAxiom addAxiom = new AddAxiom(onto, axiom);
        axioms.add(addAxiom);

    }

    return axioms;
}
[编辑]

还有使用上述方法的函数,以及我用来保存本体的不同方式

再次感谢你

public void addPatientIndividual(ArrayList<Info> data, String name) {
    OWLDataFactory df = man.getOWLDataFactory();

    // Actor's IRI
    OWLClass actorIRI = df.getOWLClass(IRI.create(owlIRI + "#Patient"));

    // Patient individual
    OWLIndividual patient = df.getOWLNamedIndividual(IRI.create(owlIRI + "#" + name));

    // Create a link between the class patient and the individual
    OWLClassAssertionAxiom type = df.getOWLClassAssertionAxiom(actorIRI, patient);
    // Create the axiom corresponding to the link between the patient and the
    // individual
    AddAxiom axiomType = new AddAxiom(onto, type);
    // Add the former link to the ontology
    man.applyChange(axiomType);

    // Disease individual
    OWLIndividual disease = df.getOWLNamedIndividual(owlIRI + "#" + ((Info) data.get(0)).getValue());
    // Create the property which is already in the owl the name of the patient to
    // the individual
    OWLObjectProperty hasDisease = df.getOWLObjectProperty(owlIRI + "#hasDisease");
    // Link the disease to the patient
    OWLObjectPropertyAssertionAxiom axiomHasDisease = df.getOWLObjectPropertyAssertionAxiom(hasDisease, patient,
            disease);
    // Create the axiom
    AddAxiom addAxiomHasDisease = new AddAxiom(onto, axiomHasDisease);
    // Apply the axiom to the ontology
    man.applyChange(addAxiomHasDisease);

    // Delete the axiom of the disease
    data.remove(data.get(0));

    for (AddAxiom axiom : addDataProperties(data, patient)) {
        man.applyChange(axiom);
    }

    // Save the ontology
    try {
        //System.out.println("coucou");
        //this.onto.saveOntology(); // PLENTE
        //this.getOntology().saveOntology(); // PLENTE
        //this.getOntology().saveOntology(this.getOntology().getFormat()); // PLENTE
        //manager.saveOntology(onto); // NE FAIS RIENT
        //onto.getOWLOntologyManager().saveOntology(onto); // Enregistre puis lecture impossible
        //onto.saveOntology(onto.getFormat(), manager.getOntologyDocumentIRI(onto));
        //System.out.println(manager.getOntologyDocumentIRI(this.getOntology()));
        //System.out.println(owlIRI);
        //System.out.println(onto.getOntologyID().getVersionIRI());
        //man.saveOntology(onto, onto.getFormat().asPrefixOWLDocumentFormat()); // MARCHE TOUJOURS PAS
        //man.saveOntology(onto);
        //this.getOntology().saveOntology(); // MARCHE PAS
        onto.saveOntology(onto.getFormat(), man.getOntologyDocumentIRI(onto));
        System.out.print("Sauvegarde ?????");
    } catch (Exception e) {
        e.printStackTrace();
        System.out.println("-/-/-/-/-/-/-/-/-/-/-/-PLENTE-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-");
    }

} 
[编辑] 搜索病人代码

public Patient searchPatient(String id, OWLReasoner reasoner) {
    Patient pat = new Patient();
    onto.individualsInSignature().forEach(i -> onto.dataPropertiesInSignature().forEach(p -> {
        if (i.getIRI().getRemainder().get().equals(id)) {
            pat.setId(id);

            Set<OWLLiteral> prop = reasoner.getDataPropertyValues(i, p);
            Set<OWLLiteral> values = asUnorderedSet(prop.parallelStream());

            for (OWLLiteral v : values) {
                if (p.getIRI().getRemainder().get().equals("hasFirstName")) {
                    pat.setHasFirstName(v.getLiteral());
                }
                if (p.getIRI().getRemainder().get().equals("hasName")) {
                    pat.setHasName(v.getLiteral());
                }
            }

        }

    }));
    return pat;
}
还有getPatient的代码

public ArrayList<Patient> getPatientInOntology(OWLReasoner reasoner, String individualName) {
    ArrayList<Patient> pats = new ArrayList<>();
    //ArrayList<String> liste = new ArrayList<>();
    onto.classesInSignature().forEach(c -> {
        if (c.getIRI().getFragment().equals(individualName)) {
            patient = c;
        }
    });

    // Display all the individual
    for (OWLNamedIndividual cls : reasoner.getInstances(patient).getFlattened()) {
        //liste.add(cls.getIRI().getRemainder().get());
        //pats.add()

        //System.out.println("cls : " + cls.getIRI().getRemainder().get());
        pats.add(searchPatient(cls.getIRI().getRemainder().get(), reasoner));
    }

    return pats;
}

我从我的案例中知道错误在哪里

事实上,问题在于我使用的方法。在新的OWLAPI中有.getRequires.get替换.getFragment,这是不推荐使用的

在我的代码行中:

pats.add(searchPatient(cls.getIRI().getRemainder().get(), reasoner));
就是那个抛出错误的人。因此,我将其替换为不推荐使用的.getFragment,如下所示:

pats.add(searchPatient(cls.getIRI().getFragment(), reasoner));
如果有人能告诉我这两种方法的区别,我会有兴趣使用更好的代码


感谢您的帮助和时间。

好的,添加DataProperties Fat partie de Ontology.Java,mais je rajoute un peu加上代码si il manque des Information。请添加完整的stacktrace,在这里,您的代码显示没有使用“可选”类型,而这是问题的中心。在尝试在“on.getFormat”中获取本体之前,您是否定义了本体的格式?ontology.getOWLOntologyManager.setOntologyFormatology,新的RDFXMLDocumentFormatFactory.getFormatFactory似乎没有做任何事情,也没有修改本体。我还试着查看glassfish将文件放在哪里,但没有任何变化。你能为searchPatient添加代码吗?在该方法的lambda中访问为空的可选值。它将提供出错情况的上下文。问题不在于弃用,而是GetRequires返回一个可选值,该值可以为空-一些IRI没有片段。例如http://test.com/test 或http://test.com/test1234. 在使用其值之前,您需要检查可选项是否存在。确定!我知道我明白!我将进行更改,使其在不使用.getFragment的情况下工作。谢谢你的帮助