Как извлечь свойства объекта из выражения класса, определенного в разделе «Эквивалентный» класса совы в Java? - PullRequest
0 голосов
/ 24 марта 2019

Я определил (в Protege) класс Missing, который эквивалентен ((not (atHome value 30)) и (not (atWork value 30))) и (not (onleave value 30)). Используя OWL-API, я хотел бы получить свойства одиночного объекта (в данном случае свойства объекта с отрицанием) из выражения класса , чтобы дополнительно получить их домены и диапазоны и выполнить дальнейшие рассуждения. Однако я не уверен, как анализировать все эквивалентные выражения классов в Java.

На данный момент я могу получить эквивалентное выражение класса (в данном случае отсутствует) в функциональной форме с помощью следующего кода.

localOntology.getEquivalentClassesAxioms(missingClass);

Предоставленный код возвращает функциональное представление выражения класса эквивалентности, которое я предоставил в Protege, однако я не могу его проанализировать и извлечь не (значение atWork 30), нет (значение atHome 30), нет (значение onleave 30 ), что я и хотел бы.

1 Ответ

0 голосов
/ 30 марта 2019
  • Первый.В описанной выше онтологии IRI atHome, atWork и onleave являются не свойствами объекта, а свойствами данных, поскольку atHome value 30 является ограничением литерального значения , которое имеет свойство типа данных, а не объектимущество.Если, конечно, это не Punning .

  • В OWL-API v5, метод OWLOntology#getEquivalentClassesAxioms(OWLClass) устарел.Вместо этого рекомендуется использовать его компаньон Java-Stream-API: OWLOntology#equivalentClassesAxioms(OWLClass)

  • При использовании этого метода решение (получение всех свойств данных для указанного класса OWL) может выглядеть следующим образом:

    o.equivalentClassesAxioms(c) .flatMap(OWLNaryClassAxiom::operands) .filter(x -> x instanceof OWLObjectComplementOf) .map(x -> ((OWLObjectComplementOf) x).getOperand()) .filter(x -> x instanceof OWLDataHasValue) .flatMap(x -> ((OWLDataHasValue) x).components()) .filter(x -> x instanceof OWLDataProperty) .forEach(System.out::println);

  • то же самое можно переписать с помощью стандартного API Java Collections, но более громоздко.

  • Также, можно использовать служебные инструменты org.semanticweb.owlapi.util.OWLObjectComponentCollector или org.semanticweb.owlapi.util.OWLEntityCollector, но в этих конкретных случаях все компоненты объединяются в один Set, поэтому необходимо отфильтровать результат:

    o.equivalentClassesAxioms(c) .flatMap(a -> new OWLObjectComponentCollector().getComponents(a) .stream().filter(x -> x instanceof OWLDataProperty)) .forEach(System.out::println);

  • создайте свой собственный org.semanticweb.owlapi.util.AbstractCollectorEx impl для сбора только свойств данных.

...