簡體   English   中英

保存本體后出現owl API錯誤

[英]owl API error after saving ontology

我正在一個Java項目中,我需要使用本體。 我有一個本體,可以通過owl api讀取內部內容,但是一旦我想添加一個新實例並向其中添加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)

我已經嘗試按照OWL API示例中的說明進行保存,所以我不知道我的錯誤在哪里。

這是我用來保存本體的代碼:

onto.saveOntology(onto.getFormat(), man.getOntologyDocumentIRI(onto));

以及用於添加dataProperties的代碼:

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-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-");
    }

} 

[編輯] SearchPatient的代碼

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

我從哪里知道我的案例中的錯誤。

實際上問題是我使用的方法。 使用新的owl API,將具有.getRemainder()。get()替換已棄用的.getFragment()。

在我的代碼行:

pats.add(searchPatient(cls.getIRI().getRemainder().get(), reasoner));

是引發錯誤的人。 因此,我將其替換為已棄用的.getFragment(),如下所示:

pats.add(searchPatient(cls.getIRI().getFragment(), reasoner));

如果有人可以向我解釋這兩種方法之間的區別是什么,我將有興趣使用更好的代碼。

感謝您的幫助和時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM