Правила SWRL сравнивают людей из двух (2) классов

У меня есть простая онтология с разными классами, которые courses и lessons являются классами. Я пытаюсь запустить правило SWRL, которое связывает свойство belongsTo с отдельными лицами из lessons. Я использую OWLReady2 и Python

with onto:
    #courses
    class course_id (onto.courses >> int): pass
    class course_title (onto.courses >> str): pass
    #lessons
    class lesson_id (onto.lessons >> int): pass
    class lesson_title (onto.lessons >> str): pass
    class course_id (onto.lessons >> int): pass
    

    class belongTo(onto.lessons >> onto.courses): pass

    rule = Imp()
    rule.set_as_rule("""lessons(?l), courses(?c), course_id(?c, ?cid), course_id(?l, ?cid) -> belongTo(?l, ?c) """)



sync_reasoner_pellet(infer_property_values = True, infer_data_property_values = True)

Идея в том, что если course_id похожи, то урок должен принадлежать курсу. Но мой код, похоже, не работает. Я получаю следующие выводы:

* Owlready * Adding relation lmsontology.Introduction belongTo lmsontology.Introduction
* Owlready * Adding relation lmsontology.Databases belongTo lmsontology.Databases

person TheSoldier    schedule 27.08.2020    source источник
comment
что значит не работает? что вы делаете после того, как добавили правило? Есть ли данные, соответствующие тексту правила?   -  person UninformedUser    schedule 28.08.2020
comment
@UninformedUser Я добавил больше деталей в код и сообщение об ошибке. Под данными, соответствующими правилу и телу, вы подразумеваете экземпляры обоих классов?   -  person TheSoldier    schedule 28.08.2020
comment
@UninformedUser Я устранил ошибку, но выводы не те, которых я ожидаю   -  person TheSoldier    schedule 28.08.2020
comment
Я не понимаю, почему правило не должно работать с Пелле. Как я уже спрашивал, данные вашего экземпляра соответствуют тексту правила? Такой, чтобы он срабатывал?   -  person UninformedUser    schedule 28.08.2020


Ответы (1)


В вашем примере я обнаруживаю следующие проблемы:

  • Классы для courses и lessons отсутствуют.
  • course_id определяется дважды, что делает первый устаревшим
  • Пример не соответствует обычному соглашению об именах: существительные в единственном числе для понятий и глагольные выражения, такие как hasId для ролей.
  • Никакие люди не определены, поэтому, на самом деле, правила swrl по существу не к чему применяются, когда вы запускаете Reasoner.

В общем, для отладки правил я бы предложил постепенно создавать их из тривиального правила или рабочего примера и на каждом этапе проверять, соответствует ли результат ожидаемому.

person cknoll    schedule 19.10.2020