Вывод обратного свойства в Protege

#ontology #protege #inference

#онтология #protege #вывод

Вопрос:

Я создал отношение A 'is functional parent of' B и определил 'has functional parent' как обратное 'is functional parent of' . 'A' и 'B' оба являются подклассами 'chemical entity' .

Я хочу, чтобы Protege выводил B 'has functional parent' A . Запрос 'has functional parent' some A завершается с ошибкой.

Ошибка № 1: непонимание открытого мира

Я понял, что это some подразумевает, что не все B имеют отношение 'has functional parent' к 'A' . Однако запрос 'chemical entity' and 'has functional parent' по-прежнему выполняется с ошибкой.

В моей онтологии нет экземпляров. Я надеялся, что запрос найдет подклассы.

Черепаший файл

 @prefix : <http://www.semanticweb.org/michaelchary/ontologies/2020/8/untitled-ontology-10#> .
@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#> .
@base <http://www.semanticweb.org/michaelchary/ontologies/2020/8/untitled-ontology-10> .

<http://www.semanticweb.org/michaelchary/ontologies/2020/8/untitled-ontology-10> rdf:type owl:Ontology .

#################################################################
#    Object Properties
#################################################################

###  http://www.semanticweb.org/michaelchary/ontologies/2020/8/untitled-ontology-10#hasFunctionalParent
:hasFunctionalParent rdf:type owl:ObjectProperty ;
                     owl:inverseOf :isFunctionalParentOf .


###  http://www.semanticweb.org/michaelchary/ontologies/2020/8/untitled-ontology-10#isFunctionalParentOf
:isFunctionalParentOf rdf:type owl:ObjectProperty .


#################################################################
#    Classes
#################################################################

###  http://www.semanticweb.org/michaelchary/ontologies/2020/8/untitled-ontology-10#A
:A rdf:type owl:Class ;
   rdfs:subClassOf :Z ,
                   [ rdf:type owl:Restriction ;
                     owl:onProperty :isFunctionalParentOf ;
                     owl:someValuesFrom :B
                   ] .


###  http://www.semanticweb.org/michaelchary/ontologies/2020/8/untitled-ontology-10#B
:B rdf:type owl:Class ;
   rdfs:subClassOf :Z .


###  http://www.semanticweb.org/michaelchary/ontologies/2020/8/untitled-ontology-10#Z
:Z rdf:type owl:Class .


###  Generated by the OWL API (version 4.5.9.2019-02-01T07:24:44Z) https://github.com/owlcs/owlapi
  

Комментарии:

1. Пожалуйста, добавьте минимальную онтологию, иллюстрирующую проблему, с которой вы столкнулись.

2. @HenrietteHarmse Я добавил минимальную онтологию в синтаксис Turtle.

3. Этот файл .ttl выдает ошибку, когда я пытаюсь открыть его в Protege. Пожалуйста, укажите точный файл, который вы использовали в Protege.

4. @HenrietteHarmse загрузил точный файл TTL из Protege

Ответ №1:

Из аксиом, которые вы указали в своей онтологии, нет абсолютно ничего, из чего рассуждающий мог бы это вывести B hasFunctionalParent A .

Чтобы понять, почему это так, полезно думать в терминах отдельных лиц, даже если ваша онтология не включает никаких явных отдельных лиц. Когда программа reasoner запускается, она пытается сгенерировать модель, основанную на аксиомах в онтологии. Модель состоит из сгенерированных элементов, которые соответствуют аксиомам вашей онтологии.

Для иллюстрации предположим, что вселенная индивидуумов состоит из следующих чисел:

Домен = {0, 1, 2, 3, 4, 5, 6, 7} ,

Z = {1, 2, 3, 5, 6, 7} ,

A = {5, 7} и

B = {2, 3, 6}

Тогда у вас есть свойство объекта hasFunctionalParent с обратным. Для краткости я буду ссылаться на hasFunctionalParent as R и его обратное значение as invR . Что означает R и invR ? В основном говорится, что когда 2 человека в нашем домене связаны через R , они также связаны через invR . То есть, если у нас есть R(1, 2) , то invR(2, 1) также выполняется.

Утверждение, что A subClassOf invR some B подразумевает, что каждый индивидуум A invR связан через B , по крайней мере, с 1 индивидуумом из, по крайней мере, 1. Таким образом, если у нас есть invR(5, 2) и invR(7, 3) , у нас также будет R(2, 5) и R(3, 7) . Однако это ничего не говорит о классе B в целом. Вполне возможно, что R(6, 0) выполняется. Поэтому логик не может сделать такой вывод B hasFunctionalParent A .

Чтобы получить B и Z для запроса «найти суперклассы hasFunctionalParent some B » (это означает, что «суперклассы» должны быть отмечены в Protege при выполнении запроса), вы должны указать, что isFunctionalParentOf имеет домен A и диапазон B . Это гласит, что всякий раз, когда 2 человека x и y связаны через isFunctionalParentOf , мы можем предположить, что x является экземпляром A и y является экземпляром B .

Наконец, вы заметите, что вам нужно будет использовать вкладку DL query в Protege, чтобы перейти к этому выводу. В частности, это не показано как часть выводов после рассуждения. Почему это? Это потому, что Protege показывает только выводы из именованных классов. hasFunctionalParent some B является анонимным классом, поэтому этот вывод не показан. Хитрость, позволяющая показать это в Protege, заключается в добавлении произвольной концепции, скажем, X , которую вы задаете как эквивалентную hasFunctionalParent some B . Если вы сейчас запустите reasoner, Protege сделает это вывод X subClassOf B .

Комментарии:

1. Большое вам спасибо. Я вижу свою ошибку, но суть моего первоначального вопроса остается. Что, если есть три класса A, B, C, и я хочу вывести invR (B, A) и invR (B, C) из R (A,B) и R (B, C)? Если я установлю домен R как пересечение {A, B}, не потеряет ли это специфичность отношений?

2. Да, это потеряет специфику. Единственный способ сохранить его — ввести новое свойство объекта, скажем, InVS и S, с соответствующим диапазоном. Без этого у рассуждающего просто недостаточно информации, чтобы делать требуемые вами выводы.

3. Кстати, вам нужно объединение {A, B}, а не пересечение.