如何有多个具有相同ID的GraphQL节点?

时间:2019-06-02 14:32:17

标签: neo4j graphql

我正在使用GRAND堆栈-neo4j数据库和apollo服务器。还使用neo4j-graphql-js的扩增模式。这会为GraphQL模式添加更多类型和变异。

我有一个具有以下typedef的Option类型:

Type

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

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

上述突变的结果是

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

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

1 个答案:

答案 0 :(得分:1)

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

甚至,如果您要删除ID为40的对象,则存储文件中的相应字节将变为空置。并且将来您可能会获得另一个ID为40的对象。

还有id个对象的另一招:名为<id>而不是id 的Neo4j 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