У меня есть следующие ярлыки:
Их отношения таковы:
(:Product)-[:is_of]->(:Brand)
Например, если приведенный ниже запрос будет выполнен дважды, он будет выполнен успешно.
CREATE (:Product { name: "Chocolate"})-[:is_of]->(:Brand {name: "Cadbury"})
И результат графика для запроса ниже можно увидеть на изображении здесь
MATCH (p:Product { name: "Chocolate"})-[:is_of]->(b:Brand {name: "Cadbury"}) RETURN p,b
Как вы можете видеть, есть 2 "шоколадных" продукта и 2 фирменных "Cadbury".
Я хотел бы убедиться, что при создании продукта есть только один узел продукта со свойством name = "Chocolate"
, который имеет отношение is_of
к бренду со свойством name = "Cadbury"
. Таким образом, приведенный выше запрос CREATE
завершится неудачно со второй попытки с некоторым сообщением, например: There is already one product node with a name = "Chocolate" and a brand of "Cadbury". This is prohibited by a constraint
.
Аналог реляционной базы данных будет первичным ключом, который простирается на несколько внешних ключей. Например, добавление приведенного ниже в таблицу Product
, где таблица Brand
имеет первичный ключ Brand ID
:
PRIMARY KEY("Product ID","Brand ID")
Я пытался наложить ограничение на свойство Бренда, чтобы разрешить только уникальные бренды. Но проблема в том, что вы все равно можете создать два продукта, которые is_of
того же бренда. Я также не хочу создавать уникальное ограничение для продукта name
, потому что может быть несколько «шоколадных» продуктов от разных брендов.
Я прочитал документацию, но кажется, что ограничения могут быть наложены только на свойства ...
Я хотел бы представить синтаксис, который будет выглядеть примерно так:
CREATE CONSTRAINT ON g=(p:Product)-[:is_of]->(b:Brand) ASSERT g IS UNIQUE FOR p.name, b.name