根据 Neo4j 中所有节点中该属性的最大值设置属性值

问题描述

我想为每个不包含该属性的“Sc”节点设置“id”属性。每个属性的值应比所有“Sc”节点中该属性的实际最大值大 1。如何做到这一点?我想出了这个查询,但 SET 不允许使用 MAX。

MATCH p=(s:Sc)
WHERE NOT exists(s.id)
FOREACH(skl in nodes(p) | SET skl.id = MAX(toInteger(s.id))+1)

解决方法

  1. 收集所有没有id的sc
  2. 对于每个 sc,创建一个从 1..n 开始的数字序列
  3. 然后设置每个节点sc.id的值等于maxValue+行数
MATCH (sc:Sc) WHERE EXISTS(sc.id)
WITH max(sc.id) AS maxValue
MATCH (s:Sc) WHERE NOT EXISTS(s.id)
WITH maxValue,collect(s) as scs
UNWIND range(1,size(scs)) as row
SET (scs[row-1]).id = maxValue+row

Sample result:
╒═══════════════════╕
│"Sc"               │
╞═══════════════════╡
│{"id":1}           │
├───────────────────┤
│{"id":2}           │
├───────────────────┤
│{"name":"a","id":3}│
├───────────────────┤
│{"name":"b","id":4}│
├───────────────────┤
│{"name":"c","id":5}│
└───────────────────┘
,

这应该可以解决问题:

MATCH (s:Sc)
WHERE EXISTS(s.id)
WITH max(s.id) AS maxValue
MATCH (s:Sc)
WHERE NOT EXISTS(s.id)
SET s.id = maxValue + 1