OWL-API: определить формат совы на основе ее строкового содержимого.

У меня есть файлы с совами в разных форматах (RDF/XML, Turtle, Manchester OWL Syntax). Я хочу определить формат на основе его содержимого, поскольку у разных форматов есть свой стиль.

E.g

RDF/XML:

<?xml version="1.0"?>
<!DOCTYPE rdf:RDF [
<!ENTITY owl "http://www.w3.org/2002/07/owl#" >
<!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" >
<!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" >
<!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" >]>
<rdf:RDF
xmlns="namespace#"
xml:base="namespace"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
<owl:Ontology rdf:about="namespace"/>
<!-- namespace#my1 -->
<owl:ObjectProperty rdf:about="namespace#my1"/>
<!-- namespace#my2 -->
<owl:ObjectProperty rdf:about="namespace#my2"/>
<!-- namespace#prop1 -->
<owl:DatatypeProperty rdf:about="namespace#prop1"/>
<!-- namespace#prop2 -->
<owl:DatatypeProperty rdf:about="namespace#prop2"/>
<!-- namespace#A -->
<owl:Class rdf:about="namespace#A"/>
<!-- namespace#B -->
<owl:Class rdf:about="namespace#B"/>
<!-- namespace#C -->
<owl:Class rdf:about="namespace#C"/>
<!-- namespace#P -->
<owl:Class rdf:about="namespace#P"/>
</rdf:RDF>

Синтаксис Manchester OWL:

Prefix: : <namespace#>
Prefix: owl: <http://www.w3.org/2002/07/owl#>
Prefix: rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
Prefix: xml: <http://www.w3.org/XML/1998/namespace>
Prefix: xsd: <http://www.w3.org/2001/XMLSchema#>
Prefix: rdfs: <http://www.w3.org/2000/01/rdf-schema#>
Ontology: <namespace>
ObjectProperty: my2
ObjectProperty: my1
DataProperty: prop2
DataProperty: prop1
Class: B
Class: A
Class: P 
Class: C

Поэтому, хотя у меня есть два файла с одинаковым именем myOntology.owl, я могу определить его формат на основе вышеуказанного содержимого (просто открыв его в редакторе). Как это сделать с помощью OWL-API в JAVA? Также, как методы загрузки из OWLOntologyManager различают их?


person SuhasD    schedule 13.07.2016    source источник
comment
Я не уверен в этом на 100%, но я думаю, что один из подходов, используемых некоторыми инструментами (например, Protege), состоит в том, чтобы просто попытаться загрузить его как каждый из различных поддерживаемых форматов (RDF/XML, OWL/XML, TTL, Manchester и т. д.), пока не сработает один из них или все они не выйдут из строя. Если это удастся, то, вероятно, это был правильный формат. Очень маловероятно, что более чем один файл будет правильным в более чем одном формате (за исключением некоторых тривиальных случаев, когда файл пуст, просто пробелы и т. д.).   -  person Joshua Taylor    schedule 13.07.2016
comment
Как тогда работает метод loadOntologyFromOntologyDocument из OWLOntologyManager? Поскольку он принимает файл в виде потока прямо. Поэтому я попытался создать StreamDocumentSource и найти его формат. Но метод isFormatKnown() дает FALSE. И как я могу сделать загрузку в разных форматах?   -  person SuhasD    schedule 13.07.2016
comment
Подход, который я упомянул, является одним возможным подходом, который можно использовать, когда формат неизвестен. Если вы действительно знаете формат заранее, то, конечно, вы можете заранее выбрать подходящий парсер.   -  person Joshua Taylor    schedule 13.07.2016
comment
немного сомневаюсь (я не знаю формат документа), можно ли загружать онтологию в разных форматах (думаю, метод загрузки справляется со всем этим). Я имею в виду, есть ли какие-либо методы, которые также принимают формат документа, поэтому я могу попробовать метод проб и ошибок для его загрузки.   -  person SuhasD    schedule 13.07.2016
comment
Джошуа прав, подход в owl API заключается в том, чтобы пробовать парсеры последовательно. Форматы являются взаимоисключающими, за исключением OBO, который допускает заголовок с манчестерским синтаксисом.   -  person Ignazio    schedule 13.07.2016


Ответы (1)


К сожалению, сериализации OWL не имеют явных маркеров, как в других форматах.

OWL API просто пробует все известные ему форматы, пока не пройдет один из них; это не всегда эффективно, но другого способа сделать это нет.

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

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

person Ignazio    schedule 13.07.2016
comment
Можно ли проверить формат файла с помощью парсеров перед его загрузкой? Например, есть ли какой-либо метод, который принимает файл ИЛИ строку и возвращает его формат? - person SuhasD; 14.07.2016
comment
В вычислительном отношении проверка формата файла и его загрузка для парсера — одно и то же. - person Ignazio; 14.07.2016
comment
Поэтому я должен загрузить онтологию, до этого я не могу проверить ее формат. - person SuhasD; 14.07.2016