唯一性约束不会阻止在 Neo4j 上添加相同的数据
Uniqueness constraint does not prevent from adding same data on Neo4j
我想创建一个包含用户的 neo4j
数据库。我希望以下属性是唯一的:
- 用户名
- 电子邮件
- 代币
我尝试过的:
CREATE CONSTRAINT ON (user:User) ASSERT user.username IS UNIQUE
CREATE CONSTRAINT ON (user:User) ASSERT user.email IS UNIQUE
CREATE CONSTRAINT ON (user:User) ASSERT user.token IS UNIQUE
但是,这并不妨碍我使用重复的电子邮件、用户名或令牌创建新节点。该图像显示了 5 个节点,所有节点都具有相同的数据,但只有第一个是用户。我不想要这个,我想要 neo4j
到 return 一个错误。
可能吗?
谢谢
编辑:
Neo4j
版本:2.2.3
并且我使用 neoism
作为 Go
来插入数据:
n, err := db.CreateNode(neoism.Props{"id": user.Id, "username" : user.Username,
"displayname" : user.Displayname,
"email" : user.Email, "token" : user.Token})
if err != nil {
return ERROR_NEO4J
}
n.AddLabel("User")
唯一性约束与 label 和 属性 对相关联。您所有的唯一性约束都涉及 User
标签,因此 neo4j 只会在 User
个节点上强制实施唯一性。
如果你认为合适,你可以修改你的唯一性约束,使它们涉及一些其他标签(比如,Base
),并将该标签分配给all 你的节点。 neo4j 允许一个节点有多个标签,因此您也可以继续使用 User
标签(但不作为约束的一部分)。
我终于用 neoism
的原始查询解决了这个问题。原始代码创建了一个没有标签的节点,它是后来添加的。此时约束不允许代码添加标签,但节点已经创建。
解决方案是运行一个查询在创建节点的同时添加标签:
cq := neoism.CypherQuery {
Statement: `CREATE (n:User {id:{id}, username:{username},
displayname:{displayname}, email:{email},
token:{token}}) RETURN n`,
Parameters: neoism.Props {
"id": user.Id,
"username" : user.Username,
"displayname" : user.Displayname,
"email" : user.Email,
"token" : user.Token,
},
}
err := db.Cypher(&cq)
我想创建一个包含用户的 neo4j
数据库。我希望以下属性是唯一的:
- 用户名
- 电子邮件
- 代币
我尝试过的:
CREATE CONSTRAINT ON (user:User) ASSERT user.username IS UNIQUE
CREATE CONSTRAINT ON (user:User) ASSERT user.email IS UNIQUE
CREATE CONSTRAINT ON (user:User) ASSERT user.token IS UNIQUE
但是,这并不妨碍我使用重复的电子邮件、用户名或令牌创建新节点。该图像显示了 5 个节点,所有节点都具有相同的数据,但只有第一个是用户。我不想要这个,我想要 neo4j
到 return 一个错误。
可能吗?
谢谢
编辑:
Neo4j
版本:2.2.3
并且我使用 neoism
作为 Go
来插入数据:
n, err := db.CreateNode(neoism.Props{"id": user.Id, "username" : user.Username,
"displayname" : user.Displayname,
"email" : user.Email, "token" : user.Token})
if err != nil {
return ERROR_NEO4J
}
n.AddLabel("User")
唯一性约束与 label 和 属性 对相关联。您所有的唯一性约束都涉及 User
标签,因此 neo4j 只会在 User
个节点上强制实施唯一性。
如果你认为合适,你可以修改你的唯一性约束,使它们涉及一些其他标签(比如,Base
),并将该标签分配给all 你的节点。 neo4j 允许一个节点有多个标签,因此您也可以继续使用 User
标签(但不作为约束的一部分)。
我终于用 neoism
的原始查询解决了这个问题。原始代码创建了一个没有标签的节点,它是后来添加的。此时约束不允许代码添加标签,但节点已经创建。
解决方案是运行一个查询在创建节点的同时添加标签:
cq := neoism.CypherQuery {
Statement: `CREATE (n:User {id:{id}, username:{username},
displayname:{displayname}, email:{email},
token:{token}}) RETURN n`,
Parameters: neoism.Props {
"id": user.Id,
"username" : user.Username,
"displayname" : user.Displayname,
"email" : user.Email,
"token" : user.Token,
},
}
err := db.Cypher(&cq)