Нет никакого способа сделать такой вывод с помощью правила. Причина в том, что вам нужно, чтобы иметь возможность сказать, что
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
.
Вы также можете посмотреть на Индивида с нулевым свойством объекта.
Вопрос переполнения стека.
Update
SWRL не поддерживает отрицание в соответствии с SWRL FAQ . Единственный способ - определить двойственные свойства вашего объекта, которые не пересекаются. То есть.,
ObjectProperty: isMemberOf
ObjectProperty: isNotMemberOf
DisjointWith: isMemberOf
Аналогично для VerifiedAssociation
и NotVerifiedAssociation
. Затем вы определяете свое правило в положительной форме:
User(?u) ^ Project(?p) ^ isRelatedTo(?u, ?p) ^ isNotMemberOf(?u, ?p)
-> NotVerifiedAssociation(?u, ?p)