我正在使用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的节点?
答案 0 :(得分:1)
在Neo4j中, Id 的概念与通常的理解有点“不同”,并且id仅仅是存储文件中对象的偏移量。 Neo4j拥有有关id本身的所有控制权。
甚至,如果您要删除ID为40
的对象,则存储文件中的相应字节将变为空置。并且将来您可能会获得另一个ID为40
的对象。
还有id
个对象的另一招:名为<id>
而不是id
的Neo4j id属性。您示例中的属性id
与name
相同。例如,我在本地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