OwlReady2, ограничивающий два функциональных свойства в подклассе равными значениями - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть следующая owlready2 конструкция:

class Pipeline(Thing):
    pass

class Data(Thing):
    pass

class has_input(FunctionalProperty):
    domain = [Pipeline]
    range = [Data]

class has_output(FunctionalProperty):
    domain = [Pipeline]
    range = [Data]

class Algorithm(Pipeline):
    pass

class CompositePipeline(Pipeline):
    pass

class has_first_step(FunctionalProperty):
    domain = [CompositePipeline]
    range = [Algorithm]

class has_next_step(FunctionalProperty):
    domain = [CompositePipeline]
    range = [Pipeline]

По сути, я определяю Pipeline как последовательность Algorithm, используя рекурсивное определение, т. Е. Pipeline является либо единственным Algorithm, либо Algorithm, за которым следует Pipeline (CompositePipeline).

У меня проблема с has_input и has_output. В CompositePipeline я хочу утверждать, что has_input будет точно равно значению has_input объекта has_first_step, и эквивалентно has_output.

Я попытался создать PropertyChain([has_first_step, has_input]), а затем попытался сделать что-то вроде

class CompositePipeline(Pipeline):
    equivalent_to = [ Pipeline &
                      has_input.exactly(PropertyChain([has_first_step, has_next_step])) & 
                      ... ]

Я тестировал разные способы переписывания этого и разные операторы, такие как .some(), но ничего не работает. Либо owlready2 вызывает некоторую неинформативную ошибку, либо, когда она работает, утверждение не сохраняется в файле XML / OWL при сохранении.

Если у кого-то есть решение в чистом OWL, Turtle или любом другом эквивалентном представлении, это также будет очень полезно.

...