字符串运算符
字符串运算符用于对 STRING(字符串)值执行操作。Cypher® 包含以下字符串运算符:
-
前缀:
STARTS WITH(区分大小写) -
后缀:
ENDS WITH(区分大小写) -
子串:
CONTAINS(区分大小写) -
正则表达式:
=~ -
IS NORMALIZED(是否为规范化形式) -
IS NOT NORMALIZED(是否不为规范化形式)
这些运算符执行区分大小写的匹配。尝试在非 STRING 类型的值上使用这些运算符将返回 null。
示例图
以下图表用于下方的示例
要重建该图,请在空的 Neo4j 数据库中运行以下查询
CREATE (alice:Person {name:'Alice', age: 65, role: 'Project manager', email: 'alice@company.com'}),
(cecil:Person {name: 'Cecil', age: 25, role: 'Software developer', email: 'cecil@private.se'}),
(cecilia:Person {name: 'Cecilia', age: 31, role: 'Software developer'}),
(charlie:Person {name: 'Charlie', age: 61, role: 'Security engineer'}),
(daniel:Person {name: 'Daniel', age: 39, role: 'Director', email: 'daniel@company.com'}),
(eskil:Person {name: 'Eskil', age: 39, role: 'CEO', email: 'eskil@company.com'})
示例
STARTS WITH 运算符MATCH (n:Person)
WHERE n.name STARTS WITH 'C'
RETURN n.name AS name
| 名称 (name) |
|---|
|
|
|
行:3 |
ENDS WITH 运算符MATCH (n:Person)
WHERE n.role ENDS WITH 'developer'
RETURN n.name AS name, n.role AS role
| 名称 (name) | role(角色) |
|---|---|
|
|
|
|
行:2 |
|
CONTAINS 运算符MATCH (n:Person)
WHERE n.role CONTAINS 'eng'
RETURN n.name AS name, n.role AS role
| 名称 (name) | role(角色) |
|---|---|
|
|
行:1 |
|
正则表达式
Cypher 支持使用正则表达式进行过滤。正则表达式语法继承自 Java 正则表达式。这包括对改变 STRING 值匹配方式的标志的支持,包括不区分大小写 (?i)、多行 (?m) 和单行模式 (?s) 标志。标志在正则表达式的开头给出。
=~)MATCH (n:Person)
WHERE n.email =~ '.*@company.com'
RETURN n.name AS name, n.email AS email
| 名称 (name) | 电子邮件 |
|---|---|
|
|
|
|
|
|
行:3 |
|
通过在正则表达式前加上标志 (?i),整个表达式将变为不区分大小写
(?i)MATCH (n:Person)
WHERE n.name =~ '(?i)CEC.*'
RETURN n.name
返回了 Cecil 和 Cecilia 两个名字,因为它们的名字都以 'CEC' 开头,且不区分大小写
| 名称 (name) |
|---|
|
|
行:2 |
正则表达式中的转义
像 . 或 * 这样的字符在正则表达式中具有特殊含义。要将它们作为普通字符使用而不赋予特殊含义,请对它们进行转义。
MATCH (n:Person)
WHERE n.email =~ '.*\\.se'
RETURN n.name AS name, n.email AS email
返回 Cecil 是因为他的电子邮件以 '.se' 结尾
| 名称 (name) | 电子邮件 |
|---|---|
|
|
行:1 |
|
请注意,Java 正则表达式中的正则表达式构造仅在解析给定 字符串字面量 中的转义字符序列之后应用。有时需要添加额外的反斜杠来表达正则表达式构造。此列表澄清了这两种定义的组合,包含了原始转义序列和正则表达式中产生的字符:
| 字符串字面量序列 | 生成的正则序列 | 正则匹配 |
|---|---|---|
|
制表符 (Tab) |
制表符 (Tab) |
|
|
制表符 (Tab) |
|
退格符 |
退格符 |
|
|
单词边界 |
|
换行符 |
换行 (NewLine) |
|
|
换行符 |
|
回车符 |
回车符 |
|
|
回车符 |
|
换页符 |
换页符 |
|
|
换页符 |
|
单引号 |
单引号 |
|
双引号 |
双引号 |
|
反斜杠 |
反斜杠 |
|
|
反斜杠 |
|
Unicode UTF-16 码点( |
Unicode UTF-16 码点( |
|
|
Unicode UTF-16 码点( |
|
将正则表达式与未经清理的用户输入一起使用会使您容易受到 Cypher 注入攻击。请考虑改用 参数。 |
字符串规范化运算符
IS NORMALIZED 运算符用于检查给定的 STRING 是否处于 NFC Unicode 规范化形式
|
Unicode 规范化是一个将同一字符串的不同表示形式转换为标准形式的过程。有关更多信息,请参阅 Unicode 规范化形式 的文档。 |
IS NORMALIZED 运算符RETURN 'the \u212B char' IS NORMALIZED AS normalized
| 已规范化 |
|---|
|
|
因为给定的 STRING 包含一个非规范化的 Unicode 字符 (\u212B),所以返回 false。
要规范化 STRING,请使用 normalize() 函数。
请注意,IS NORMALIZED 运算符在非 STRING 类型的值上使用时会返回 null。例如,RETURN 1 IS NORMALIZED 返回 null。
IS NOT NORMALIZED 运算符用于检查给定的 STRING 是否不处于 NFC Unicode 规范化形式
IS NOT NORMALIZED(是否不为规范化形式)RETURN 'the \u212B char' IS NOT NORMALIZED AS notNormalized
| 未规范化 |
|---|
|
|
因为给定的 STRING 包含一个非规范化的 Unicode 字符 (\u212B) 且未被规范化,所以返回 true。
请注意,IS NOT NORMALIZED 运算符在非 STRING 类型的值上使用时会返回 null。例如,RETURN 1 IS NOT NORMALIZED 返回 null。
将 IS NORMALIZED 与指定的规范化类型配合使用
可以定义使用哪种 Unicode 规范化类型(默认为 NFC)。
可用的规范化类型有:
-
NFC -
NFD -
NFKC -
NFKD
WITH 'the \u00E4 char' as myString
RETURN myString IS NFC NORMALIZED AS nfcNormalized,
myString IS NFD NORMALIZED AS nfdNormalized
给定的 STRING 包含 Unicode 字符:\u00E4,它在 NFC 形式中被认为是规范化的,但在 NFD 形式中则不是。
| nfc 已规范化 | nfd 已规范化 |
|---|---|
|
|
|
|
在使用否定规范化运算符时,也可以指定规范化形式。例如,RETURN "string" IS NOT NFD NORMALIZED。