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
затем откройте его в Protege и сразу же сохраните как> черепаха> bugTestOutput.ttl
:
https://dl.dropboxusercontent.com/u/13814624/bugTest.ttl https://dl.dropboxusercontent.com/u/13814624/bugTestOutput.ttl
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:Class
эс. Когда вы делаете что-то вроде
semapi:hasChainTo a owl:ObjectProperty;
rdfs:domain semapi:BaseClass;
rdfs:range semapi:BaseClass .
У вас есть owl:ObjectProperty
это будет связано semapi:BaseClass
ES, каждый из которых также является rdfs:Class
, так что у вас есть свойство объекта, которое будет связано rdfs:Class
Да, но в 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) что протеже обеспокоен.
Pellet-х lint
Инструмент выдает ряд предупреждений:
[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.