Невозможно добиться такого вывода с помощью правила. Причина в том, что вам нужно как бы сказать, что
User(?u) ^ Project(?p) ^ isNotRelatedTo(?u, ?p) ^ isNotMemberOf(?u, ?p)
-> unverifiedAssociation(?u, ?p)
но нужно сказать, что ?u
не относится ни к какому ?p
, не только как конкретное ?p. Это выходит за рамки правил и выходит за рамки OWL/DL, потому что требует рассуждений в закрытом мире, а не в открытом мире.
Чтобы добиться желаемого результата, вам нужно как-то закрыть свой мир. Итак, у вас есть пользователи, которые либо назначены проекту, либо еще не назначены. Введем класс NoProject
, который не пересекается с Project
. Затем вы добавляете правило
User(?u) ^ NoProject(?p)
-> unverifiedAssociation(?u, ?p)
где unverifiedAssociation
не пересекается с verifiedAssociation
.
Вы также можете просмотреть Индивидуум с нулевым свойством объекта Вопрос о переполнении стека.
Обновить
Согласно SWRL FAQ, SWRL не поддерживает отрицание. Единственный способ - определить двойные свойства вашего объекта, которые не пересекаются. то есть,
ObjectProperty: isMemberOf
ObjectProperty: isNotMemberOf
DisjointWith: isMemberOf
Сделайте то же самое для VerifiedAssociation
и NotVerifiedAssociation
. Затем вы определяете свое правило в положительной форме:
User(?u) ^ Project(?p) ^ isRelatedTo(?u, ?p) ^ isNotMemberOf(?u, ?p)
-> NotVerifiedAssociation(?u, ?p)
person
Henriette Harmse
schedule
26.04.2018