唯一性约束不会阻止在 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)