Ограничение уникальности не мешает добавлять те же данные на Neo4j

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

  • имя пользователя
  • Эл. адрес
  • знак

Что я пробовал:

CREATE CONSTRAINT ON (user:User) ASSERT user.username IS UNIQUE
CREATE CONSTRAINT ON (user:User) ASSERT user.email IS UNIQUE
CREATE CONSTRAINT ON (user:User) ASSERT user.token IS UNIQUE

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

Является ли это возможным?

Спасибо

график

РЕДАКТИРОВАТЬ:

Neo4j версия: 2.2.3

И я пользуюсь neoism за Go вставить данные:

n, err := db.CreateNode(neoism.Props{"id": user.Id, "username" : user.Username,
                                     "displayname" : user.Displayname,
                                     "email" : user.Email, "token" : user.Token})
if err != nil {
    return ERROR_NEO4J
}

n.AddLabel("User")

2 ответа

Решение

Я наконец решаю это с необработанным запросом с neoism, Исходный код создал узел без метки, и он был добавлен позже. В этот момент ограничение не позволило коду добавить метку, но узел уже был создан.

Решение выполняет запрос, который добавляет метку одновременно с созданием узла:

cq := neoism.CypherQuery {
    Statement: `CREATE (n:User {id:{id}, username:{username},
        displayname:{displayname}, email:{email},
        token:{token}}) RETURN n`,
    Parameters: neoism.Props {
        "id": user.Id,
        "username" : user.Username,
        "displayname" : user.Displayname,
        "email" : user.Email,
        "token" : user.Token,
    },
}
err := db.Cypher(&cq)

Ограничение уникальности связано с парой метка и свойство. Все ваши ограничения уникальности включают User ярлык, поэтому neo4j просто навязывает уникальность User узлы.

Если вы считаете, что это уместно, вы можете изменить ограничения уникальности, чтобы они включали какой-то другой ярлык (скажем, Base), и назначьте эту метку всем вашим узлам. neo4j позволяет узлу иметь несколько меток, поэтому вы можете продолжать использовать User ярлык (но не как часть ограничения).

Другие вопросы по тегам