字符串运算符

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

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

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

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

  • 正则表达式:=~

  • IS NORMALIZED 在 5.17 中引入

  • IS NOT NORMALIZED 在 5.17 中引入

这些运算符执行区分大小写的匹配。尝试在非 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
结果
名称

"Cecil"

"Cecilia"

"Charlie"

行数:3

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

"Cecil"

"软件开发人员"

"Cecilia"

"软件开发人员"

行数:2

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

"Charlie"

"安全工程师"

行数: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
结果
名称 电子邮件

"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' 开头

结果
名称

"Cecil"

"Cecilia"

行数:2

正则表达式中的转义

.* 等字符在正则表达式中具有特殊含义。要将它们用作普通字符而不带特殊含义,请对其进行转义。

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

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

结果
名称 电子邮件

"Cecil"

"cecil@private.se"

行数:1

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

字符串字面量序列 结果正则表达式序列 正则表达式匹配

\t

制表符

制表符

\\t

\t

制表符

\b

退格符

退格符

\\b

\b

单词边界

\n

换行符

换行符

\\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() 函数。

请注意,当在非 STRING 值上使用时,IS NORMALIZED 运算符返回 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

请注意,当在非 STRING 值上使用时,IS NOT NORMALIZED 运算符返回 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 形式下则不是。

结果
nfcNormalized nfdNormalized

true

false

行数:2

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

© . All rights reserved.