语法-参数

Neo
Neo
2022-03-12 / 0 评论 / 56 阅读

本节内容源自Cypher官方手册V4.4版,笔者对其进行学习、翻译、记录。

简介

Cypher 支持带参数查询。参数化查询是一种查询,其中占位符用于参数,且在执行时提供参数值。这意味着开发人员不必求助于字符串构建来创建查询。此外,参数使 Cypher 更容易缓存执行计划,从而加快查询执行时间。

参数可用于:

  • 字面量和表达式

  • 节点和关系id

参数不能用于以下构造,因为它们构成了编译到查询计划中的查询结构的一部分:

  • 属性键;所以,MATCH (n) WHERE n.$param = 'something'无效

  • 关系类型

  • 标签

参数可以由字母和数字以及它们的任意组合组成,但不能以数字或货币符号开头。

运行查询时设置参数取决于客户端环境。例如:

  • 要在 Cypher Shell 中设置参数,请使用:param name => 'Joe'. 有关详细信息,请参阅操作手册 → Cypher Shell-Query 参数。

  • 对于 Neo4j 浏览器,使用与 Cypher Shell 相同的语法,:param name => 'Joe'.

  • 使用驱动程序时,语法取决于语言选择。请参阅Neo4j 驱动程序手册中的事务中的示例。

  • 如需通过 Neo4j HTTP API 使用,请参阅HTTP API 文档。

我们在下面提供了参数使用示例的完整列表。在这些示例中,参数以 JSON 格式给出;提交它们的确切方式取决于所使用的驱动程序。

旧的参数语法在 Neo4j 3.0 中已弃用,并在 Neo4j 4.0 中完全删除。使用它会导致语法错误。但是,如果您在查询前加上CYPHER 3.5. 有关详细信息,请参阅密码兼容性。

自动参数化

当查询不使用参数时,Cypher 无论如何都会尝试推断参数。查询中的每个字符都替换为一个参数。这增加了计算计划对除字符外相同的查询的可重用性。不建议依赖这种行为——用户应该在他们认为合适的地方使用参数。

如果查询中至少使用了一个参数,则该查询的自动参数化将关闭。这意味着任何剩余的字符都不会变成参数。

字符串

{
  "name" : "Johan"
}
MATCH (n:Person)
WHERE n.name = $name
RETURN n

或者

MATCH (n:Person {name: $name})
RETURN n

正则表达式

{
  "regex" : ".*h.*"
}
MATCH (n:Person)
WHERE n.name =~ $regex
RETURN n.name

区分大小写的字符串模式匹配

{
  "name" : "Michael"
}
MATCH (n:Person)
WHERE n.name STARTS WITH $name
RETURN n.name

创建具有属性的节点

{
  "props" : {
    "name" : "Andy",
    "position" : "Developer"
  }
}
CREATE ($props)

创建多个具有属性的节点

{
  "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

SKIP和LIMIT

{
  "s" : 1,
  "l" : 1
}
MATCH (n:Person)
RETURN n.name
SKIP $s
LIMIT $l

节点编号

{
  "id" : 0
}
MATCH (n)
WHERE id(n) = $id
RETURN n.name

多个节点id

{
  "ids" : [ 0, 1, 2 ]
}
MATCH (n)
WHERE id(n) IN $ids
RETURN n.name

12.调用程序

{
  "indexname" : "My index"
}
CALL db.resampleIndex($indexname)