Protege 4 - Сохранение RDF, переформатирование вложенных пустых узлов

Я только что перешел с TopBraid, чтобы попробовать Protege.

У меня есть онтология с некоторым RDF, которая похожа на это:

instances:some_thing1 a semapi:SomeClass ;
                               semapi:hasChainTo (
                                      [ 
                                            a semapi:SomeOtherClass ;
                                            semapi:hasChainTo (
                                                 [ ... ]
                                                 [ ... ]
                                            )
                                      ] 
                              ) .

Идея состоит в том, что этот синтаксис вложенных пустых узлов отлично работает, потому что цепочки становятся очень глубокими, и этот синтаксис является гибким, легко читаемым и удобным в сопровождении, поскольку цепочки могут время от времени меняться и могут добавляться новые цепочки.

Мало того, я уже написал запросы к полученному графику.

Проблема в том, что если я импортирую это в Protege, а затем сразу же сохраняю, результат будет переформатирован примерно так:

   instance:some_thing1 rdf:type semapi:SomeClass ,
                               owl:NamedIndividual ;
                               semapi:hasChainTo [ ] .


   [ rdf:type semapi:SomeClass ;
       semapi:hasChainTo [ ]
   ] .

Полученный RDF полностью разрушает систему запросов, а также другие преимущества использования этого подхода для представления «цепочки».

Есть ли способ обойти это? В противном случае я могу быть вынужден вернуться к TopBraid.

ОБНОВЛЕНИЕ: вот воспроизведение проблемы:

Написал bugTest.ttl потом открываю в Протеже и сразу Сохранить как > Черепаха > bugTestOutput.ttl:

https://dl.dropboxusercontent.com/u/13814624/bugTest.ttl https://dl.dropboxusercontent.com/u/13814624/bugTestOutput.ttl


person parliament    schedule 06.08.2013    source источник
comment
Спасибо за предоставление некоторых образцов данных; они иллюстрируют тип проблемы, с которой вы столкнулись. Если все так, как вы говорите, похоже, что либо TopBraid, либо Protégé теряют важную информацию в процессе сохранения или чтения, и это Плохая вещь. Учитывая серьезность проблемы, можете ли вы привести минимальный пример (полные RDF-файлы), иллюстрирующий эту проблему? Часто попытка воспроизвести проблему в минимальном виде обнаружит проблему с вашей стороны, которая не была очевидна раньше, или послужит очень хорошим образцом для отправки соответствующим разработчикам.   -  person Joshua Taylor    schedule 06.08.2013
comment
Кроме того, это похоже на проблему либо в TopBraid, либо в Protégé, но не в обоих. Если есть какая-то RDF-сериализация онтологии, которую Protégé искажает, она должна делать это независимо от того, какое приложение ее создало. Точно так же, если TopBraid производит мусор, он должен делать это независимо от того, кто будет его потреблять.   -  person Joshua Taylor    schedule 06.08.2013
comment
Спасибо за ответ. Сейчас попробую воспроизвести проблемные моменты.   -  person parliament    schedule 06.08.2013
comment
@JoshuaTaylor Я обновил OP файлами воспроизведения. Спасибо, что изучили это.   -  person parliament    schedule 06.08.2013


Ответы (1)


Короче говоря, ваша онтология не является действительной онтологией OWL, и Protégé следует принципу «мусор на входе, мусор на выходе». Поскольку на вход поступают неверные данные (хотя Protégé пытается их спасти), вы получаете неверные данные (на самом деле, только восстановленные данные). Вы можете проверить онтологию с помощью Manchester OWL Validator, но вам нужно будет выбрать профиль OWL 2 DL, чтобы получить соответствующую диагностику. В вашем документе вывод:

Онтология и/или один из ее импортов НЕ находится в профиле OWL 2 DL.

Закрытие импорта

Ontology IRI                                         Physical URI
OntologyID(OntologyIRI(<http://ideation.io/semapi>))

Подробный отчет

Использование зарезервированного словаря для класса IRI

SubClassOf(semapi:BaseClass rdfs:Class)

Использование необъявленного класса

SubClassOf(semapi:BaseClass rdfs:Class)

Помимо того, что у вас есть тройка:

<http://ideation.io/semapi>
      a       owl:Ontology .

в первом файле это вообще не похоже на онтологию OWL. Например.,

semapi:BaseClass a rdfs:Class; 
                 rdfs:subClassOf rdfs:Class .

определяет некоторые классы, которые можно использовать в словаре RDFS, но не объявляет никаких owl:Classes. Когда вы делаете что-то вроде

semapi:hasChainTo a owl:ObjectProperty; 
                  rdfs:domain semapi:BaseClass;
                  rdfs:range  semapi:BaseClass .

У вас есть owl:ObjectProperty, которое будет связывать semapi:BaseClasses, каждое из которых также является rdfs:Class, поэтому у вас есть свойство объекта, которое будет связывать rdfs:Classes, но в OWL DL свойства объекта могут связывать только отдельных людей. Где вы начинаете использовать списки RDF, т.е. в:

instances:Instance1 a semapi:DerivedClass;
                        semapi:hasChainTo (
                            [
                                a semapi:DerivedClass;
                                semapi:hasChainTo (
...

вы используете список RDF в качестве объекта в утверждении свойства объекта. Однако списки RDF нельзя использовать в OWL DL, поскольку они также используются в RDF-сериализации OWL. Тогда может показаться, что Protégé отбрасывает кучу информации, которая не имеет для него значения как сериализация RDF онтологии OWL. Можно возразить, что, когда Protégé не знает, что делать с некоторым RDF-файлом, который приходит, он должен его сохранить, но это действительно несостоятельная позиция, когда RDF — это всего лишь одна из возможных сериализаций сериализованного объекта (онтология OWL). что касается Protégé.

Инструмент lint компании Pellet выдает ряд предупреждений:

[Untyped classes]
- http://ideation.io/semapi#DerivedClass
- http://ideation.io/semapi#BaseClass
- http://www.w3.org/2000/01/rdf-schema#Class

[Untyped individuals]
- 6 BNode(s)

[Using rdfs:Class instead of owl:Class]
- http://ideation.io/semapi#DerivedClass
- http://ideation.io/semapi#BaseClass



=========================================================
OWL 2 DL violations found for ontology <http://ideation.io/semapi>:
Use of undeclared class: <http://ideation.io/semapi#BaseClass> [ObjectPropertyRange(<http://ideation.io/semapi#hasChainTo> <http://ideation.io/semapi#BaseClass>) in <http://ideation.io/semapi>]
Use of undeclared class: <http://ideation.io/semapi#DerivedClass> [ClassAssertion(<http://ideation.io/semapi#DerivedClass> _:genid5) in <http://ideation.io/semapi>]
Use of undeclared class: rdfs:Class [SubClassOf(<http://ideation.io/semapi#BaseClass> rdfs:Class) in <http://ideation.io/semapi>]
Use of undeclared class: <http://ideation.io/semapi#DerivedClass> [ClassAssertion(<http://ideation.io/semapi#DerivedClass> _:genid11) in <http://ideation.io/semapi>]
Use of undeclared class: <http://ideation.io/semapi#BaseClass> [SubClassOf(<http://ideation.io/semapi#DerivedClass> <http://ideation.io/semapi#BaseClass>) in <http://ideation.io/semapi>]
Use of undeclared class: <http://ideation.io/semapi#DerivedClass> [ClassAssertion(<http://ideation.io/semapi#DerivedClass> _:genid9) in <http://ideation.io/semapi>]
Use of undeclared class: <http://ideation.io/semapi#BaseClass> [SubClassOf(<http://ideation.io/semapi#BaseClass> rdfs:Class) in <http://ideation.io/semapi>]
Use of undeclared class: <http://ideation.io/semapi#DerivedClass> [ClassAssertion(<http://ideation.io/semapi#DerivedClass> _:genid1) in <http://ideation.io/semapi>]
Use of undeclared class: <http://ideation.io/semapi#BaseClass> [ObjectPropertyDomain(<http://ideation.io/semapi#hasChainTo> <http://ideation.io/semapi#BaseClass>) in <http://ideation.io/semapi>]
Use of undeclared class: <http://ideation.io/semapi#DerivedClass> [ClassAssertion(<http://ideation.io/semapi#DerivedClass> _:genid7) in <http://ideation.io/semapi>]
Use of reserved vocabulary for class IRI: rdfs:Class [SubClassOf(<http://ideation.io/semapi#BaseClass> rdfs:Class) in <http://ideation.io/semapi>]
Use of undeclared class: <http://ideation.io/semapi#DerivedClass> [ClassAssertion(<http://ideation.io/semapi#DerivedClass> _:genid3) in <http://ideation.io/semapi>]
Use of undeclared class: <http://ideation.io/semapi#DerivedClass> [SubClassOf(<http://ideation.io/semapi#DerivedClass> <http://ideation.io/semapi#BaseClass>) in <http://ideation.io/semapi>]
Use of undeclared class: <http://ideation.io/semapi#DerivedClass> [ClassAssertion(<http://ideation.io/semapi#DerivedClass> <http://ideation.io/instances#Instance1>) in <http://ideation.io/semapi>]


No OWL lints found for ontology <http://ideation.io/semapi>.

<http://ideation.io/semapi> does not import other ontologies.
person Joshua Taylor    schedule 06.08.2013
comment
Спасибо, что прояснили это, это имеет большой смысл. Можете ли вы предложить какие-либо предложения для продвижения вперед? Я планировал использовать механизм рассуждений AllegroGraph RDFS++, поэтому в настоящее время у меня нет веских причин даже использовать OWL. На самом деле я пытался избежать этого, но я не знаю, как избежать использования, например, owl:ObjectProperty, поэтому я просто использовал его. Если я удалю заголовок ... a owl:Ontology, но он все равно захлебнется в списке. Как я могу просто двигаться дальше (кроме TopBraid) так как нет времени на ломать изменения в течение как минимум недели. - person parliament; 06.08.2013
comment
@parliament 1) Есть ли причина, по которой вы вообще пытаетесь загрузить вещи в Protégé? Если вы попытаетесь передать документ через инструмент с поддержкой OWL (например, Protégé), вы, вероятно, получите искаженные результаты. 2) Если вы просто хотите объявить, что что-то является свойством, просто скажите, что <something> rdf:type rdf:Property (см. rdf:Property в рекомендации схемы RDF). - person Joshua Taylor; 06.08.2013
comment
@parliament Тем не менее, вы должны отметить, что даже если вы делаете hasChainTo a rdf:Property ; rdfs:domain BaseClass ; rdfs:range BaseClass, у вас есть в данных вашего экземпляра тройка instance1 hasChainTo ( ... ), что означает, что некоторый список RDF также будет выведен как экземпляр BaseClass. Это то, что вы намеревались? - person Joshua Taylor; 06.08.2013
comment
@parliament На самом деле, взглянув еще раз, у меня есть еще один вопрос: почему вы вообще используете списки? Не похоже, что вы используете какие-либо списки длиной больше единицы, поэтому, если вы на самом деле пытаетесь сказать instance hasChainTo [ a NotherClass ; hasChainTo [ a YetAnotherClass ; hasChainTo [ ... ] ] ], вы можете... - person Joshua Taylor; 07.08.2013
comment
Джошуа, это был минимальный пример, который я использовал, чтобы воспроизвести проблему. На самом деле списки имеют длину › 1, и действительно существует много производных классов, подобных описанным вами. В разделе Начало работы (protege.stanford.edu/doc/owl/getting-started. html), если вы посмотрите на шаг 5, он попросит выбрать языковой профиль с параметрами, включая Owl, Owl DL, RDF Schema и Owl. Однако я не могу найти никаких следов выбора этой опции в Protege. Есть ли способ сделать его несовместимым с OWL? Я просто хотел оценить альтернативу TopBraid; Вы говорите, что я не могу работать в нем, если я не нацелен на Сову? - person parliament; 07.08.2013
comment
Я попытался изменить owl:ObjectProperty на rdf:Property и удалить заголовок ... a owl:Ontology. В этот момент нет упоминания о сове, но она все еще калечит ее (не говоря уже об изменении некоторых тегов тегов на owl:.... - person parliament; 07.08.2013
comment
Я думаю, что эта документация предназначена для Protégé серии 3.x, которая поддерживает больше типов онтологий. (Несмотря на то, что версия устарела, похоже, что есть еще текущая версия.) >страница загрузки говорит, что «[Protégé Desktop 3.5] поддерживает онтологии OWL 1.0, RDF(S) и Frames». Я почти уверен, что эти скриншоты из серии 3.x. - person Joshua Taylor; 07.08.2013
comment
Хорошо, рад слышать, что списки содержат несколько элементов в реальных данных. Тем не менее, когда у вас есть p rdfs:range C и x p y, следует, что y rdf:type C. У вас есть x p (C1 C2 ...), что означает, что вы получите (C1 C2 ...) rdf:type C, что говорит о том, что список имеет тип C, а не элементы списка. То есть вы не получаете C1 rdf:type C, C2 rdf:type C и так далее. Даже если rdf:type «распределил» по спискам, поскольку и Ci, и C являются классами, кажется, что вам могут понадобиться C1 rdfs:subClassOf C, C2 rdfs:subClassOf C и так далее. - person Joshua Taylor; 07.08.2013
comment
Спасибо за это наблюдение. Я не знал, что тип не будет распространяться на элементы в списке. Я понял, что я был покрыт объявлением типа ([ a semapi:DerivedClass; ... ]) внутри каждого элемента списка. Я задал новый вопрос здесь, так как этот ответ более чем достаточно хорош. Еще раз спасибо stackoverflow.com/q/18108667/1267778 - person parliament; 07.08.2013