【问题标题】:How can there be multiple GraphQL nodes with the same ID?同一个 ID 怎么可能有多个 GraphQL 节点?
【发布时间】:2019-10-18 08:04:30
【问题描述】:

我正在使用 GRAND 堆栈 - neo4j 数据库和 apollo 服务器。还使用了 neo4j-graphql-js 的 augmentedSchema。这为 GraphQL 架构添加了更多类型和突变。

我有一个带有以下 typedef 的类型选项:

type Option {
  id: ID
  name: String
  position: Int
  values: [String]
}

使用由 neo4j-graphql-js 生成的 CreateOption 突变,我可以创建一个选项。我面临的问题是我可以创建多个具有相同 ID 的选项。

mutation {
  opt1: CreateOption(id: 1, name: "Test") {
    id
  }
  opt2: CreateOption(id: 1, name: "Test 2") {
    id
  }
}

上述突变的结果是

{
  "data": {
    "opt1": {
      "id": "1"
    },
    "opt2": {
      "id": "1"
    }
  }
}

为什么 neo4j 允许两个节点具有相同的 ID? Neo4j中如何确保节点具有唯一ID?

【问题讨论】:

    标签: neo4j graphql


    【解决方案1】:

    在 Neo4j 中,Id 的概念与通常的理解有些“不同”,id 只不过是对象在存储文件中的偏移量。 Neo4j 拥有关于 id 本身的所有控制权。

    更重要的是,如果您要删除 ID 为 40 的对象,则存储文件中的相应字节将变为空置。将来你可以得到另一个 ID 为 40 的对象。

    关于对象的id 还有一个技巧:Neo4j id 属性称为<id> 而不是id。您示例中的属性idname 相同。例如,我在本地 Neo4j 上创建了两个对象:

    ╒═════════════════════════════════╕
    │{"name":"test1","id":1,"<id>":47}│
    ├─────────────────────────────────┤
    │{"name":"test2","id":1,"<id>":64}│
    └─────────────────────────────────┘
    

    要使id 独一无二,您必须手动创建constraint。这是一个 CYPHER 示例:

    CREATE CONSTRAINT ON (option:Option) ASSERT option.id IS UNIQUE
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多