Можете ли вы создать ограничение уникальности для отношений между всеми узлами, которые попадают под две метки в neo4j? - PullRequest
0 голосов
/ 07 мая 2018

У меня есть следующие ярлыки:

  • (:Product)
  • (:Brand)

Их отношения таковы:

  • (: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

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Краткий ответ - нет.

Говорили о наличии произвольного синтаксиса шаблонов для ограничений в Neo, но его пока нет или нет в дорожной карте, AFIAK. Самый близкий, который я нашел в дикой природе, в необработанном CIP в неофициальном репо:
https://github.com/Mats-SX/openCypher/blob/88c0f11f11410ce2f68dc050e54ff419058c6cad/cip/1.accepted/CIP2016-12-14-Constraint-syntax.adoc

См. Документацию для текущего доступного синтаксиса ограничения:
https://neo4j.com/docs/developer-manual/current/cypher/schema/constraints/

Я думаю, что ближе всего к 3.3.x можно преобразовать это отношение :is_of к узлу и присвоить ему свойства, с помощью которых можно создать ключ узла.

0 голосов
/ 07 мая 2018

Может быть, вы можете попробовать использовать MERGE вместо CREATE. Документы о MERGE говорят:

Предложение MERGE обеспечивает существование шаблона в графе. Или шаблон уже существует или его необходимо создать.

Итак, дважды выполнив следующую команду Cypher

MERGE (:Product { name: "Chocolate"})-[:is_of]->(:Brand {name: "Cadbury"});

создаст следующий график:

Result

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...