Cypher 中的数学函数(Mathematical Functions)详解
一、什么是数学函数?
Cypher 中的数学函数(Mathematical Functions)用于对数值进行数学计算。
- 这些函数适用于整数(
Integer
)和浮点数(Float
)类型的数据。 - 数学函数通常与
RETURN
、WITH
和SET
语句一起使用,可以在查询过程中对数据进行转换和计算。
二、Cypher 常见数学函数列表
函数名称 | 描述 | 示例 |
---|---|---|
abs() | 取绝对值 | abs(-5) → 5 |
ceil() | 取大于等于指定数的最小整数 | ceil(4.3) → 5 |
floor() | 取小于等于指定数的最大整数 | floor(4.8) → 4 |
round() | 对数值进行四舍五入 | round(3.5) → 4 |
sqrt() | 计算平方根 | sqrt(9) → 3.0 |
sign() | 返回数值的符号 (-1, 0, 1) | sign(-42) → -1 |
rand() | 返回 0 到 1 之间的随机数 | rand() → 0.574 (示例) |
e() | 返回自然常数 e | e() → 2.718281828459045 |
exp() | 计算 e 的指定幂 | exp(2) → 7.389 |
log() | 计算自然对数 | log(2.718) → 1.0 |
log10() | 计算以 10 为底的对数 | log10(100) → 2.0 |
pi() | 返回圆周率 π | pi() → 3.141592653589793 |
cos() | 计算角度的余弦值(弧度) | cos(pi()/3) → 0.5 |
sin() | 计算角度的正弦值(弧度) | sin(pi()/2) → 1.0 |
tan() | 计算角度的正切值(弧度) | tan(pi()/4) → 1.0 |
acos() | 计算反余弦(返回弧度) | acos(0.5) → 1.047 |
asin() | 计算反正弦(返回弧度) | asin(1) → 1.5708 |
atan() | 计算反正切(返回弧度) | atan(1) → 0.785 |
atan2() | 计算 y/x 的反正切(返回弧度) | atan2(1, 1) → 0.785 |
haversin() | 计算半正矢(Haversine)距离 | haversin(1) → 0.2298 |
三、Cypher 数学函数详细解析
3.1 abs()
- 取绝对值
RETURN abs(-42) AS result
- 返回
42
的绝对值。
MATCH (n:Product)
RETURN n.name, abs(n.discount) AS positiveDiscount
- 返回
Product
节点discount
属性的绝对值。
3.2 ceil()
- 向上取整
RETURN ceil(4.3) AS result
4.3
向上取整,返回5
。
MATCH (n:Product)
RETURN n.name, ceil(n.price) AS roundedPrice
- 向上取整
Product
节点的price
属性。
3.3 floor()
- 向下取整
RETURN floor(4.8) AS result
4.8
向下取整,返回4
。
MATCH (n:Order)
RETURN n.id, floor(n.totalAmount) AS amount
- 向下取整
Order
的totalAmount
。
3.4 round()
- 四舍五入
RETURN round(3.5) AS result
3.5
四舍五入为4
。
MATCH (n:Invoice)
RETURN n.id, round(n.totalPrice) AS finalPrice
- 对
Invoice
的totalPrice
进行四舍五入。
3.5 sqrt()
- 计算平方根
RETURN sqrt(9) AS result
- 返回
9
的平方根3.0
。
MATCH (n:Point)
RETURN n.id, sqrt(n.x * n.x + n.y * n.y) AS distance
- 计算点
(x, y)
到原点的距离。
3.6 sign()
- 返回数值的符号
RETURN sign(-10) AS result
- 返回
-1
表示负数。
MATCH (n:Transaction)
RETURN n.id, sign(n.amount) AS transactionType
- 根据
amount
的符号确定交易类型。
3.7 rand()
- 返回 0 到 1 之间的随机数
RETURN rand() AS randomValue
- 生成一个
0
到1
之间的随机数。
MATCH (n:User)
RETURN n.name, rand() AS luckyNumber
- 为
User
节点生成一个随机数。
3.8 e()
- 返回自然常数 e
RETURN e() AS result
- 返回自然常数
e
的值2.718281828459045
。
3.9 exp()
- 计算 e
的指定幂
RETURN exp(2) AS result
- 计算
e^2
,返回7.389056098930649
。
3.10 log()
- 计算自然对数
RETURN log(2.718) AS result
- 计算
2.718
的自然对数,接近1.0
。
3.11 log10()
- 计算以 10 为底的对数
RETURN log10(100) AS result
- 返回
100
的以10
为底的对数2.0
。
3.12 pi()
- 返回圆周率 π
RETURN pi() AS result
- 返回
3.141592653589793
。
3.13 cos()
、sin()
和 tan()
- 三角函数
RETURN cos(pi()/3) AS result
- 计算
π/3
的余弦值,结果为0.5
。
RETURN sin(pi()/2) AS result
- 计算
π/2
的正弦值,结果为1.0
。
RETURN tan(pi()/4) AS result
- 计算
π/4
的正切值,结果为1.0
。
3.14 acos()
、asin()
和 atan()
- 反三角函数
RETURN acos(0.5) AS result
- 计算
0.5
的反余弦值,结果为1.047
。
RETURN asin(1) AS result
- 计算
1
的反正弦值,结果为1.5708
。
RETURN atan(1) AS result
- 计算
1
的反正切值,结果为0.785
。
3.15 atan2()
- 计算 y/x 的反正切
RETURN atan2(1, 1) AS result
- 返回
1/1
的反正切值,结果为0.785
(π/4
)。
3.16 haversin()
- 计算半正矢(Haversine)距离
RETURN haversin(1) AS result
- 计算
1
的半正矢,结果为0.2298
。
四、数学函数结合 MATCH
和 WITH
的高级用法
4.1 计算订单的折扣金额
MATCH (o:Order)
RETURN o.id, round(o.totalAmount * 0.1) AS discountAmount
- 计算
Order
的折扣金额,并进行四舍五入。
4.2 计算点与原点的距离
MATCH (p:Point)
RETURN p.id,
sqrt(p.x * p.x + p.y * p.y) AS distance
- 计算
Point
节点的欧几里得距离。
4.3 生成随机幸运数
MATCH (n:Person)
RETURN n.name, ceil(rand() * 100) AS luckyNumber
- 为每个
Person
生成一个1-100
之间的随机幸运数。
4.4 通过 atan2()
计算角度
MATCH (p:Point)
RETURN p.id, atan2(p.y, p.x) AS angle
- 计算点
(x, y)
的角度(弧度)。
4.5 使用 haversin()
计算地理距离
WITH 6371 AS earthRadius, 0.5 AS delta
RETURN 2 * earthRadius * haversin(delta) AS distance
- 使用
haversin()
计算大圆距离。
五、数学函数的注意事项
5.1 sqrt()
、log()
等函数不支持负数
RETURN sqrt(-9)
- 错误:
sqrt()
不支持负数输入,应确保数据非负。
5.2 acos()
和 asin()
的输入必须在 -1
到 1
之间
RETURN acos(2)
- 错误:
acos()
和asin()
只能接受-1
到1
之间的数值。
5.3 log()
的参数必须为正数
RETURN log(-5)
- 错误:
log()
只接受正数作为参数。
5.4 rand()
生成的随机数是浮点型
RETURN rand()
- 生成
0
到1
之间的浮点数,如果需要整数,需要进行ceil()
或floor()
处理。
六、WITH
结合数学函数的高级用法
6.1 结合 WITH
进行中间计算
MATCH (n:Product)
WITH n, round(n.price * 1.1) AS newPrice
RETURN n.name, newPrice
- 计算
Product
价格的10%
增长,并进行四舍五入。
6.2 生成 1-100 的随机整数
WITH ceil(rand() * 100) AS randomInt
RETURN randomInt
- 生成
1
到100
之间的随机整数。
6.3 计算路径上的距离
MATCH (a:Location)-[r:CONNECTED_TO]->(b:Location)
WITH r.distance AS d
RETURN a.name, b.name, sqrt(d * d) AS distance
- 计算路径的距离。
6.4 使用 WITH
计算复合公式
WITH 5 AS x
RETURN x * x + 2 * x + 1 AS formulaResult
- 计算复合公式
x^2 + 2x + 1
的结果。
七、总结
- Cypher 提供了丰富的数学函数,包括基础算术函数、对数函数、三角函数和随机数生成。
- 这些函数可与
MATCH
、WITH
和RETURN
语句结合使用,用于计算、数据处理和路径分析。 - 使用
abs()
、sqrt()
、ceil()
、floor()
和round()
等函数,可以对数值进行基本的转换和处理。 - 三角函数如
cos()
、sin()
和tan()
适用于角度计算,而haversin()
则常用于地理距离计算。
熟练掌握这些数学函数,可以大大提升 Neo4j 图数据库中数据分析和计算的能力。