字符串运算符

字符串运算符用于对 STRING(字符串)值执行操作。Cypher® 包含以下字符串运算符:

  • 前缀:STARTS WITH(区分大小写)

  • 后缀:ENDS WITH(区分大小写)

  • 子串:CONTAINS(区分大小写)

  • 正则表达式:=~

  • IS NORMALIZED(是否为规范化形式)

  • IS NOT NORMALIZED(是否不为规范化形式)

这些运算符执行区分大小写的匹配。尝试在非 STRING 类型的值上使用这些运算符将返回 null

示例图

以下图表用于下方的示例

predicate operators

要重建该图,请在空的 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'})

示例

示例 1. 前缀、后缀和子串运算符
STARTS WITH 运算符
MATCH (n:Person)
WHERE n.name STARTS WITH 'C'
RETURN n.name AS name
结果
名称 (name)

"Cecil"

"Cecilia"

"Charlie"

行:3

ENDS WITH 运算符
MATCH (n:Person)
WHERE n.role ENDS WITH 'developer'
RETURN n.name AS name, n.role AS role
结果
名称 (name) role(角色)

"Cecil"

"Software developer"

"Cecilia"

"Software developer"

行:2

CONTAINS 运算符
MATCH (n:Person)
WHERE n.role CONTAINS 'eng'
RETURN n.name AS name, n.role AS role
结果
名称 (name) role(角色)

"Charlie"

"Security engineer"

行:1

正则表达式

Cypher 支持使用正则表达式进行过滤。正则表达式语法继承自 Java 正则表达式。这包括对改变 STRING 值匹配方式的标志的支持,包括不区分大小写 (?i)、多行 (?m) 和单行模式 (?s) 标志。标志在正则表达式的开头给出。

示例 2. 正则表达式
正则表达式 (=~)
MATCH (n:Person)
WHERE n.email =~ '.*@company.com'
RETURN n.name AS name, n.email AS email
结果
名称 (name) 电子邮件

"Alice"

"alice@company.com"

"Daniel"

"daniel@company.com"

"Eskil"

"eskil@company.com"

行:3

通过在正则表达式前加上标志 (?i),整个表达式将变为不区分大小写

不区分大小写的正则表达式 (?i)
MATCH (n:Person)
WHERE n.name =~ '(?i)CEC.*'
RETURN n.name

返回了 CecilCecilia 两个名字,因为它们的名字都以 'CEC' 开头,且不区分大小写

结果
名称 (name)

"Cecil"

"Cecilia"

行:2

正则表达式中的转义

.* 这样的字符在正则表达式中具有特殊含义。要将它们作为普通字符使用而不赋予特殊含义,请对它们进行转义。

正则表达式中的转义字符
MATCH (n:Person)
WHERE n.email =~ '.*\\.se'
RETURN n.name AS name, n.email AS email

返回 Cecil 是因为他的电子邮件以 '.se' 结尾

结果
名称 (name) 电子邮件

"Cecil"

"cecil@private.se"

行:1

请注意,Java 正则表达式中的正则表达式构造仅在解析给定 字符串字面量 中的转义字符序列之后应用。有时需要添加额外的反斜杠来表达正则表达式构造。此列表澄清了这两种定义的组合,包含了原始转义序列和正则表达式中产生的字符:

字符串字面量序列 生成的正则序列 正则匹配

\t

制表符 (Tab)

制表符 (Tab)

\\t

\t

制表符 (Tab)

\b

退格符

退格符

\\b

\b

单词边界

\n

换行符

换行 (NewLine)

\\n

\n

换行符

\r

回车符

回车符

\\r

\r

回车符

\f

换页符

换页符

\\f

\f

换页符

\'

单引号

单引号

\"

双引号

双引号

\\

反斜杠

反斜杠

\\\

\\

反斜杠

\uxxxx

Unicode UTF-16 码点(\u 后必须跟 4 个十六进制数字)

Unicode UTF-16 码点(\u 后必须跟 4 个十六进制数字)

\\uxxxx

\uxxxx

Unicode UTF-16 码点(\u 后必须跟 4 个十六进制数字)

将正则表达式与未经清理的用户输入一起使用会使您容易受到 Cypher 注入攻击。请考虑改用 参数

字符串规范化运算符

IS NORMALIZED 运算符用于检查给定的 STRING 是否处于 NFC Unicode 规范化形式

Unicode 规范化是一个将同一字符串的不同表示形式转换为标准形式的过程。有关更多信息,请参阅 Unicode 规范化形式 的文档。

IS NORMALIZED 运算符
RETURN 'the \u212B char' IS NORMALIZED AS normalized
结果
已规范化

false

行:1

因为给定的 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
结果
未规范化

TRUE

行:1

因为给定的 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 已规范化

true

false

行:2

在使用否定规范化运算符时,也可以指定规范化形式。例如,RETURN "string" IS NOT NFD NORMALIZED