Cypher 中的字符串函数(String Functions)详解
一、什么是字符串函数?
字符串函数(String Functions)是 Cypher 提供的一组处理字符串数据的函数,可用于格式化、截取、替换、转换和拼接字符串。
- 字符串函数通常与
MATCH
、WITH
和RETURN
语句结合使用,可以在查询过程中操作字符串数据。 - 字符串函数对
String
类型的数据进行处理,也可以通过toString()
将其他类型数据转换为字符串。
二、Cypher 常见字符串函数列表
函数名称 | 描述 | 示例 |
---|---|---|
toString() | 将值转换为字符串 | toString(123) → "123" |
size() | 返回字符串的长度 | size('Neo4j') → 5 |
substring() | 从字符串中提取子字符串 | substring('Hello', 1, 3) → "ell" |
left() | 从左侧提取指定长度的子字符串 | left('Neo4j', 3) → "Neo" |
right() | 从右侧提取指定长度的子字符串 | right('Neo4j', 2) → "4j" |
replace() | 替换字符串中的子字符串 | replace('Hello World', 'World', 'Neo4j') → "Hello Neo4j" |
trim() | 去掉字符串两侧的空格 | trim(' Hello ') → "Hello" |
ltrim() | 去掉字符串左侧的空格 | ltrim(' Hello') → "Hello" |
rtrim() | 去掉字符串右侧的空格 | rtrim('Hello ') → "Hello" |
upper() | 将字符串转换为大写 | upper('neo4j') → "NEO4J" |
lower() | 将字符串转换为小写 | lower('NEO4J') → "neo4j" |
reverse() | 反转字符串 | reverse('Neo4j') → "j4eoN" |
split() | 将字符串拆分成列表 | split('a,b,c', ',') → ['a', 'b', 'c'] |
coalesce() | 返回第一个非 NULL 的字符串 | coalesce(NULL, 'Hello') → "Hello" |
concat() | 连接多个字符串 | concat('Neo', '4j') → "Neo4j" |
replace() | 替换字符串中的子字符串 | replace('Neo4j', '4j', 'graph') → "Neograph" |
toLower() | 将字符串转换为小写 | toLower('Neo4j') → "neo4j" |
toUpper() | 将字符串转换为大写 | toUpper('neo4j') → "NEO4J" |
apoc.text.join() | 将列表连接为字符串(APOC 扩展) | apoc.text.join(['a','b'], ',') → "a,b" |
三、Cypher 字符串函数详细解析
3.1 toString()
- 将值转换为字符串
RETURN toString(123) AS result
- 将整数
123
转换为字符串,返回"123"
。
MATCH (n:Person)
RETURN n.name, toString(n.age) AS ageString
- 将
Person
节点的age
属性转换为字符串ageString
。
3.2 size()
- 返回字符串的长度
RETURN size('Neo4j') AS result
- 返回字符串
"Neo4j"
的长度,结果为5
。
MATCH (n:Person)
RETURN n.name, size(n.name) AS nameLength
- 返回
Person
节点的name
属性长度。
3.3 substring()
- 截取字符串
RETURN substring('Hello World', 6, 5) AS result
- 从索引
6
开始,截取5
个字符,返回"World"
。
MATCH (n:Product)
RETURN n.name, substring(n.name, 0, 3) AS shortName
- 截取
Product
名称的前 3 个字符作为shortName
。
3.4 left()
- 从左侧截取字符串
RETURN left('Neo4j', 3) AS result
- 截取字符串
"Neo4j"
的前3
个字符,返回"Neo"
。
3.5 right()
- 从右侧截取字符串
RETURN right('Neo4j', 2) AS result
- 截取字符串
"Neo4j"
的最后2
个字符,返回"4j"
。
3.6 replace()
- 替换字符串中的子字符串
RETURN replace('Hello World', 'World', 'Neo4j') AS result
- 将
"Hello World"
中的World
替换为Neo4j
,返回"Hello Neo4j"
。
MATCH (n:Person)
RETURN n.name, replace(n.name, ' ', '-') AS formattedName
- 将
Person
的name
中的空格替换为-
。
3.7 trim()
、ltrim()
和 rtrim()
- 去除空格
RETURN trim(' Hello ') AS result
- 去掉字符串两侧的空格,返回
"Hello"
。
RETURN ltrim(' Hello') AS result
- 去掉字符串左侧的空格,返回
"Hello"
。
RETURN rtrim('Hello ') AS result
- 去掉字符串右侧的空格,返回
"Hello"
。
3.8 upper()
和 lower()
- 字符串大小写转换
RETURN upper('neo4j') AS result
- 将字符串
neo4j
转换为大写,返回"NEO4J"
。
RETURN lower('NEO4J') AS result
- 将字符串
NEO4J
转换为小写,返回"neo4j"
。
3.9 reverse()
- 反转字符串
RETURN reverse('Neo4j') AS result
- 反转字符串
Neo4j
,返回"j4eoN"
。
3.10 split()
- 将字符串拆分为列表
RETURN split('Alice,Bob,Charlie', ',') AS result
- 将字符串拆分为
['Alice', 'Bob', 'Charlie']
。
MATCH (n:Person)
RETURN n.name, split(n.name, ' ') AS nameParts
- 将
Person
的name
按空格拆分为nameParts
列表。
3.11 concat()
- 连接字符串
RETURN 'Hello' + ' ' + 'Neo4j' AS result
- 连接字符串,返回
"Hello Neo4j"
。
MATCH (n:Person)
RETURN concat(n.firstName, ' ', n.lastName) AS fullName
- 连接
firstName
和lastName
生成fullName
。
3.12 coalesce()
- 返回第一个非 NULL
的字符串
RETURN coalesce(NULL, 'Alice', 'Bob') AS result
- 返回
"Alice"
,因为它是第一个非NULL
的值。
四、字符串函数的高级用法
4.1 将 name
转换为大写并替换字符
MATCH (n:Person)
RETURN upper(replace(n.name, ' ', '-')) AS formattedName
- 将
name
转换为大写,并将空格替换为-
。
4.2 提取 email
的域名部分
MATCH (n:User)
RETURN substring(n.email, size(split(n.email, '@')[0]) + 1) AS domain
- 提取
email
中@
之后的部分作为域名。
4.3 使用 split()
和 head()
获取第一个名字
MATCH (n:Person)
RETURN head(split(n.name, ' ')) AS firstName
- 拆分
name
并返回第一个名字。
4.4 concat()
和 coalesce()
结合使用
MATCH (n:Person)
RETURN concat(coalesce(n.firstName, 'Anonymous'), ' ', coalesce(n.lastName, 'User')) AS fullName
- 如果
firstName
或lastName
为空,则使用默认值进行拼接。
4.5 反转 name
并去掉空格
MATCH (
n:Person)
RETURN trim(reverse(n.name)) AS reversedName
- 反转
name
并去掉空格。
五、字符串函数结合 MATCH
和 WITH
的高级用法
5.1 截取并格式化 title
MATCH (m:Movie)
WITH m.title AS title
RETURN upper(substring(title, 0, 3)) AS shortTitle
- 截取
title
的前3
个字符,并转换为大写。
5.2 计算 email
域名的长度
MATCH (n:User)
WITH n, split(n.email, '@')[1] AS domain
RETURN n.name, size(domain) AS domainLength
- 提取
email
的域名部分并计算长度。
5.3 格式化 name
并拼接字符串
MATCH (n:Person)
WITH n, upper(n.firstName) AS first, lower(n.lastName) AS last
RETURN concat(first, ' ', last) AS formattedName
- 将
firstName
转换为大写,将lastName
转换为小写,并拼接为formattedName
。
5.4 过滤包含特定字符串的数据
MATCH (n:Person)
WHERE n.name CONTAINS 'Neo'
RETURN n.name
- 过滤
name
中包含Neo
的Person
节点。
六、字符串函数的注意事项
6.1 substring()
超出索引会报错
RETURN substring('Hello', 10, 3)
- 如果索引超出字符串范围,会报错。
6.2 split()
结果为空时返回空列表
RETURN split('', ',') AS result
- 空字符串会返回空列表
[]
。
6.3 toString()
处理 NULL
值
RETURN toString(NULL) AS result
toString()
会将NULL
转换为NULL
。
6.4 replace()
不改变原始字符串
WITH 'Hello World' AS text
RETURN replace(text, 'World', 'Neo4j'), text
replace()
返回新字符串,不改变text
的值。
七、UNWIND
和 LIST
结合字符串函数
7.1 拆分 name
并 UNWIND
处理
WITH 'Alice Bob Charlie' AS names
UNWIND split(names, ' ') AS name
RETURN name
split()
拆分names
并用UNWIND
逐行返回。
7.2 将 email
域名拆分并过滤
MATCH (n:User)
WITH split(n.email, '@')[1] AS domain
WHERE domain CONTAINS 'gmail'
RETURN n.name, domain
- 拆分
email
并过滤包含gmail
的域名。
7.3 使用 collect()
重新拼接字符串
WITH ['Alice', 'Bob', 'Charlie'] AS names
RETURN reduce(output = '', name IN names | output + name + ', ') AS result
- 使用
reduce()
将names
列表拼接为字符串Alice, Bob, Charlie,
。
八、总结
- Cypher 提供了丰富的字符串函数,用于格式化、转换、拆分、替换和拼接字符串。
- 常用函数包括
toString()
、size()
、substring()
、replace()
、upper()
、lower()
、split()
和concat()
。 - 这些函数可以与
MATCH
、WITH
和RETURN
结合使用,实现复杂的字符串操作。 split()
和UNWIND
结合使用可以处理批量数据,而coalesce()
可防止NULL
引起的错误。
熟练掌握这些字符串函数,可以帮助你在 Neo4j 中更高效地处理和转换字符串数据。