OWL2, SWRL: Запрос, находится ли элемент в диапазоне другого элемента?

Моя проблема в том, что если я хочу проверить, находится ли экземпляр в диапазоне, я использую следующее правило:

Rule1: Error(?d), TimeRelatedError(?c), TimeRelatedError_start_at(?c, ?s), error_at(?d, ?b), greaterThan(?b, ?s) -> is_after_TimeRelatedError_start(?d, true)
Rule2: Error(?d), TimeRelatedError(?c), TimeRelatedError_end_at(?c, ?e), error_at(?d, ?b), lessThan(?b, ?e) -> is_before_TimeRelatedError_end(?d, true)

Это работает, если в моей онтологии есть только один TimeRelatedError, если у меня больше экземпляров, он всегда будет вызывать true (поскольку один из TimeRelatedError всегда находится до/после начальной/конечной точки). У вас есть идеи, как решить эту проблему? Я думаю, что смогу решить эту проблему, если каким-то образом назначу свой TimeRelatedError экземпляру Error, но я не знаю, как это сделать. Пожалуйста, профессионалы OWL/SWRL, помогите мне с этой задачей :)


person lkaupp    schedule 06.08.2019    source источник
comment
похоже, у вас есть последовательность ошибок, на самом деле это не сработает. Я думаю, вам нужно найти последнюю ошибку перед текущей ошибкой? Это невозможно с вашей текущей моделью данных. либо вы используете какую-то структуру списка для OWL (есть несколько подходов), либо я думаю, что она выходит за рамки SWRL. С отслеживанием предшественника и преемника это может сработать. Но с другой стороны, я могу не получить домен ваших данных. Вы также должны добавить некоторые образцы данных + ожидаемый предполагаемый результат.   -  person UninformedUser    schedule 06.08.2019
comment
Спасибо за ваши быстрые ответы @AKSW. Удивительно, как быстро вы :). Нашел ошибку, из-за которой возникла проблема.   -  person lkaupp    schedule 06.08.2019
comment
ах, здорово, что вы нашли решение. единственное, что я не понимаю, что означает in_range. Вам не нужна связь с самим диапазоном? Пока вы только делаете вывод, что ошибка находится в каком-то диапазоне, но что, если у вас есть несколько диапазонов? Разве не имеет смысла отслеживать, какой диапазон?   -  person UninformedUser    schedule 07.08.2019


Ответы (1)


Я могу винить только себя, я нашел решение, только одно правило с:

Error(?d), TimeRelatedError(?c), TimeRelatedError_start_at(?c, ?s), error_at(?d, ?b), greaterThan(?b, ?s), TimeRelatedError_end_at(?c, ?e), error_at(?d, ?b), lessThan(?b, ?e) -> in_range(?d, true)

Это работает, потому что все, что находится после greatThan, будет вызываться только в том случае, если оператор (greaterThan) истинен, в конце концов, если конец также меньше, мы можем назвать его in_range. Я оставлю это здесь, для других, которые наткнутся на тот же вопрос.

person lkaupp    schedule 06.08.2019