唯一性约束不会阻止在Neo4j上添加相同的数据

时间:2015-08-11 16:35:58

标签: go neo4j cypher neoism

我想与用户一起创建一个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返回错误。

有可能吗?

由于

graph

修改

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")

2 个答案:

答案 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)