繁体   English   中英

Neo4j 密码查询 ORDER BY 带参数

[英]Neo4j cypher query ORDER BY with parameters

我有一个简单的密码查询,想用参数修改它。

MATCH (u:User) WHERE u.email = {searchString} return u ORDER BY {sortField} {sortOrder} SKIP {skipNumber} LIMIT {limitNumber}

执行此查询会导致以下错误:

Invalid input '{': expected whitespace, comment, '.', node labels, '[', "=~", IN, STARTS, ENDS, CONTAINS, IS, '^', '*', '/', '%', '+', '-', '=', "<>", "!=", '<', '>', "<=", ">=", AND, XOR, OR, DESCENDING, DESC, ASCENDING, ASC, ',', SKIP, LIMIT, LOAD CSV, START, MATCH, UNWIND, MERGE, CREATE, SET, DELETE, REMOVE, FOREACH, WITH, CALL, RETURN, UNION, ';' or end of input (line 1, column 87 (offset: 86)) "MATCH (lc:LeadContact) WHERE lc.email = {searchString} return lc ORDER BY {sortField} {sortOrder} SKIP {skipNumber} LIMIT {limitNumber}"

如果我删除“{sortField} {sortOrder}”并写入静态文本(例如,“ORDER by u.name ASC”),查询将顺利执行:

MATCH (u:User) WHERE u.email = {searchString} return u ORDER BY u.name ASC SKIP {skipNumber} LIMIT {limitNumber}

为什么这里密码不允许参数? 还是我做错了什么?

不同的ORDER BY或方向可能需要不同的查询计划。 目前,您只能参数化对查询计划没有影响的内容。 由于同样的原因,标签和关系类型不可参数化。

事情是可以做的是ORDER BY field[$parameter]使用动态属性,如看到对类似的问题的答复。

现在,假设您有一个更复杂的查询,有两个 MATCH 语句:如果您还需要更改排序字段,您可以编写如下内容:

MATCH (u:User)
MATCH (v:Vehicle)
WHERE u.email = {searchString}

WITH coalesce(
  CASE WHEN {sortField} = "u.name" THEN u.name ELSE null END,
  CASE WHEN {sortField} = "v.brand" THEN v.brand ELSE null END,
  u.name // Provide a default sorting field
) AS orderField

RETURN u, v
ORDER BY orderField ASC SKIP {skipNumber} LIMIT {limitNumber}

至于排序顺序,你可以使用这个巧妙的小技巧:

ORDER BY
CASE WHEN {sortOrder} = "ASC" THEN orderField ELSE null END ASC,
CASE WHEN {sortOrder} = "ASC" THEN null ELSE orderField END DESC

当然,如果{sortOrder}是一个布尔值,比如{ascending} ,这种比较会更容易阅读。

您可以按照以下方式进行操作,利用您可以参数化回报的事实:

RETURN a,b,c,b[$sortField] AS sortField
ORDER BY sortField

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM