唯一性约束和索引问题

9

我一定是做错了什么,或者对约束和索引有误解。 我有以下内容:

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个回答

13

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

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

"请注意,在属性上添加唯一性约束还将添加该属性的索引,因此您不能单独添加此类索引。Cypher将像其他索引一样使用该索引进行查找。如果您删除约束并仍然希望在该属性上创建索引,则必须创建索引。"


完全错过了那个。非常感谢! - Steve P.

2
如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

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接