Ограничьте значение свойства с помощью ограничений Cypher

Я добавляю ограничения в базу данных neo4j, используя ограничения Cypher, и у меня есть поле свойств на узле, где я хочу, чтобы значение было одной из набора строк.

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

Например, мой узел может выглядеть как

(e:Entity { foo: 'a' })

и у меня есть ограничение

CREATE CONSTRAINT ON (e:Entity) ASSERT EXISTS (e.foo)

но я хочу, чтобы foo был либо a, b, c или d, поэтому в этом примере узел будет в порядке. Однако, если бы я добавил еще один узел

(e:Entity { foo: 'e' }),

тогда я бы хотел, чтобы это не удалось и выбросило исключение.

Документация по ограничениям neo4j предполагает, что в настоящее время нет способа делать это. Кто-нибудь сталкивался с этим раньше и есть потенциальное решение?

Заранее спасибо!


person kernowal    schedule 29.05.2020    source источник
comment
Насколько мне известно, нет способа настроить ограничение Neo4j для значений свойств. Я всегда реализовывал эти типы ограничений на уровне API. Допустимые значения могут быть определены в Enum на любом языке, который вы используете. Или их можно разместить в самом Neo4j и кэшировать на уровне API. Ни один из подходов не идеален. Подход Enum требует изменения кода и развертывания всякий раз, когда значения меняются, но недопустимые значения обнаруживаются во время компиляции. Сохранение значений в Neo4j требует обновления кеша, а недопустимые значения являются ошибками времени выполнения.   -  person hoyski    schedule 29.05.2020
comment
@hoyski Спасибо за ответ. По сути, к такому выводу я пришел. Я уже построил набор текста на уровне API для операций CRUD. Причина, по которой я также хочу ограничить базу данных, - это смягчить проблемы, возникающие из-за миграции базы данных и пакетной загрузки из других источников.   -  person kernowal    schedule 29.05.2020