创建节点和关系 create

创建一个家谱

  1. CREATE (erzi:Person {id:'erzi'}),
  2. (baba:Person {id:'baba'}),
  3. (yeye:Person {id:'yeye',name:'zhangsan'}),
  4. (nainai:Person {id:'nainai'}),
  5. (mama:Person {id:'mama'}),
  6. (bozi:Person {id:'bozi'}),
  7. (erzi)-[:fathor]->(baba),
  8. (baba)-[:fathor]->(yeye),
  9. (baba)-[:mother]->(nainai),
  10. (erzi)-[:mother]->(mama),
  11. (erzi)-[:girlFrend]->(bozi)

查询 match

  1. MATCH (n:Person) where n.RETURN n

必须要用return返回一个值,不然会报错

添加新关系merge

先查询出来再merge

  1. Match (n:Person {id:'erzi'}),(f:Person {id:'bozi'})
  2. Merge (n)-[:fuqi]->(f)

merge如果有则查询,如果没有则创建,相当于create或match

替换关系merge

  1. Match (n:Person ),(f:Person)
  2. where n.and f.Merge (n)-[r:fuqi]->(f) delete r
  3. Merge (n)-[:FUQI]->(f)
  4. return n,f

更新set

更新属性

  1. Match (n:Person {id:'baba'}) set n.name='张三' return n

属性名是写数据时自动创建,无schme特性,这点痛no-sql库;支持非结构化数据——非结构化:不同行得数据可以有不同得列个数

  1. Match (n:Person {id:'baba'}) set n.name='张三',n.age=50 return n

Cypher语言中,任意语法都可以有return

删除 delete, remove

delete: 操作删除节点和关系
remove: 操作删除标签和属性
两个命令都应该和match命令一起用
删除节点和关系

  1. MATCH (s:Teacher)-[r:teach]->(d:Student) delete r,s,d //删除与该关系相关的老师和学生及label
  2. MATCH (n:Test) remove n:Test //删除label

仅仅删一个关系,不删节点

  1. Match (a:Person),(b:Person) where a.and b.merge (a)-[r:FUQI]->(b) DELETE r

排序 order by

降序

  1. MATCH (n:Person) RETURN n order by n.id,n.name desc LIMIT 25`

升序

  1. MATCH (n:Person) RETURN n order by n.id LIMIT 25

Limit和Skip

Limit:显示多少行,最前边开始,一般查询都会带limit控制行数
Skip:跳过前多少行

  1. MATCH (n:Person) RETURN n order by n.id desc skip 2 LIMIT 25

Union和union all

Union:把多段Match的return结果上限组合成一个结果集,会自动去掉重复行;
Union all:作用同Union,但不去重,常用,因为一般不会需要去重

  1. MATCH (n:Person) where n.age>20 RETURN n.id,n.age
  2. union all
  3. MATCH (n:Person) where n.RETURN n.id,n.age

Null 需要注意什么

可以把检索出的空行去掉

  1. MATCH (n:Person)
  2. where n.age>20 RETURN n.id,n.age
  3. union all
  4. MATCH (n:Person)
  5. where n.and n.age
  6. is not null
  7. RETURN n.id,n.age

where属性is null;is not null 其实同关系sql语法

in 语法

功能同上

  1. 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

内置id

每个节点或relation都有个系统分配的id,从0开始递增,全局唯一!
create(a:Person{iid:’123’}) //这里的id是一个属性,和内置id是两码事
通过函数id(node/relation)可以获取id值
不透明,犹如Oracle里的rowid
用户可定义id属性,与内置id无关

Relation具有方向性

create节点之间关系时,必须指定方向,否则会报错:
查询时有时不关心关系的方向性,可以不带方向查询
MATCH (n:Person)-[:FUQI]-(s:Person) RETURN distinct n,s

索引index

增加搜索性能
create index on :Person(id); //创建id字段索引
drop index on :Person(id); //删除索引
根据查询需要,把查询多的字段建索引
create index on :Person(name) //给name字段也建索引;

  • 不需要给索引其名称,只需要设置索引的字段即可;
  • 通过该字段的查询都走索引,不论索引字段有没有套函数
    • where
    • in
    • substring

      执行计划

      用explain看执行计划,看有没有索引的区别
      1. explain Match (n:Person) where n.name='zhangsan' return n
      image.png

      属性唯一约束 constraint

可以给某一属性设置唯一约束

  1. CREATE CONSTRAINT ON (a:Person) ASSERT a.id IS UNIQUE // 创建约束
  2. drop CONSTRAINT ON (a:Person) ASSERT a.id IS UNIQUE //删除约束

函数

功能 描述
UPPER 它用于将所有字母更改为大写字母。
LOWER 它用于将所有字母改为小写字母。
SUBSTRING 它用于获取给定String的子字符串。
REPLACE 它用于替换一个字符串的子字符串。

  1. Match (n:Person) return SUBSTRING(n.id,2,0),n.id

聚集函数 描述

COUNT 它返回由MATCH命令返回的行数。
MAX 它从MATCH命令返回的一组行返回最大值。
MIN 它返回由MATCH命令返回的一组行的最小值。
SUM 它返回由MATCH命令返回的所有行的求和值。
AVG 它返回由MATCH命令返回的所有行的平均值。

聚集函数

Neo4j 无group by

  1. Match (n:Person) return count(*)
  2. Match (n:Person) return avg(n.age) //只包含age不为空的node

shortestPath 查询最短路径

6层关系理论:任何两个事物之间的关系都不会超过6层。
查询最短路径的必要性
allShortestPaths

  1. //[*..n] 用于表示获取n层关系
  2. match p=shortestPath((n:Person {id:'mama'})-[*..3]-(b:Person {id:'nainai'})) return p //随机显示一条n层关系路
  3. match p=allshortestPaths((n:Person {id:'mama'})-[*..3]-(b:Person {id:'nainai'})) return p //显示全部关系链路

关系链路越短,代表这两个节点的关系越密切!

语法大全手册

cypher 语法大全.pdf