我想与用户一起创建一个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
返回错误。
有可能吗?
由于
修改
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")
答案 0 :(得分:1)
唯一性约束与标签和属性对相关联。您的所有唯一性约束都涉及User
标签,因此neo4j将仅在User
个节点上强制执行唯一性。
如果您认为合适,可以修改唯一性约束,以便它们涉及其他标签(例如Base
),并将该标签分配给所有您的节点。 neo4j允许节点拥有多个标签,因此您也可以继续使用User
标签(但不能作为约束的一部分)。
答案 1 :(得分:1)
我最终使用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)