Можно ли ограничить кратность ребер в Neo4j / OrientDB?
Мне было интересно, предоставляют ли Neo4j и OrientDB возможность определения ограничений с точки зрения кратности для определенных типов ребер?
2 ответа
Для OrientDB
Вы можете установить кратность на выходе / в коллекции на этикетке. Пример для установки максимум 1 ребра от Person to Company, если метка ребра "workFor":
ALTER PROPERTY Person.out_workFor NOT NULL
ALTER PROPERTY Person.out_workFor MAX 1
Вы также можете установить минимум с помощью:
ALTER PROPERTY Person.out_workFor MIN 1
Таким образом, с min & max обязательно иметь одно-единственное отношение к компании.
Для Neo4j
Что вы хотите сделать, если ограничение нарушено? Exception & Rollback или как-то слить?
Для 1:1 кардинальности есть слияние
MATCH (p:Person {name:"Pablo"})
MATCH (c:Company {name:"Era7"})
MERGE (p)-[:WORKS_FOR]->(c);
Для более высоких ограничений мощности вы можете использовать платформу, которая поддерживает метамодели и схемы, такие как http://structr.org/ или sylvadb.
Или вы можете установить небольшой обработчик tx-событий, который проверяет ваш кардинальность и вызывает исключение, если вы нарушаете ограничения.
Я все равно хотел написать в блоге об этом, так что следите за обновлениями.