Я использую стек GRAND - базу данных neo4j и сервер Apollo. Также с использованием расширенной схемы neo4j-graphql-js. Это добавляет больше типов и мутаций в схему GraphQL.
У меня есть тип Option со следующим typedef:
type Option {
id: ID
name: String
position: Int
values: [String]
}
Используя мутацию CreateOption, сгенерированную neo4j-graphql-js, я могу создать Option. Проблема, с которой я столкнулся, заключается в том, что я могу создать несколько вариантов с одним и тем же идентификатором.
mutation {
opt1: CreateOption(id: 1, name: "Test") {
id
}
opt2: CreateOption(id: 1, name: "Test 2") {
id
}
}
Результат вышеуказанной мутации
{
"data": {
"opt1": {
"id": "1"
},
"opt2": {
"id": "1"
}
}
}
Почему neo4j позволяет использовать два узла с одинаковым идентификатором? Как я могу обеспечить узлы уникальными идентификаторами в neo4j?





В Neo4j понятие Идентификатор немного «отличается» от общепринятого понимания, а id — не что иное, как смещение объекта в файле хранилища. Neo4j полностью контролирует сам id.
Более того, если вы удалите объект с идентификатором 40, соответствующие байты в файле хранилища станут свободными. А в будущем вы можете получить еще один объект с id 40.
Есть еще один трюк с id объектов: Свойство идентификатора Neo4j называется <id> вместо id. И свойство id из вашего примера такое же, как name. Например, я создал два объекта на моем локальном Neo4j:
╒═════════════════════════════════╕
│{"name":"test1","id":1,"<id>":47}│
├─────────────────────────────────┤
│{"name":"test2","id":1,"<id>":64}│
└─────────────────────────────────┘
Чтобы сделать id уникальным, вам нужно создать ограничение вручную. Вот пример CYPHER:
CREATE CONSTRAINT ON (option:Option) ASSERT option.id IS UNIQUE