唯一性约束和索引问题

时间:2014-08-07 23:09:56

标签: neo4j cypher

我必须做错事,或者对约束和索引有误解。我有以下内容:

CREATE CONSTRAINT ON (u:User) ASSERT u.user_id IS UNIQUE

CREATE INDEX ON :User(user_id)

我尝试过交替订单,但无论如何,我得到了:

Neo.ClientError.Schema.ConstraintAlreadyExists

Neo.ClientError.Schema.IndexAlreadyExists

取决于订购。

我不明白为什么我不能这样做。我希望查找对user_id来说很快,这就是为什么我要编制索引,我也想确保user_id是唯一的,这就是为什么我有一个约束。

我误解了什么?我应该怎么做呢?

3 个答案:

答案 0 :(得分:7)

添加唯一约束也会在该属性上添加索引 - 因此唯一约束就足够了。

请参阅http://docs.neo4j.org/chunked/stable/query-constraints.html

  

"请注意,在属性上添加唯一性约束也会添加   该属性的索引,因此您无法单独添加此类索引。   Cypher将像其他索引一样使用该索引进行查找。如果你   删除约束并仍然想要属性的索引,你会   必须创建索引。"

答案 1 :(得分:0)

创建约束将自动在该属性上创建索引。如果仅创建索引,则必须手动创建索引。

http://docs.neo4j.org/chunked/stable/query-schema-index.html

http://docs.neo4j.org/chunked/stable/query-constraints.html

答案 2 :(得分:0)

正如Luanne所说,在属性上添加唯一性约束也会在其上创建一个索引。

要使user_id成为唯一且已建立索引,您应该使用此功能:

CREATE CONSTRAINT ON (user:User) ASSERT user.user_id IS UNIQUE

>>> Added 1 constraint, returned 0 rows in 107 ms

验证是否已正确添加索引:

:SCHEMA

>>> Indexes
>>>   ON :User(user_id)             ONLINE (for uniqueness constraint) 
>>> 
>>> Constraints
>>>   ON (user:User) ASSERT user.user_id IS UNIQUE

注意,如果您尝试删除由唯一性约束自动创建的索引,它将失败:

DROP INDEX ON :User(user_id)

>>> Unable to drop index on :User(user_id): Index belongs to constraint: :User(user_id)

删除它的正确方法是删除唯一性约束:

DROP CONSTRAINT ON (user:User) ASSERT user.user_id IS UNIQUE

>>> Removed 1 constraint, returned 0 rows in 108 ms