У меня есть следующая 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 или любом другом эквивалентном представлении, это также будет очень полезно.