#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}, а не пересечение.