Neo4j-Cypher语言语法
本文是记录Neo4j图数据库中实用的Cypher语言语法。
Cypher是什么
“Cypher”是一个描述性的类Sql的图操作语言。相当于关系数据库的Sql,可见其重要性。其语法针对图的特点而设计,非常方便和灵活。
- Cypher是一个申明式查询语言,适合于开发者和在数据库上做点对点模式(ad-hoc)查询。
- Cypher通过一系列不同的方法和建立于确定的实践为表达查询而激发的。许多关键字如
- like和order by是受SQL的启发。正则表达式匹配实现模仿Scala 语言。
学好Cypher是学好Neo4j的关键,也是核心所在!
Cypher语法
Create
1 | CREATE (erzi:Person {id:‘erzi’}), //erzi是别名 |
Match
match
相当于sql中的select
1 | MATCH (n:Person) RETURN n limit 25 |
等价于:
1 | Select * from Person limit 25 |
Merge
merge
相当于Match or Create 有则match,无则Create
1 | MERGE (n:Person { name: 'Ann' }) RETURN n |
下面这两条语句的对比?
1 | match (n:Person {id:'mama'}),(m:Person {id:'nainai'}) merge (n)-[:poxi]->(m) return n,m |
Delete 和 Remove
DELETE和REMOVE主要区别 :
DELETE操作用于删除节点和relation。
REMOVE操作用于删除标签label和属性。
Remove label 等同于drop table
两个命令都应该与MATCH命令一起使用。
1 | Match (n:Person {id:'baba'}) remove n.age return n |
如何仅仅删除一个relation?
1 | Match (a:Person),(b:Person) where a.id='erzi' and b.id='bozi' merge (a)-[r:FUQI]->(b) DELETE r |
order by
order by
同sql
Limit 和 Skip
limit
:显示多少行skip
:从最前面开始,跳过多少行
Union 和 Union all
Union
:把多段Match的return结果 上线组合成一个结果集,会自动去掉重复行;Union all
:作用同union,但不去重;
1 | MATCH (n:Person) where n.age>20 RETURN n.id,n.age |
In
和sql的区别就是使用[]中括号,而不是()括弧号
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 |
Cypher 索引
1 | create index on:Person(id) |
注意:
- 创建索引时不需要给索引起名称,只需要设置索引的字段即可
- 通过该字段的查询都走索引 where in =
唯一约束 Constraint
给某个属性设置唯一约束
1 | create constraint on (n:Person) assert n.id is unique |
执行计划 explain
类似sql
常用函数
Neo4j无 group by
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命令返回的所有行的平均值。
Match (n:Person) return count(*)
Match (n:Person) return avg(n.age) 只包含age不为空的node
查询最短路径
查询最短路径的必要性:6层关系理论:任何两个事物之间的关系都不会超过6层。
关系链路越短,代表这两个节点的关系越密切!
allShortestPaths
[*..n] 用于表示获取n层关系,显示所有的链路关系(Single shortest path)shortestPath
显示最短的链路(Single shortest path)
match p=allshortestPaths((n:Person {id:'mama'})-[*..3]-(b:Person {id:'nainai'})) return p match p=shortestPath((n:Person {id:'mama'})-[*..3]-(b:Person {id:'nainai'})) return p
-