参数
本页面描述参数化查询。
简介
Cypher® 支持使用参数进行查询。参数化查询是指在查询中使用占位符代替参数,并在执行时提供参数值的查询。这意味着开发人员无需通过拼接字符串来创建查询。此外,参数使 Cypher 更容易缓存执行计划,从而缩短查询执行时间。
参数可用于:
-
字面量和表达式。
-
节点和关系 ID。
-
动态引用的属性(有关详细信息,请参阅
WHERE→ 过滤动态属性)。 -
动态引用的节点标签和关系类型(有关详细信息,请参阅
MATCH使用动态节点标签和关系类型)。
参数不能用于以下结构,因为它们构成了编译到查询计划中的查询结构的一部分:
-
属性键;
MATCH (n) WHERE n.$param = 'something'是无效的。 -
关系类型;
MATCH (n)-[:$param]→(m)是无效的。 -
节点标签;
MATCH (n:$param)是无效的。
参数名称可以以字母、数字、下划线以及组合标记(如重音符号,例如 é)开头并包含这些字符。货币符号(如 $ 和 €)、仅影响格式的不可打印 Unicode 控制字符(如用于制表符的 \t)、标点符号(如 !)以及空格在参数名称的任何位置均不被允许。例如,$héllo、$0param 和 $_param 是有效的,而 $€value、$hello! 和 $bad param 是无效的。
运行查询时设置参数的方式取决于客户端环境。例如:
-
要在 Cypher Shell 中设置参数,请使用
:param name => 'Joe'。有关详细信息,请参阅 操作手册 → Cypher Shell - 查询参数。 -
对于 Neo4j Browser,请使用与 Cypher Shell 相同的语法:
:param name => 'Joe'。 -
使用驱动程序时,语法取决于所选的编程语言。请参阅 Neo4j 驱动程序手册中关于事务的示例。
-
通过 Neo4j HTTP API 使用时,请参阅 HTTP API 文档。
我们在下方提供了全面的参数使用示例列表。在这些示例中,参数以 JSON 格式给出;具体的提交方式取决于所使用的驱动程序。
自动参数化
从 Neo4j 5 开始,即使查询仅进行了部分参数化,Cypher 也会尝试推断参数。查询中的每个字面量都会被替换为一个参数。这提高了除字面量外完全相同的查询的计划重用性。不建议依赖此行为——用户应在认为合适的地方自行使用参数。
字符串字面量
{
"name": "Johan"
}
MATCH (n:Person)
WHERE n.name = $name
RETURN n
您也可以在此语法中使用参数
{
"name": "Johan"
}
MATCH (n:Person {name: $name})
RETURN n
区分大小写的 STRING 模式匹配
{
"name": "Michael"
}
MATCH (n:Person)
WHERE n.name STARTS WITH $name
RETURN n.name
创建带有属性的多个节点
{
"props": [ {
"awesome": true,
"name": "Andy",
"position": "Developer"
}, {
"children": 3,
"name": "Michael",
"position": "Developer"
} ]
}
UNWIND $props AS properties
CREATE (n:Person)
SET n = properties
RETURN n
设置节点上的所有属性
请注意,这将替换当前所有的属性。
{
"props": {
"name": "Andy",
"position": "Developer"
}
}
MATCH (n:Person)
WHERE n.name = 'Michaela'
SET n = $props
节点 ID
{
"id" : "4:1fd57deb-355d-47bb-a80a-d39ac2d2bcdb:0"
}
MATCH (n)
WHERE elementId(n) = $id
RETURN n.name