字符串运算符
字符串运算符用于对 STRING
值执行操作。Cypher® 包含以下字符串运算符
-
前缀:
STARTS WITH
(区分大小写) -
后缀:
ENDS WITH
(区分大小写) -
子字符串:
CONTAINS
(区分大小写) -
正则表达式:
=~
-
IS NORMALIZED
在 5.17 中引入 -
IS NOT NORMALIZED
在 5.17 中引入
这些运算符执行区分大小写的匹配。尝试在非 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
名称 |
---|
|
|
|
行数:3 |
ENDS WITH
运算符MATCH (n:Person)
WHERE n.role ENDS WITH 'developer'
RETURN n.name AS name, n.role AS role
名称 | 角色 |
---|---|
|
|
|
|
行数:2 |
CONTAINS
运算符MATCH (n:Person)
WHERE n.role CONTAINS 'eng'
RETURN n.name AS name, n.role AS 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
名称 | 电子邮件 |
---|---|
|
|
|
|
|
|
行数:3 |
通过在正则表达式前添加标志 (?i)
,整个表达式将变为不区分大小写
(?i)
MATCH (n:Person)
WHERE n.name =~ '(?i)CEC.*'
RETURN n.name
Cecil
和 Cecilia
的名字都被返回,因为无论大小写,它们的名字都以 'CEC'
开头
名称 |
---|
|
|
行数:2 |
正则表达式中的转义
.
或 *
等字符在正则表达式中具有特殊含义。要将它们用作普通字符而不带特殊含义,请对其进行转义。
MATCH (n:Person)
WHERE n.email =~ '.*\\.se'
RETURN n.name AS name, n.email AS email
Cecil
被返回,因为他的电子邮件以 '.se'
结尾
名称 | 电子邮件 |
---|---|
|
|
行数:1 |
请注意,Java 正则表达式中的正则表达式构造仅在解析给定字符串字面量中的转义字符序列后才应用。有时需要添加额外的反斜杠来表达正则表达式构造。此列表阐明了这两个定义的组合,其中包含原始转义序列和正则表达式中生成的字符
字符串字面量序列 | 结果正则表达式序列 | 正则表达式匹配 |
---|---|---|
|
制表符 |
制表符 |
|
|
制表符 |
|
退格符 |
退格符 |
|
|
单词边界 |
|
换行符 |
换行符 |
|
|
换行符 |
|
回车符 |
回车符 |
|
|
回车符 |
|
换页符 |
换页符 |
|
|
换页符 |
|
单引号 |
单引号 |
|
双引号 |
双引号 |
|
反斜杠 |
反斜杠 |
|
|
反斜杠 |
|
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() 函数。
请注意,当在非 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
未规范化 |
---|
|
|
因为给定的 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 |
---|---|
|
|
|
在使用否定规范化运算符时,也可以指定规范化形式。例如,RETURN "string" IS NOT NFD NORMALIZED
。