Skip to content

Cypher 语法参考

完整语法速查

1. 基本语法结构

cypher
// 匹配模式
MATCH (node:Label {property: value})

// 创建节点
CREATE (node:Label {property: value})

// 创建关系
MATCH (a:Label1), (b:Label2)
CREATE (a)-[r:RELATIONSHIP_TYPE {property: value}]->(b)

// 更新属性
MATCH (node:Label {property: value})
SET node.new_property = new_value

// 删除节点
MATCH (node:Label {property: value})
DELETE node

// 删除关系
MATCH (a:Label1)-[r:RELATIONSHIP_TYPE]->(b:Label2)
DELETE r

// 返回结果
MATCH (node:Label)
RETURN node.property

// 过滤条件
MATCH (node:Label)
WHERE node.property > value
RETURN node

// 排序
MATCH (node:Label)
RETURN node.property
ORDER BY node.property DESC

// 限制结果
MATCH (node:Label)
RETURN node.property
LIMIT 10

// 跳过结果
MATCH (node:Label)
RETURN node.property
SKIP 5

// 聚合函数
MATCH (node:Label)
RETURN COUNT(node), AVG(node.property)

// 分组
MATCH (node:Label)
RETURN node.group, COUNT(node)
GROUP BY node.group

// 路径查询
MATCH path = (a:Label1)-[*1..3]->(b:Label2)
RETURN path

// 最短路径
MATCH (a:Label1), (b:Label2)
CALL gds.shortestPath.dijkstra.stream({startNode: a, endNode: b})
YIELD path
RETURN path

2. 模式语法

语法描述示例
(n)节点(person)
(n:Label)带标签的节点(person:Person)
(n {key: value})带属性的节点(person {name: 'John'})
(n:Label {key: value})带标签和属性的节点(person:Person {name: 'John'})
(a)-[r]->(b)关系(person)-[friendship]->(friend)
(a)-[r:TYPE]->(b)带类型的关系(person)-[friendship:FRIENDS_WITH]->(friend)
(a)-[r:TYPE {key: value}]->(b)带类型和属性的关系(person)-[friendship:FRIENDS_WITH {since: 2010}]->(friend)
(a)-[r*1..3]->(b)可变长度关系(person)-[friendship:FRIENDS_WITH*1..3]->(friend)

3. 子句

子句描述示例
MATCH匹配模式MATCH (person:Person)
CREATE创建节点和关系CREATE (person:Person {name: 'John'})
MERGE创建或匹配节点和关系MERGE (person:Person {name: 'John'})
SET设置属性SET person.age = 30
REMOVE移除属性或标签REMOVE person.age
DELETE删除节点和关系DELETE person
WHERE过滤条件WHERE person.age > 25
RETURN返回结果RETURN person.name
WITH传递中间结果WITH person.name AS name
ORDER BY排序结果ORDER BY person.age DESC
LIMIT限制结果数量LIMIT 10
SKIP跳过结果数量SKIP 5
DISTINCT去重结果RETURN DISTINCT person.name
UNWIND展开列表UNWIND $list AS item
FOREACH遍历列表`FOREACH (item IN $list
CALL调用过程CALL db.stats()

常用函数列表

1. 标量函数

函数描述示例
coalesce()返回第一个非 null 值coalesce(person.name, 'Unknown')
case条件表达式CASE WHEN person.age < 18 THEN 'Minor' ELSE 'Adult' END
size()返回集合或字符串的大小size(person.friends)
str()转换为字符串str(person.age)
toInteger()转换为整数toInteger(person.age)
toFloat()转换为浮点数toFloat(person.age)
toBoolean()转换为布尔值toBoolean(person.active)
datetime()返回当前日期时间datetime()
date()返回当前日期date()
time()返回当前时间time()
duration()创建时间段duration('P1Y2M3D')
rand()返回随机数rand()
round()四舍五入round(person.age)
floor()向下取整floor(person.age)
ceil()向上取整ceil(person.age)
abs()绝对值abs(person.score)
sqrt()平方根sqrt(person.score)
log()自然对数log(person.score)
exp()指数函数exp(person.score)
sin()正弦函数sin(radians(person.angle))
cos()余弦函数cos(radians(person.angle))
tan()正切函数tan(radians(person.angle))
radians()角度转弧度radians(person.angle)
degrees()弧度转角度degrees(radians(person.angle))

2. 列表函数

函数描述示例
range()创建整数范围range(1, 10)
collect()收集为列表collect(person.name)
filter()过滤列表filter(x IN person.friends WHERE x.age > 25)
map()映射列表`map(x IN person.friends
reduce()归约列表`reduce(sum = 0, x IN person.scores
extract()提取列表元素`extract(x IN person.friends
exists()检查列表是否包含元素exists(person.friends WHERE x.name = 'John')
all()检查所有元素是否满足条件all(x IN person.friends WHERE x.age > 18)
any()检查是否有元素满足条件any(x IN person.friends WHERE x.age > 30)
none()检查没有元素满足条件none(x IN person.friends WHERE x.age < 18)

3. 字符串函数

函数描述示例
trim()去除首尾空格trim(person.name)
ltrim()去除左侧空格ltrim(person.name)
rtrim()去除右侧空格rtrim(person.name)
lower()转换为小写lower(person.name)
upper()转换为大写upper(person.name)
left()左侧子字符串left(person.name, 3)
right()右侧子字符串right(person.name, 3)
substring()子字符串substring(person.name, 1, 3)
replace()替换字符串replace(person.name, 'John', 'Johnny')
split()分割字符串split(person.name, ' ')
join()连接字符串join(person.names, ', ')
startsWith()检查是否以字符串开头startsWith(person.name, 'J')
endsWith()检查是否以字符串结尾endsWith(person.name, 'n')
contains()检查是否包含字符串contains(person.name, 'oh')

4. 聚合函数

函数描述示例
COUNT()计数COUNT(person)
SUM()求和SUM(person.age)
AVG()平均值AVG(person.age)
MIN()最小值MIN(person.age)
MAX()最大值MAX(person.age)
PERCENTILE()百分位数PERCENTILE(person.age, 0.5)
STDEV()标准差STDEV(person.age)
VARIANCE()方差VARIANCE(person.age)
COLLECT()收集为列表COLLECT(person.name)
DISTINCT去重COUNT(DISTINCT person.name)

5. 图函数

函数描述示例
id()返回节点或关系的 IDid(person)
labels()返回节点的标签labels(person)
type()返回关系的类型type(relationship)
properties()返回节点或关系的属性properties(person)
startNode()返回关系的起始节点startNode(relationship)
endNode()返回关系的结束节点endNode(relationship)
length()返回路径的长度length(path)
nodes()返回路径的节点nodes(path)
relationships()返回路径的关系relationships(path)

操作符说明

1. 比较操作符

操作符描述示例
=等于person.age = 30
<>不等于person.age <> 30
<小于person.age < 30
>大于person.age > 30
<=小于等于person.age <= 30
>=大于等于person.age >= 30
IS NULL为空person.email IS NULL
IS NOT NULL不为空person.email IS NOT NULL
IN在集合中person.age IN [25, 30, 35]
NOT IN不在集合中person.age NOT IN [25, 30, 35]
STARTS WITH以字符串开头person.name STARTS WITH 'J'
ENDS WITH以字符串结尾person.name ENDS WITH 'n'
CONTAINS包含字符串person.name CONTAINS 'oh'

2. 逻辑操作符

操作符描述示例
AND逻辑与person.age > 25 AND person.name = 'John'
OR逻辑或person.age > 25 OR person.name = 'John'
NOT逻辑非NOT person.age > 25
XOR逻辑异或person.age > 25 XOR person.name = 'John'

3. 数学操作符

操作符描述示例
+加法person.age + 5
-减法person.age - 5
*乘法person.age * 2
/除法person.age / 2
%取模person.age % 2
^幂运算person.age ^ 2

4. 列表操作符

操作符描述示例
+列表连接[1, 2] + [3, 4]
IN元素在列表中3 IN [1, 2, 3]
[]列表索引[1, 2, 3][0]

5. 路径操作符

操作符描述示例
->关系方向(a)->(b)
<-反向关系(a)<-(b)
-无方向关系(a)-(b)
*可变长度(a)-[*1..3]->(b)

语法最佳实践

1. 命名规范

  • 节点变量:使用小写字母,如 personcompany
  • 关系变量:使用小写字母,如 friendshipworks_at
  • 标签:使用 PascalCase,如 PersonCompany
  • 关系类型:使用 UPPER_SNAKE_CASE,如 FRIENDS_WITHWORKS_AT
  • 属性名:使用 camelCase,如 firstNamelastName

2. 查询优化

  • 使用参数:避免字符串拼接,使用参数化查询

    cypher
    // 好的做法
    MATCH (p:Person {name: $name})
    RETURN p
    
    // 不好的做法
    MATCH (p:Person {name: 'John'})
    RETURN p
  • 使用索引:为频繁查询的属性创建索引

    cypher
    CREATE INDEX FOR (n:Person) ON (n.name)
  • 限制结果:使用 LIMIT 限制返回结果

    cypher
    MATCH (p:Person)
    RETURN p
    LIMIT 10
  • 使用标签:在 MATCH 子句中使用标签

    cypher
    // 好的做法
    MATCH (p:Person)
    RETURN p
    
    // 不好的做法
    MATCH (p)
    WHERE labels(p) = ['Person']
    RETURN p
  • 避免全图扫描:使用标签和属性过滤

    cypher
    // 好的做法
    MATCH (p:Person {name: 'John'})
    RETURN p
    
    // 不好的做法
    MATCH (p)
    WHERE p.name = 'John'
    RETURN p

3. 代码风格

  • 缩进:使用 2 或 4 个空格进行缩进
  • 换行:在子句之间换行
  • 空格:在操作符周围使用空格
  • 注释:使用 ///* */ 添加注释

4. 常见错误

  • 忘记 RETURN:查询需要 RETURN 子句来返回结果
  • 拼写错误:标签、关系类型和属性名的拼写错误
  • 类型错误:属性类型不匹配
  • 语法错误:缺少括号、逗号等
  • 性能问题:未使用索引、全图扫描等

小结

Cypher 是一种强大而直观的查询语言,专为图数据库设计。本文提供了 Cypher 语法的完整参考,包括基本语法结构、模式语法、子句、函数、操作符和最佳实践。通过掌握这些语法和技巧,您可以更有效地使用 Neo4j 进行图数据查询和操作。