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. 命名规范 ​

  • 节点变量:使用小写字母,如 person、company
  • 关系变量:使用小写字母,如 friendship、works_at
  • 标签:使用 PascalCase,如 Person、Company
  • 关系类型:使用 UPPER_SNAKE_CASE,如 FRIENDS_WITH、WORKS_AT
  • 属性名:使用 camelCase,如 firstName、lastName

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 进行图数据查询和操作。