1、概述

“Cypher”是一个描述性的类Sql的图操作语言。相当于关系数据库的Sql
,可见其重要性!其语法针对图的特点而设计,非常方便和灵活。没有Join,是一大特点!学好Cypher是学好Neo4j的关键,也是核心所在!

2、Neo4j字段类型
Neo4j字段类型
3、Neo4j基本操作

3.1 增(create)
CREATE (erzi:Person {id:‘erzi’}), //erzi是别名 (baba:Person {id:'baba'}),
(yeye:Person {id:'yeye',name:'zhangsan'}), (nainai:Person {id:'nainai'}),
(mama:Person {id:'mama'}), (bozi:Person {id:'bozi'}), (erzi)-[:fathor]->(baba),
(baba)-[:fathor]->(yeye), (baba)-[:mother]->(nainai), (erzi)-[:mother]->(mama),
(erzi)-[:girlFrend]->(bozi) 说明: create (n:Person
{id:'20140101',name:'王五',age:30,card:123456}) 相当于关系Sql的: Create table Person(
id varchar2, name varchar2, age number, card number ); Insert into Person
values(‘20140101’,’王五’,30,123456);
3.2 查(match)
Match查询语法 Match 相当于select MATCH (n:Person) RETURN n limit 25 等价于: Select *
from Person limit 25 问题1: 如何给已经存在的人添加关系? Match (n:Person {id:'erzi'}),(f:Person
{id:'bozi'}) Merge (n)-[:fuqi]->(f) 问题2: 儿子和柏之结婚了,relation如何修改? Match (n:Person
),(f:Person) where n.id='erzi' and f.id='bozi' Merge (n)-[r:fuqi]->(f) #
更Neo4j的一种写法 Match (n:Person{id:'erzi'}),(f:Person{id:'bozi'}) Merge
(n)-[r:fuqi]->(f) 说明:merge用来创建关系,如果已经存在,则可以作为查询 #
查询和baba这个节点是fathor关系的其它节点,并返回查看这两个节点 match (n:Person {id:'baba'})-[:fathor]-(f)
return n,f # 查询和baba这个节点的fathor,并返回查看这两个节点 match (n:Person
{id:'baba'})-[:fathor]->(f) return n,f # 查询和baba这个节点的fathor,只返回baba这个节点的fathor
match (n:Person {id:'baba'})-[:fathor]-(f) return f
3.3、改(set)
Cypher中无Update,用set代替 # 更新属性 Match (n:Person {id:'baba'}) set n.name='张三'
return n # 属性名是写数据时自动创建,无schme特性,这点同no-sql库;支持非结构化数据;非结构化:不同行的数据可以有不同的列个数;
Match (n:Person {id:'baba'}) set n.name='张三',n.age=50 return n
说明:Cypher语言中,任意语法都可以有return
3.4 删(delete,remove)
DELETE和REMOVE主要区别 : ① DELETE操作用于删除节点和relation(针对图结构)。 ②
REMOVE操作用于删除标签label和属性(针对关系型结构)。 说明:Remove label 等同于drop
table;两个命令都应该与MATCH命令一起使用。 Match (n:Person {id:'baba'}) remove n.age return n
MATCH (s:Teacher)-[r:teach]->(d:Student) delete r,s,d //删除与该关系相关的老师和学生及label
MATCH (n:Test) remove n:Test //删除label # 如何仅仅删除一个relation? Match
(a:Person),(b:Person) where a.id='erzi' and b.id='bozi' merge (a)-[r:FUQI]->(b)
DELETE r # 或者更Neo4j的写为 Match (a:Person{id:'erzi'}),(b:Person{id:'bozi'}) merge
(a)-[r:FUQI]->(b) DELETE r # 删除所有记录 MATCH (n) OPTIONAL MATCH (n)-[r]-() DELETE
n,r
3.5 排序(order by)
# 同关系sql MATCH (n:Person) RETURN n order by n.id,n.name desc LIMIT 25 # 正序
MATCH (n:Person) RETURN n order by n.id LIMIT 25
3.6 限制显示(limit)
MATCH (n:Customer) RETURN n LIMIT 25
3.7 跳过前n条(skip)
MATCH (n:Person) RETURN n order by n.id desc skip 2 LIMIT 25
3.8 union和union all
# 同关系sql # Union:把多段Match的return结果 上线组合成一个结果集,会自动去掉重复行; # Union
all:作用同union,但不去重; MATCH (n:Person) where n.age>20 RETURN n.id,n.age union all
MATCH (n:Person) where n.id='erzi' RETURN n.id,n.age
3.9 Null
# Where 属性 is null,其实同关系sql语法,就是把结果进行“并” MATCH (n:Person) where n.age>20
RETURN n.id,n.age union all MATCH (n:Person) where n.id='erzi' and n.age is not
null RETURN n.id,n.age
3.10 in
# 中括号标识某个字段的范围 MATCH (n:Person) where n.age>20 RETURN n.id,n.age union all
MATCH (n:Person) where n.id in ['erzi','bozi','baba'] RETURN n.id,n.age
3.11 内置id
每个节点或relation都有个系统分配的id,从0开始递增,全局唯一! Create (a:Person {id:’123’})
//这里的ID是一个属性,和内置ID是两码事 通过函数id(node/relation) 可以获取id值; 不透明,犹如Oracle里的rowid;
用户可定义id属性,与内置id无关;
3.12 Relation 具有方向性
# Create节点之间关系时,必须指定方向,否则会报错 # 查询时可以不指定方向,意思时哪个方向都可以 MATCH
(n:Person)-[:FUQI]-(s:Person) RETURN distinct n,s
3.13 索引(index)
# 建立索引后前后的复杂度分别时O(n),O(1) create index on :Person(id); drop index on
:Person(id); 给哪些字段创建索引呢?根据查询需要,把查询多的字段建索引。 create index on :Person(name);
1、不需要给索引起名称,只需要设置索引字段即可; 2、通过该字段的查询都走索引 where in substring
关系DB中:索引字段套一层函数的话,基本不走索引了。
3.14 执行计划(explain)
# 用于跟踪显示查询的过程 explain MATCH p=()-[r:ORDERS]->() RETURN p LIMIT 25 explain
 

3.15 属性唯一约束  CONSTRAINT
# 给属性建立索引时,同一个属性值不能对应两条记录,其实就是属性的唯一性约束要求 # 通过CONSTRAINT可以给属性设置、取消唯一性要求 CREATE
CONSTRAINT ON (a:Person) ASSERT a.id IS UNIQUE Drop CONSTRAINT ON (a:Person)
ASSERT a.id IS UNIQUE
3.16 常用函数
# 即用即查 功能函数 描述 UPPER 它用于将所有字母更改为大写字母。 LOWER 它用于将所有字母改为小写字母。 SUBSTRING
它用于获取给定String的子字符串。 REPLACE 它用于替换一个字符串的子字符串。 Match (n:Person) return
SUBSTRING(n.id,2,0),n.id 聚合函数 描述 COUNT 它返回由MATCH命令返回的行数。 MAX
它从MATCH命令返回的一组行返回最大值。 MIN 它返回由MATCH命令返回的一组行的最小值。 SUM 它返回由MATCH命令返回的所有行的求和值。 AVG
它返回由MATCH命令返回的所有行的平均值。 # Neo4j无 group by,用以下方式执行 Match (n:Person) return
count(*) Match (n:Person) return avg(n.age) 只包含age不为空的node
3.17 查询最短路径(shortestPath)
# 返回所有最短路径 allShortestPaths # [*..n]
用于表示获取n层关系,下面的意思时获取奶奶和妈妈之间距离为<=3的最短路径,两个点相连 # 其距离是1,存在多个最短路径时,仅随机返回1个 match
p=shortestPath((n:Person {id:'mama'})-[*..3]-(b:Person {id:'nainai'})) return p
# 关系链路越短,代表这两个节点的关系越密切!
 

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信