Как может быть несколько узлов GraphQL с одним и тем же идентификатором?

Я использую стек 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?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
549
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В 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

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