我们先准备脚本,创建数据,以便后续使用

// 删除所有的节点和关系 MATCH(n) OPTIONAL MATCH (n)-[r]-() DELETE n,r
// 创建Person 的节点
CREATE (person:Person {cid:1,name:"范闲",age:24,gender:0,character:"A",money:1000,description:"范闲,是猫腻小说《庆余年》主人公,穿越人士,庆国数十年风雨画卷的见证者。其容貌俊美无双,尤胜于女子,生性淡薄刚毅,善良而腹黑,城府极深,重视恩情。最终隐居江南"});
CREATE (person:Person {cid:2,name:"林婉儿",age:20,gender:1,character:"B",money:800,description:"林婉儿是庆国宰相和长公主的私生女,电视剧《庆余年》里的女主人公,由李沁饰演"});
CREATE (person:Person {cid:3,name:"庆帝",age:49,gender:0,character:"A",money:8900,description:"庆帝,网文作家猫腻所著的权谋小说《庆余年》的角色之一,南庆国的皇帝,心中装有天下统一"});CREATE (person:Person {cid:4,name:"长公主",age:46,gender:1,character:"B",money:3700,description:"《庆余年》中,长公主这个人不仅人设很复杂,就连她的感情生活还是挺复杂。长公主所处的身份就是庆国的公主,皇帝的妹妹,太子的姑姑,国家重要财权的掌管,林婉儿的母亲"});
CREATE (person:Person {cid:5,name:"宰相林若甫",age:47,gender:0,character:"A",money:1600,description:"林若甫,是电视剧《庆余年》登场的虚拟人物之一,南庆当朝宰相,林婉儿的亲生父亲。"});CREATE (person:Person {cid:6,name:"叶灵儿",age:20,gender:1,character:"C",money:700,description:"叶灵儿,网文作家猫腻所著的权谋小说《庆余年》的角色之一,林婉儿的好友,最后嫁给了二皇子"});
CREATE (person:Person {cid:7,name:"九品射手燕小乙",age:47,gender:0,character:"C",money:900,description:"一品最低,九品最高。庆帝身边的燕小乙便是九品,而且是庆国独一无二的神射手,臂力、眼力、听力惊人"});
CREATE (person:Person {cid:8,name:"二皇子",age:26,gender:0,character:"B",money:1700,description:"《庆余年》中,二皇子结局自杀身亡。二皇子对庆帝也是意见很大,但以他的实力还掀不起什么水花,所以只能慢慢等待时机"});
CREATE (person:Person {cid:9,name:"靖王世子",age:25,gender:0,character:"A",money:1600,description:"在《庆余年》中,此靖王非彼靖王,但是同音之美也会让人会对靖王世子李弘成这个角色产生好感,而靖王世子李弘成的出场的确是帮助了范闲逃脱太子势力的纠缠"});
CREATE (person:Person {cid:10,name:"王启年",age:46,gender:0,character:"C",money:1700,description:"王启年,网文作家猫腻所著的权谋小说《庆余年》的角色之一,庆国监察院一处的文书,擅长追踪之术。"});
CREATE (person:Person {cid:11,name:"北齐圣女海棠朵朵",age:21,gender:1,character:"A",money:2600,description:"海棠朵朵是北齐国的才女,被人尊称为圣女,而且是北齐大宗师苦荷的关门弟子,在北齐国也算是举足轻重的人物"});
CREATE (person:Person {cid:12,name:"北齐小皇帝战豆豆",age:20,gender:0,character:"A",money:4600,description:"很多人想知道剧中的北齐小皇帝是谁呢?让小编告诉你们吧。 战豆豆是北齐第二任皇帝,乃前北魏一代大将战清风之孙,大宗师苦荷的叔侄女兼徒孙"});//创建关系
match(person:Person {name:"范闲"}),(person2:Person {name:"林婉儿"}) create(person)-[r:Couple]->(person2);
match(person:Person {name:"范闲"}),(person2:Person {name:"王启年"}) create(person)-[r:Friends]->(person2);
match(person:Person {name:"范闲"}),(person2:Person {name:"北齐圣女海棠朵朵"}) create(person)-[r:Friends]->(person2);
match(person:Person {name:"范闲"}),(person2:Person {name:"庆帝"}) create(person)-[r:Father]->(person2);
match(person:Person {name:"范闲"}),(person2:Person {name:"长公主"}) create(person)-[r:Wife_Mother]->(person2);
match(person:Person {name:"庆帝"}),(person2:Person {name:"二皇子"}) create(person)-[r:Son]->(person2);
match(person:Person {name:"庆帝"}),(person2:Person {name:"长公主"}) create(person)-[r:BrotherSister]->(person2);
match(person:Person {name:"二皇子"}),(person2:Person {name:"靖王世子"}) create(person)-[r:Friends]->(person2);
match(person:Person {name:"北齐圣女海棠朵朵"}),(person2:Person {name:"北齐小皇帝战豆豆"}) create(person)-[r:Friends]->(person2);
match(person:Person {name:"林婉儿"}),(person2:Person {name:"叶灵儿"}) create(person)-[r:Friends]->(person2);
match(person:Person {name:"林婉儿"}),(person2:Person {name:"宰相林若甫"}) create(person)-[r:Father]->(person2);
match(person:Person {name:"林婉儿"}),(person2:Person {name:"长公主"}) create(person)-[r:Mother]->(person2);
match(person:Person {name:"长公主"}),(person2:Person {name:"九品射手燕小乙"}) create(person)-[r:Friends]->(person2);如果关系建立错了  可以删除关系
match p = (:Person {name:"林婉儿"})-[r:Couple]-(:Person)  delete r 考虑了关系的方向
match data=(na:Person {name:"范闲"})-[*2..2]->(nb:Person) return nb不考虑关系的方向
match data=(na:Person {name:"范闲"})-[*2..2]-(nb:Person) return nbshortestPath函数返回路径长度最短的path
MATCH p=shortestPath( (person:Person {name:"王启年"})-[*]-(person2:Person {name:"九品射手燕小乙"}) ) RETURN length(p), nodes(p)不使用 shortestPath
MATCH p=(person:Person {name:"王启年"})-[*]-(person2:Person {name:"九品射手燕小乙"}) RETURN p
MATCH p=shortestPath( (person:Person {name:"王启年"})-[*]-(person2:Person {name:"九品射手燕小乙"}) ) where length(p)>1  RETURN pexplain MATCH p=shortestPath( (person:Person {name:"王启年"})-[*]-(person2:Person {name:"九品射手燕小乙"}) ) where length(p)>1  RETURN pexplain MATCH p=shortestPath( (person:Person {name:"王启年"})-[*]-(person2:Person {name:"九品射手燕小乙"}) ) with p where length(p)>1  RETURN p全文索引
CALL db.index.fulltext.createNodeIndex("nameAndDescription",["Person"],["name", "description"])
CALL db.index.fulltext.queryNodes("nameAndDescription", "范闲") YIELD node, score
RETURN node.title, node.description, score

1、CQL 函数

(1)字符串函数

功能 描述
UPPER 它用于将所有字母更改为大写字母。
LOWER 它用于将所有字母改为小写字母。
SUBSTRING 它用于获取给定String的子字符串。
REPLACE 它用于替换一个字符串的子字符串。
MATCH (p:Person)
RETURN ID(p),LOWER(p.character)
match(p:Person) return
p.character,lower(p.character),p.name,substring(p.name,2),replace(p.name,"子","zi")

(2)聚合函数

聚集功能 描述
COUNT 它返回由MATCH命令返回的行数。
MAX 它从MATCH命令返回的一组行返回最大值。
MIN 它返回由MATCH命令返回的一组行的最小值。
SUM 它返回由MATCH命令返回的所有行的求和值。
AVG 它返回由MATCH命令返回的所有行的平均值。
MATCH (p:Person)
RETURN MAX(p.money),SUM(p.money)

(3)关系函数

功能 描述
STARTNODE 它用于知道关系的开始节点。
ENDNODE 它用于知道关系的结束节点。
ID 它用于知道关系的ID。
TYPE 它用于知道字符串表示中的一个关系的TYPE。
match p = (:Person {name:"林婉儿"})-[r:Couple]-(:Person)
RETURN STARTNODE(r)

(4)shortestPath 函数返回最短的path

MATCH p=shortestPath( (node1)-[*]-(node2) )
RETURN length(p), nodes(p)
MATCH p=shortestPath((person:Person {name:"王启年"})-[*]-(person2:Person{name:"九品射手燕小乙"}) )
RETURN length(p), nodes(p)

2、CQL多深度关系节点

(1)使用with关键字

查询三层级关系节点如下:with可以将前面查询结果作为后面查询条件

match (na:Person)-[re]->(nb:Person) where na.name="范闲" WITH na,re,nb match (nb:Person)-[re2]->(nc:Person) return na,re,nb,re2,ncmatch (na:Person)-[re]->(nb:Person) where na.name="林婉儿" WITH na,re,nb match (nb:Person)-[re2]->(nc:Person) return na,re,nb,re2,ncmatch (na:Person)-[re]-(nb:Person) where na.name="林婉儿" WITH na,re,nb match (nb:Person)-[re2]->(nc:Person) return na,re,nb,re2,ncmatch (na:Person)-[re]-(nb:Person) where na.name="林婉儿" WITH na,re,nb match (nb:Person)-[re2:Friends]->(nc:Person) return na,re,nb,re2,nc

(2)直接拼接关系节点查询

match (na:Person{name:"范闲"})-[re]->(nb:Person)-[re2]->(nc:Person) return na,re,nb,re2,nc为了方便,可以将查询结果赋给变量,然后返回
match data=(na:Person{name:"范闲"})-[re]->(nb:Person)-[re2]->(nc:Person) return data

(3)使用深度运算符

  • 当实现多深度关系节点查询时,显然使用以上方式比较繁琐。
  • 可变数量的关系->节点可以使用-[:TYPE*minHops..maxHops]-。

查询:

match data=(na:Person{name:"范闲"})-[*1..2]-(nb:Person) return data

3、事务

为了保持数据的完整性和保证良好的事务行为,Neo4j也支持ACID特性 。

注意:

  • 所有对Neo4j数据库的数据修改操作都必须封装在事务里。
  • 默认的isolation level是READ_COMMITTED。
  • 死锁保护已经内置到核心事务管理 。 (Neo4j会在死锁发生之前检测死锁并抛出异常。在异常抛出之前,事务会被标志为回滚。当事务结束时,事务会释放它所持有的锁,则该事务的锁所引起的死锁也就是解除,其他事务就可以继续执行。当用户需要时,抛出异常的事务可以尝试重新执行)
  • 除特别说明,Neo4j的API的操作都是线程安全的,Neo4j数据库的操作也就没有必要使用外部的同步方法。

4、索引

(1)简介

  • Neo4j CQL支持节点或关系属性上的索引,以提高应用程序的性能。
  • 可以为具有相同标签名称的属性上创建索引。
  • 可以在MATCH或WHERE等运算符上使用这些索引列来改进CQL 的执行。

(2)创建单一索引

CREATE INDEX ON :Label(property)例如:
CREATE INDEX ON :Person(name)

(3)创建复合索引

CREATE INDEX ON :Person(age, gender)

(4)全文模式索引

之前的常规模式索引只能对字符串进行精确匹配或者前后缀索引(startswith,endswith,contains),全文索引将标记化索引字符串值,因此它可以匹配字符串中任何位置的术语。索引字符串如何被标记化并分解为术语,取决于配置全文模式索引的分析器。索引是通过属性来创建,便于快速查找节点或者关系。

创建和配置全文模式索引

使用db.index.fulltext.createNodeIndex和db.index.fulltext.createRelationshipIndex创建全文模式索引。在创建索引时,每个索引必须为每个索引指定一个唯一的名称,用于在查询或删除索引时引用相关的特定索引。然后,全文模式索引分别应用于标签列表或关系类型列表,分别用于节点和关系索引,然后应用于属性名称列表。

语法:

call db.index.fulltext.createNodeIndex("索引名",[Label,Label],[属性,属性])
call db.index.fulltext.createNodeIndex("nameAndDescription",["Person"],["name", "description"])call db.index.fulltext.queryNodes("nameAndDescription", "范闲") YIELD node, score RETURN node.name, node.description, score

(5)查看和删除索引

call db.indexes 或者 :schemaDROP INDEX ON :Person(name)DROP INDEX ON :Person(age, gender)call db.index.fulltext.drop("nameAndDescription")

5、约束

(1)唯一性约束

  作用:

  • 避免重复记录。
  • 强制执行数据完整性规则

创建唯一性约束

CREATE CONSTRAINT ON (变量:<label_name>) ASSERT 变量.<property_name> IS UNIQUE
具体实例:
CREATE CONSTRAINT ON (person:Person) ASSERT person.name IS UNIQUE

删除唯一性约束

DROP CONSTRAINT ON (cc:Person) ASSERT cc.name IS UNIQUE

(2)属性存在约束 (企业版中可用)

CREATE CONSTRAINT ON (p:Person) ASSERT exists(p.name)

(3)查看约束

call db.constraints
:schema

Neo4j CQL高级相关推荐

  1. Neo4j CQL(函数、索引、约束)、备份恢复、优化

    一.CQL高级 1.CQL函数 字符串函数 MATCH (p:Person) RETURN ID(p),LOWER(p.character) match(p:Person) return p.char ...

  2. Neo4j - CQL简介

    CQL代表Cypher查询语言. 像Oracle数据库具有查询语言SQL,Neo4j具有CQL作为查询语言. Neo4j CQL - 它是Neo4j图形数据库的查询语言. 它是一种声明性模式匹配语言 ...

  3. Neo4j CQL - (3) -RETURN子句

    Neo4j CQL RETURN子句用于 - 检索节点的某些属性 检索节点的所有属性 检索节点和关联关系的某些属性 检索节点和关联关系的所有属性 RETURN命令语法: RETURN <node ...

  4. neo4j CQL使用

    neo4j CQL使用 Neo4j的Cypher语言是为处理图形数据而构建的,CQL代表Cypher查询语言.像Oracle数据库具有查询 语言SQL,Neo4j具有CQL作为查询语言. 它是Neo4 ...

  5. Neo4j - CQL使用

    3.1 Neo4j - CQL简介 Neo4j的Cypher语言是为处理图形数据而构建的,CQL代表Cypher查询语言.像Oracle数据库具有查询 语言SQL,Neo4j具有CQL作为查询语言. ...

  6. Neo4j CQL简介

    CQL CQL 代表 Cypher 查询语言.像 Orcale 数据库具有查询语言 SQL,Neo4j 具有 CQL 作为查询语言. Neo4j CQL Neo4j 图形数据库的查询语言: 一种声明性 ...

  7. [Neo4j] CQL命令

    文章目录 docker运行neo4j CQL create创建一个节点 match获取数据 RETURN子句 MATCH & RETURN匹配和返回 关系 where子句 delete子句 r ...

  8. Neo4j CQL(附springboot集成neo4j)

    CQL代表Cypher查询语言. 像Oracle数据库具有查询语言SQL,Neo4j具有CQL作为查询语言. 常用的Neo4j CQL命令/条款如下: S.No. CQL命令/条 用法 1. CREA ...

  9. Neo4j CQL - DELETE删除

    Neo4j使用CQL DELETE子句 删除节点 删除节点及相关节点和关系 1. DELETE删除节点 DELETE <node-name-list> 语法元素 描述 DELETE CQL ...

最新文章

  1. Linux Top 命令解析 比较详细
  2. [na]tcpdump非常实用的抓包实例
  3. Spring Cloud实战小贴士:Zuul的饥饿加载(eager-load)使用
  4. 解决新浪微盘下载没反应下载中断
  5. shell的变量以及常见符号
  6. 【OpenPose-Windows】OpenPose+VS2015+Windows+CUDA8+cuDNN5.1 官方配置教程
  7. JSON基础与数据解析、JSON方法、AJAX初识
  8. PopupWindow和AlertDialog区别
  9. 《数据分析实战:基于EXCEL和SPSS系列工具的实践》一3.4 数据量太大了怎么办
  10. tcpdump/editcap等工具保存文件时名称中自定义添加日期/时间
  11. DIOCP开源项目-DIOCP3的重生和稳定版本发布
  12. [洛谷P4720] [模板] 扩展卢卡斯
  13. python常用的一些东西——sys、os等(转)
  14. C++ malloc头文件
  15. ADNI-subject-Info
  16. DAO层和Service层的究极理解--这波我在大气层
  17. 对接飞鹅接口一直提示未注册
  18. ios 穿山甲广告联盟集成_穿山甲广告集成支持IOS14
  19. 父类对象指向子类引用
  20. mysql 管理instance_MySQL从零开始——第三章 MySQL体系结构

热门文章

  1. 输入一个数字n,输出一个n层的特定三角形
  2. 往返多伦多与温莎的交通全攻略!
  3. 苹果8wifi找不到服务器,iPhone8连不上wifi怎么办?苹果iPhone8无法连接网络的解决方法...
  4. IIR 数字滤波器三种结构形式的MATLAB实现
  5. Apache Kylin Spark Cubing on Kubernetes 初探
  6. 软件架构模式 mark Richards - 读后总结 2 事件驱动架构
  7. 张正友相机标定Opencv实现程序(ubuntu下)
  8. 河南理工大学计算机专业几本,河南理工大学是几本?河南理工大学是985或211吗...
  9. linux est 时间,Linux中的时区设置
  10. pandas去除重复列