Neo4j 索引操作

1,358 阅读5分钟

一、索引

注意:(★) 为 neo4j 企业版的功能。

CREATE INDEX FOR (p:Person) ON (p.name)
在带有标签 Person 和属性名称的节点上创建索引。

CREATE INDEX index_name FOR ()-[k:KNOWS]-() ON (k.since)
使用名称 index_name 为类型为 KNOWS 和属性的关系创建索引。

CREATE INDEX FOR (p:Person) ON (p.surname)
OPTIONS {indexProvider: 'native-btree-1.0', indexConfig: {`spatial.cartesian.min`: [-100.0, -100.0], `spatial.cartesian.max`: [100.0, 100.0]}}
使用索引提供程序 native-btree-1.0 和给定的 spatial.cartesian 设置在带有标签 Person 和属性姓氏的节点上创建索引。其他索引设置将具有其默认值。

CREATE INDEX FOR (p:Person) ON (p.name, p.age)
在带有标签 Person 和属性 name 和 age 的节点上创建一个复合索引,如果索引已经存在,则抛出错误。

CREATE INDEX IF NOT EXISTS FOR (p:Person) ON (p.name, p.age)
在带有标签 Person 和属性 name 和 age 的节点上创建一个复合索引(如果它不存在),如果它存在则不执行任何操作。

CREATE LOOKUP INDEX lookup_index_name FOR (n) ON EACH labels(n)
在具有任何标签的节点上创建一个名为 lookup_index_name 的令牌查找索引。

CREATE LOOKUP INDEX FOR ()-[r]-() ON EACH type(r)
在具有任何关系类型的关系上创建标记查找索引。

CREATE FULLTEXT INDEX node_fulltext_index_name FOR (n:Friend) ON EACH [n.name]
OPTIONS {indexConfig: {`fulltext.analyzer`: 'swedish'}}
在名称为 node_fulltext_index_name 和分析器瑞典语的节点上创建全文索引。节点上的全文索引只能由过程 db.index.fulltext.queryNodes 使用。其他索引设置将具有其默认值。

CREATE FULLTEXT INDEX rel_fulltext_index_name FOR ()-[r:HAS_PET|BROUGHT_PET]-() ON EACH [r.since, r.price]
为关系创建一个名为 rel_fulltext_index_name 的全文索引。关系的全文索引只能由过程 db.index.fulltext.queryRelationships 使用。

SHOW INDEXES
列出所有索引。

MATCH (n:Person) WHERE n.name = $value
可以自动使用索引进行相等比较。请注意,例如 toLower(n.name) = $value 不会使用索引。

MATCH (n:Person)
WHERE n.name IN [$value]
索引可以自动用于 IN 列表检查。

MATCH (n:Person)
WHERE n.name = $value and n.age = $value2
复合索引可以自动用于两个属性的相等比较。请注意,复合索引的所有属性都需要有谓语才能使用。

MATCH (n:Person)
USING INDEX n:Person(name)
WHERE n.name = $value
当 Cypher 使用次优索引或应该使用多个索引时,可以强制使用索引。

DROP INDEX index_name
删除名为 index_name 的索引,如果索引不存在则抛出错误。

DROP INDEX index_name IF EXISTS
如果存在,则删除名为 index_name 的索引,如果不存在则不执行任何操作。

二、约束

CREATE CONSTRAINT ON (p:Person) ASSERT p.name IS UNIQUE
# 在标签 Person 和属性名称上创建唯一的属性约束。如果使用已存在的名称更新或创建具有该标签的任何其他节点,则写入操作将失败。此约束将创建随附索引。

CREATE CONSTRAINT uniqueness ON (p:Person) ASSERT p.age IS UNIQUE
# 在标签 Person 和属性 age 上创建唯一属性约束,名称为 uniqueness。如果任何其他具有该标签的节点被更新或创建时的年龄已经存在,则写入操作将失败。此约束将创建随附索引。

CREATE CONSTRAINT ON (p:Person)
       ASSERT p.surname IS UNIQUE
       OPTIONS {indexProvider: 'native-btree-1.0'}
# 使用索引提供程序 native-btree-1.0 为随附的索引在标签 Person 和属性姓氏上创建唯一的属性约束。

CREATE CONSTRAINT ON (p:Person) ASSERT p.name IS NOT NULL
# (★) 在标签Person 和属性名称上创建节点属性存在约束,如果约束已经存在则抛出错误。如果创建带有该标签的节点而没有名称,或者如果从带有 Person 标签的现有节点中删除了 name 属性,则写入操作将失败。

CREATE CONSTRAINT node_exists IF NOT EXISTS ON (p:Person) ASSERT p.name IS NOT NULL
# (★) 如果标签 Person 和属性名称上的节点属性存在约束或任何名称为 node_exists 的约束已经存在,那么什么都不会发生。如果不存在这样的约束,那么它将被创建。

CREATE CONSTRAINT ON ()-[l:LIKED]-() ASSERT l.when IS NOT NULL
# (★) 对LIKED 类型和属性when 创建关系属性存在约束。如果在没有 when 的情况下创建具有该类型的关系,或者如果从具有 LIKED 类型的现有关系中删除 when 属性,则写入操作将失败。

CREATE CONSTRAINT relationship_exists ON ()-[l:LIKED]-() ASSERT l.since IS NOT NULL
# (★) 对LIKED 类型和property since 创建关系属性存在约束,名称为relationship_exists。如果在没有since的情况下创建了具有该类型的关系,或者如果从具有 LIKED 类型的现有关系中删除了 since 属性,则写入操作将失败。

SHOW UNIQUE CONSTRAINTS YIELD *
# 列出所有唯一约束。

CREATE CONSTRAINT ON (p:Person)
      ASSERT (p.firstname, p.surname) IS NODE KEY
# (★) 在标签Person 和属性firstname 和surname 上创建节点键约束。如果创建具有该标签的节点时没有名字和姓氏,或者两者的组合不是唯一的,或者如果修改了具有 Person 标签的现有节点上的名字和/或姓氏标签以违反这些约束,则写入操作将失败。

CREATE CONSTRAINT node_key ON (p:Person) ASSERT (p.name, p.surname) IS NODE KEY
# (★) 在标签Person 和属性name 和surname 上创建节点键约束,名称为node_key。如果创建具有该标签的节点时没有姓名和姓氏,或者两者的组合不是唯一的,或者如果修改了具有 Person 标签的现有节点上的姓名和/或姓氏标签以违反这些约束,则写入操作将失败。

CREATE CONSTRAINT node_key_with_config ON (p:Person)
      ASSERT (p.name, p.age) IS NODE KEY
      OPTIONS {indexConfig: {`spatial.wgs-84.min`: [-100.0, -100.0], `spatial.wgs-84.max`: [100.0, 100.0]}}
# (★) 在标签 Person 和属性 name 和 age 上创建节点键约束,名称为 node_key_with_config 并为随附索引提供空间.wgs-84 设置。其他索引设置将具有其默认值。

DROP CONSTRAINT uniqueness
# 删除名为 uniqueness 的约束,如果约束不存在则抛出错误。

DROP CONSTRAINT uniqueness IF EXISTS
# 如果存在,则删除名称为 uniqueness 的约束,如果不存在,则不执行任何操作。

# 表现
# - 尽可能使用参数而不是文字。这允许 Cypher 重用您的查询,而不必解析和构建新的执行计划。
# - 始终为可变长度模式设置上限。有可能让查询变得疯狂并错误地触及图中的所有节点。
# - 仅返回您需要的数据。避免返回整个节点和关系 - 相反,选择您需要的数据并仅返回该数据。
# - 使用 PROFILE/EXPLAIN 来分析查询的性能。有关这些主题和其他主题(例如规划器提示)的更多信息,请参阅查询调优。

附录