neo4j--Cypher索引、约束、统计

2023-11-08

Cypher索引、约束、统计

1.索引

1.1创建索引

使用CREATE INDEX ON可以在拥有某个标签的所有节点的某个属性上创建索引。注意,索引是在后台创建,并不能立刻就生效。

CREATE INDEX ON :Person(name)

本例在拥有Person标签的所有节点的name属性上创建了索引。

1.2 删除索引

使用DROP INDEX可以删除拥有某个标签的所有节点的某个属性上的索引。

DROP INDEX ON :Person(name)

1.3 使用索引

通常不需要在查询中指出使用哪个索引,Cypher自己会决定。例

MATCH (person:Person { name: 'Andres' })

RETURN person

1.4 在WHERE等式中使用索引

在WHERE语句中的对索引的属性进行相等比较时,索引将自动被使用。

MATCH (person:Person)

WHERE person.name = 'Andres'

RETURN person

1.5 使用WHERE不等式中使用索引

在WHERE语句中的对索引的属性进行不等(范围)比较时,索引将自动被使用。

MATCH (person:Person)

WHERE person.name > 'B'

RETURN person

1.6 在 IN中使用索引

下面查询中针对 person.name的IN断言将使用Person(name)索引。

MATCH (person:Person)

WHERE person.name IN ['Andres', 'Mark']

RETURN person

1.7 在STARTS WITH中使用索引

下面的查询语句在针对person.name的STARTS WITH断言将使用Person(name)索引。

MATCH (person:Person)

WHERE person.name STARTS WITH 'And'

RETURN person

1.8 在检查属性存在性时使用索引

下面查询中的has(p.name)断言将使用Person(name)索引。

MATCH (p:Person)

WHERE exists(p.name)

RETURN p

2.约束

Neo4j通过使用约束来保证数据完整性。约束可应用于节点或者关系。可以创建节点属性的唯一性约束,也可以创建节点和关系的属性存在性约束。

可以使用属性的存在性约束确保拥有特定标签的所有节点或者拥有特定类型的所有关系的属性是存在的。所有的试图创建新的没有该属性的节点或关系,以及试图删除强制属性的查询都将失败。注意:只有Neo4j企业版才具有属性存在性约束这个高级功能。

可以对某个给定的标签添加多个约束,也可以将唯一性约束和存在性约束同时添加到同一个属性上。

在属性上添加唯一性约束的时候,同时也会自动为该属性添加一个索引。

2.1节点属性的唯一性约束

2.1.1 使用IS UNIQUE语法创建约束

它能确保数据库中拥有特定标签和属性值的节点是唯一的。

CREATE CONSTRAINT ON (book:Book) ASSERT book.isbn IS UNIQUE

2.1.2 删除唯一性约束

使用DROP CONSTRAINT可以删除数据库中的一个约束。

DROP CONSTRAINT ON (book:Book) ASSERT book.isbn IS UNIQUE

2.1.3 创建遵从属性唯一性约束的节点

创建一个数据库中还不存在的isbn的Book节点。

CREATE (book:Book { isbn: '1449356265', title: 'Graph Databases' })

2.1.4 创建违背属性唯一性约束的节点

创建一个数据库中已经存在的isbn的节点。

CREATE (book:Book { isbn: '1449356265', title: 'Graph Databases' })

这种情况下,节点将创建失败。

错误消息

Node 0 already exists with label Book and property "isbn"=[1449356265]

2.1.5 因为冲突的节点而创建属性唯一性约束失败

当数据库中已经有两个Book节点拥有相同的isbn号时,在Book节点的isbn属性上创建属性唯一性约束。

CREATE CONSTRAINT ON (book:Book) ASSERT book.isbn IS UNIQUE

这种情况下约束将创建失败,因为它与已有的数据冲突。可以选择创建索引或者移除冲突的节点然后再重新创建约束。

错误消息

Unable to create CONSTRAINT ON ( book:Book ) ASSERT book.isbn IS UNIQUE:

Multiple nodes with label `Book` have property `isbn` = '1449356265':

node(0)

node(1)

2.2节点属性存在性约束

2.2.1 使用ASSERT exists(variable.propertyName)创建约束

       可确保有指定标签的所有节点都有一个特定的属性。

CREATE CONSTRAINT ON (book:Book) ASSERT exists(book.isbn)

2.2.2 删除节点属性存在性约束

使用DROP CONSTRAINT可以从数据库中移除一个约束。

DROP CONSTRAINT ON (book:Book) ASSERT exists(book.isbn)

2.2.3 创建遵从属性存在性约束的节点

创建一个存在isbn属性的Book节点。

CREATE (book:Book { isbn: '1449356265', title: 'Graph Databases' })

2.2.4 创建违背属性存在性约束的节点

在:Book(isbn)有存在性约束的情况下,试图创建一个没有isbn属性的Book节点。

CREATE (book:Book { title: 'Graph Databases' })

错误消息

Node 1 with label "Book" must have the property "isbn" due to a constraint

2.2.5 删除有存在性约束的节点属性

在:Book(isbn)有存在性约束的情况下,试图从一个已存在的Book节点移除isbn属性。

MATCH (book:Book { title: 'Graph Databases' })

REMOVE book.isbn

这种情况下,移除属性将失败。

错误消息

Node 0 with label "Book" must have the property "isbn" due to a constraint

 

2.3关系属性存在性约束

2.3.1使用ASSERT exists(variable.propertyName)创建约束,可确保特定类型的所有关系都有一个特定的属性。

REATE CONSTRAINT ON ()-[like:LIKED]-() ASSERT exists(like.day)

2.3.2删除关系属性存在性约束

使用DROP CONSTRAINT从数据库中移除一个约束。

DROP CONSTRAINT ON ()-[like:LIKED]-() ASSERT exists(like.day)

2.3.3创建遵从属性存在性约束的关系

创建一个存在day属性的LIKED关系。

MATCH (TomH:Person {name:'Tom Hanks', born:1956}), (book:Book { isbn: '1449356265', title: 'Graph Databases' })

CREATE (TomH)-[like:LIKED { day: 'yesterday' }]->(book)

return TomH,book

 

2.3.4创建违背属性存在性约束的关系

在有:LIKED(day)存在性约束的情况下,试图创建一个没有day属性的LIKED关系。

MATCH (Nora :Person {name:'Nora Ephron'}), (book:Book { isbn: '1449356265', title: 'Graph Databases' })

CREATE (Nora)-[like:LIKED]->(book)

return Nora,book

 

这种情况下,关系将创建失败。

错误消息

Relationship 1 with type "LIKED" must have the property "day" due to a constraint

2.3.5移除具有存在性约束的关系属性

有:LIKED(day)存在性约束的情况下,试图从一个已有LIKED关系中移除day属性。

MATCH (TomH :Person {name:'Tom Hanks'})-[like:LIKED]-> (book:Book { isbn: '1449356265', title: 'Graph Databases' })

REMOVE like.day

错误消息

Relationship 0 with type "LIKED" must have the property "day" due to a constraint

 

3.统计

当执行一个Cypher查询时,它将先编译为一个执行计划(execution plan),该计划可以运行并响应查询。为了给查询提供一个高效的计划,Neo4j需要数据库的信息,如schema有什么索引和约束存在?Neo4j也使用统计信息来保持数据库优化执行计划。有了这些信息,Neo4j就能决定采用哪种模式将获得最好的执行计划。

Neo4j通过对数据采样来获得如下统计信息:

  1. 拥有特定标签的节点的数量
  2. 每个索引的可选择性
  3. 按类型分的关系的数量
  4. 以拥有指定标签的节点开始或者结束的关系,按类型分各自的数量

Neo4j以两种方式来保持这些统计信息的更新。以标签数量为例,每当设置或者删除一个节点的标签的时候,这些数量都会被更新。Neo4j需要扫描所有索引以获得可选择的数量。

 

3.1配置选项

当上述统计信息发生变化时,缓存的执行计划将被重新生成。下面的配置项可以控制执行计划的更新。

dbms.index_sampling.background_enabled

控制当需要更新时索引是否会自动重新采样。

dbms.index_sampling.update_percentage

控制多大比例的索引被更新后才触发新的采样

cypher.statistics_divergence_threshold

多少统计信息发生变化后当前的执行计划就被认为过时了(需要重新生成执行计划)。参数值0.0意味着有变化就更新,1.0意味着永远都不更新。

3.2手动索引采样

重新采样可使用内嵌的db.resampleIndex()db.resampleOutdatedIndexes()两个内嵌过程来触发。

下面是触发重采样的例子:

CALL db.resampleIndex(":Person(name)");

CALL db.resampleOutdatedIndexes();

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

neo4j--Cypher索引、约束、统计 的相关文章

随机推荐

  • 汇编语言rep movsd

    汇编语言rep movsd rep movsd 一般为 mov esi offset s1 mov edi offset s2 mov ecx 数 cld rep movsd 查找了几个资料 都说得不怎么完整 也许是我知道的太少了 所以觉得
  • 区块链学习1:Merkle树(默克尔树)和Merkle根

    前往老猿Python博文目录 一 简介 默克尔树 Merkle tree MT 又翻译为梅克尔树 是一种哈希二叉树 树的根就是Merkle根 关于Merkle树老猿推荐大家阅读 Merkle树 这篇文章 Merkle树和Merkle根在区块
  • 网络数据传输流程

    目录 一 局域网传输流程 1 集线器 2 交换机 3 交换机 路由器 二 广域网数据传输流程 主要过程 一 局域网传输流程 1 集线器 主要过程 源主机 从上到下封装 如果知道目的IP主机的MAC地址就直接封装在数据链路层的以太网帧头中 如
  • 多线程实现大批量数据查询

    优化一个系统中的功能 需要通过判断进行多次的查库 查库的性能是单表 条件有索引 public Map
  • PostgreSQL插件-pg_stat_statements-查找最耗费资源的SQL(Top SQL)

    数据库是较大型的应用 对于繁忙的数据库 需要消耗大量的内存 CPU IO 网络资源 SQL 优化是数据库优化的手段之一 而为了达到 SQL 优化的最佳效果 您首先需要了解最消耗资源的 SQL Top SQL 例如 IO 消耗最高的 SQL
  • leetcode之找出相交链表的交点

    题目 编写一个程序 找到两个单链表相交的起始节点 如果相交只会是y型相交 如果不想交就返回空指针 O 1 空间和O n 时间 分析 直接采取暴力二重循环可以求解 但是超过时间限制 一个思路是先找出两个链表长度相差的值 然后一个链表先走相差的
  • 关于DAG共识的调研

    内容目录 前言 why DAG DAG 是什么 常见共识机制 主链DAG共识 朴素DAG 平行链DAG 问题与挑战 这是自己看的一篇综述 参考里面的分类并对现在的一些DAG共识做的简要理解 后面会对一些共识的论文做学习笔记 若有错误之处还请
  • 公开数据集下载地址

    这里写目录标题 一 目标检测 分割数据集 1 COCO 数据集 COCO2014 COCO2017 2 PASCAL VOC数据集 voc2007数据集 voc 2012数据集 二 自动驾驶数据集 1 BDD100K 数据集 2 Nusce
  • STM32单片机示例:多个定时器同步触发启动

    文章目录 前言 基础说明 关键配置与代码 其它补充 示例链接 前言 多个定时器同步触发启动是一种比较实用的功能 这里将对此做个示例说明 基础说明 该示例演示通过一个TIM使能时同步触发使能另一个TIM 本例中使用TIM1作为主机 使用TIM
  • Linux主机测评

    安全计算环境 一 身份鉴别 a 应对登录的用户进行身份标识和身份鉴别 身份标识具有唯一性 身份鉴别信息具有复杂度要求并定期更换 此项部分符合 在root权限下查看有关用户的配置文件 1 通过etc password检查身份标识 看是否有没有
  • qq windows版客户端0day复现——远程代码执行(七夕小礼物)

    ps 本文章仅用来分享 请勿将文章内的相关技术用于非法目的 请勿将文章内的相关技术用于非法目的 请勿将文章内的相关技术用于非法目的 如有非法行为与本文章作者无任何关系 一切行为以遵守 中华人民共和国网络安全法 为前提 今天hw貌似爆了挺多劲
  • R语言 集成算法(Bagging算法和Adaboot算法)

    关注微信公共号 小程在线 关注CSDN博客 程志伟的博客 R版本 3 6 1 adaboost包 提供Bagging函数和Adaboot函数 gt setwd G R语言 大三下半年 数据挖掘 R语言实战 gt data read csv
  • 实现登录功能之拦截器和导航守卫的使用

    需求 本次主要通过SpringSecurity jwt vue实现简易的登录Demo 实现的功能 主要写Demo过程中记录关于拦截器和导航守卫的使用 环境 nodejs v14 16 1 vue 2 9 6 npm 6 14 12 webp
  • 【求助】ERROR: No matching distribution found for python-gssapi==0.6.4怎么解决

    Collecting python gssapi 0 6 4 Using cached https pypi tuna tsinghua edu cn packages a4 9e 648b4e85235097edcee561c986f70
  • 数据结构-时间复杂度

    一 常数操作 常见固定时间的操作 1 常见算术运算 2 位运算 gt gt gt gt gt lt lt 等 3 赋值 比较 自增 自减 4 数组寻址 可以通过计算偏移量直接获取第N位置的内容 对比链表寻址 是没有办法直接计算得到第N位置的
  • c# 进程的创建与撤销

    1 创建进程 using System using System Diagnostics using System ComponentModel namespace MyProcessSample class MyProcess publi
  • C++(11):线程局部变量thread_local

    多线程中 每个线程都拥有自己的栈空间 但是对于全局变量 静态变量以及堆上空间 是共享于多个线程间的 这可以有效的在多个线程间共享数据 但也是多线程竞争的主要来源 include
  • 浅谈人工智能与伦理道德

    人工智能技术简介 人 工 智 能 技 术 简 称 AI ArtificialIntelligence AI作为一门学科 于1956 年问世 是由 人工智能之父 麦卡锡 McCartney 及一批数学家 信息学家 心理学家 神经生理学家 计算
  • Android 调试桥(adb)安装、配置、使用

    一 安装 1 官网 https developer android com studio command line adb 2 下载 3 解压 二 配置环境 在安装完成之后 将android的adb工具所在目录加入环境变量里面 1 在终端中
  • neo4j--Cypher索引、约束、统计

    Cypher索引 约束 统计 1 索引 1 1创建索引 使用CREATE INDEX ON可以在拥有某个标签的所有节点的某个属性上创建索引 注意 索引是在后台创建 并不能立刻就生效 CREATE INDEX ON Person name 本