【问题标题】:Uniqueness constraint and indexing issue唯一性约束和索引问题
【发布时间】:2014-10-01 08:31:18
【问题描述】:

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

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 是唯一的,这就是我有约束的原因。

我误会了什么?我该怎么做呢?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

        • 完全错过了。非常感谢!
        猜你喜欢
        • 2023-03-11
        • 2021-11-02
        • 2011-11-23
        • 2015-12-29
        • 2011-03-18
        • 2011-02-17
        • 2018-12-02
        • 1970-01-01
        • 2014-06-25
        相关资源
        最近更新 更多