Преобразовать строку в сложную аксиому OWL

Я пытаюсь разобрать строки обратно в аксиомы OWL, используя OWLFunctionalSyntaxParser на основе это пример. Это прекрасно работает для простых аксиом, например. ObjectPropertyAssertionAxiom. Для следующей аксиомы (где prefix: является аббревиатурой URL для ясности здесь)

EquivalentClasses(<prefix:LeucocytesRestricted> ObjectIntersectionOf(<prefix:Leucocytes> DataSomeValuesFrom(<prefix:hasLeucocytesValue> DataRangeRestriction(xsd:double facetRestriction(minInclusive \"20.0\"^^xsd:double)))) )

Я получаю следующее исключение

org.coode.owlapi.functionalparser.ParseException: Encountered "" at line 1, column 260.
Was expecting one of:

    at org.coode.owlapi.functionalparser.OWLFunctionalSyntaxParser.generateParseException(OWLFunctionalSyntaxParser.java:5335)
    at org.coode.owlapi.functionalparser.OWLFunctionalSyntaxParser.jj_consume_token(OWLFunctionalSyntaxParser.java:5194)
    at org.coode.owlapi.functionalparser.OWLFunctionalSyntaxParser.DataRange(OWLFunctionalSyntaxParser.java:761)
    at org.coode.owlapi.functionalparser.OWLFunctionalSyntaxParser.DataSomeValuesFrom(OWLFunctionalSyntaxParser.java:531)
    at org.coode.owlapi.functionalparser.OWLFunctionalSyntaxParser.ClassExpression(OWLFunctionalSyntaxParser.java:310)
    at org.coode.owlapi.functionalparser.OWLFunctionalSyntaxParser.ClassExpressionSet(OWLFunctionalSyntaxParser.java:339)
    at org.coode.owlapi.functionalparser.OWLFunctionalSyntaxParser.ObjectIntersectionOf(OWLFunctionalSyntaxParser.java:383)
    at org.coode.owlapi.functionalparser.OWLFunctionalSyntaxParser.ClassExpression(OWLFunctionalSyntaxParser.java:290)
    at org.coode.owlapi.functionalparser.OWLFunctionalSyntaxParser.ClassExpressionSet(OWLFunctionalSyntaxParser.java:339)
    at org.coode.owlapi.functionalparser.OWLFunctionalSyntaxParser.EquivalentClasses(OWLFunctionalSyntaxParser.java:932)
    at org.coode.owlapi.functionalparser.OWLFunctionalSyntaxParser.ClassAxiom(OWLFunctionalSyntaxParser.java:901)
    at org.coode.owlapi.functionalparser.OWLFunctionalSyntaxParser.Axiom(OWLFunctionalSyntaxParser.java:867)
    at be.ugent.ontal.ontology.ConflictDetector.stringToAxiom(ConflictDetector.java:125)
    at be.ugent.ontal.ontology.ConflictDetector.addClassAxiom(ConflictDetector.java:74)
    at be.ugent.ontal.facade.command.AddClassAxiomCommand.execute(AddClassAxiomCommand.java:27)
    at be.ugent.ontal.facade.Invoker.storeAndExecute(Invoker.java:13)
    at be.ugent.ontal.facade.MyWebSocket.onText(MyWebSocket.java:112)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.eclipse.jetty.websocket.common.events.annotated.CallableMethod.call(CallableMethod.java:71)
    at org.eclipse.jetty.websocket.common.events.annotated.OptionalSessionCallableMethod.call(OptionalSessionCallableMethod.java:68)
    at org.eclipse.jetty.websocket.common.events.JettyAnnotatedEventDriver.onTextMessage(JettyAnnotatedEventDriver.java:209)
    at org.eclipse.jetty.websocket.common.message.SimpleTextMessage.messageComplete(SimpleTextMessage.java:69)
    at org.eclipse.jetty.websocket.common.events.AbstractEventDriver.appendMessage(AbstractEventDriver.java:64)
    at org.eclipse.jetty.websocket.common.events.JettyAnnotatedEventDriver.onTextFrame(JettyAnnotatedEventDriver.java:201)
    at org.eclipse.jetty.websocket.common.events.AbstractEventDriver.incomingFrame(AbstractEventDriver.java:160)
    at org.eclipse.jetty.websocket.common.WebSocketSession.incomingFrame(WebSocketSession.java:309)
    at org.eclipse.jetty.websocket.common.extensions.ExtensionStack.incomingFrame(ExtensionStack.java:214)
    at org.eclipse.jetty.websocket.common.Parser.notifyFrame(Parser.java:220)
    at org.eclipse.jetty.websocket.common.Parser.parse(Parser.java:258)
    at org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection.readParse(AbstractWebSocketConnection.java:613)
    at org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection.onFillable(AbstractWebSocketConnection.java:468)
    at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:620)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:540)
    at java.lang.Thread.run(Thread.java:745)

Я также пробовал parser.EquivalentClasses(), но это тоже не работает. Есть ли способ разобрать такое сложное выражение? Конечная цель — получить объект OWLEquivalentClassesAxiom, представляющий эту строку.

Заранее спасибо!

РЕДАКТИРОВАТЬ:

Это код, который я сейчас использую

InputStream in = new ByteArrayInputStream(axiom.getBytes());

OWLFunctionalSyntaxParser parser = new OWLFunctionalSyntaxParser(in);
parser.setUp(ontology, new OWLOntologyLoaderConfiguration());

try {
    System.out.println(axiom);
    output.add(parser.Axiom());
} catch(Exception e) {
    e.printStackTrace();
}

person Community    schedule 09.03.2015    source источник
comment
Пример, на который вы ссылаетесь, относится к 2009 году, поэтому, вероятно, он использовал OWLAPI для OWL 1. Какую версию вы используете и можете ли вы опубликовать код, который вы используете?   -  person Ignazio    schedule 10.03.2015
comment
Я добавил код как редактировать. В настоящее время я работаю с owlapi 3.4.4.   -  person    schedule 10.03.2015
comment
Строка ввода, которую вы показываете, имеет длину 226 символов, и ошибка сообщается в столбце 260 — я предполагаю, что изменение зависит от сокращения IRI для публикации здесь. Как указано в ответе, код выглядит нормально.   -  person Ignazio    schedule 10.03.2015


Ответы (1)


Я подозреваю, что в вашем входном потоке есть синтаксическая ошибка. Я приготовил случайный пример, и он, кажется, работает:

    String axiom="EquivalentClasses(:TestPizza ObjectIntersectionOf(DataMinCardinality(20 :hasToppingValue xsd:double) :Pizza))";
    InputStream in = new ByteArrayInputStream(axiom.getBytes());

    OWLFunctionalSyntaxParser parser;
    parser = new OWLFunctionalSyntaxParser(in);
    parser.setUp(localOntology,new OWLOntologyLoaderConfiguration());
    DefaultPrefixManager nsm=new DefaultPrefixManager("http://www.co-ode.org/ontologies/pizza/pizza.owl#");
    parser.setPrefixes(nsm);
     try {
        OWLClassAxiom temp=parser.EquivalentClasses();
        System.out.println(axiom);
        System.out.println(temp);
    } catch ( ParseException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
person Artemis    schedule 10.03.2015
comment
Для ввода я использую функциональный синтаксис, как здесь, но я все равно получил исключение. Ввод EquivalentClasses(<http://www.uzalerting.intec.ugent.be/leucocytes#LeucocytesRestricted> ObjectIntersectionOf(<http://www.uzalerting.intec.ugent.be/leucocytes#Leucocytes> DataSomeValuesFrom(<http://www.uzalerting.intec.ugent.be/leucocytes#hasLeucocytesValue> DatatypeRestriction(xsd:double xsd:maxExclusive "20"^^xsd:double )))) и ошибка Encountered " "DataSomeValuesFrom" "DataSomeValuesFrom "" at line 1, column 172 - person ; 10.03.2015
comment
Я думаю, что у вас где-то смысловая ошибка. Я только что написал это, и это работает. Я думаю, вы должны разделить свой префикс: String axiom=EquivalentClasses(:LeucocytesRestricted + ObjectIntersectionOf(:Leucocytes + DataSomeValuesFrom(:hasLeucocytesValue + DatatypeRestriction(xsd:double + xsd:maxExclusive \20\^^xsd:double ))))); - person Artemis; 10.03.2015
comment
Какую версию owlapi вы используете? Потому что даже для онтологии пиццы я получаю исключения парсера. - person ; 10.03.2015
comment
Я использую OWL API 4.0.1. - person Artemis; 10.03.2015
comment
Я пытаюсь использовать ту же версию (4.0.1), но получаю сообщение об ошибке. Тип org.semanticweb.owlapi.functional.parser.OWLFunctionalSyntaxParser не виден, когда я пытаюсь импортировать его в свой класс. Итак, я пытаюсь понять, что не так, потому что OWLFunctionalSyntaxParser не является закрытым классом, если вы посмотрите на исходники. - person ; 13.03.2015
comment
Вы ставите точно такой же код? Если вы отредактируете свой вопрос с кодом, который выдает исключение, я могу посмотреть. - person Artemis; 13.03.2015
comment
Я скопировал ваш код вместе с аксиомой из второго комментария. Я работаю с Bndtools в OSGi, поэтому я пытаюсь выяснить, неправильно ли я настраиваю свойства своего пакета и, возможно, это может как-то вызвать проблемы. - person ; 13.03.2015
comment
Я все еще думаю, что если вы перепишете свою аксиому и отделите префикс, ваша проблема будет решена. Я думаю, что эта аксиома, которую вы написали, имеет проблему, и ваша копия-вставка вызывает все проблемы. - person Artemis; 13.03.2015