如何将节点属性设置为递增数字,但在不同 属性 的值更改时重置增量?

How to set node properties as incrementing numbers, but resetting the increment when the value of a different property changes?

根据的回答,我可以将节点属性设置为递增的数字:

MATCH (n) where n.gid="A" 
WITH collect(n) as nodes
WITH apoc.coll.zip(nodes, range(0, size(nodes))) as pairs
UNWIND pairs as pair 
SET (pair[0]).id = pair[1]
return pair[0].gid, pair[0].id
╒═════════════╤════════════╕
│"pair[0].gid"│"pair[0].id"│
╞═════════════╪════════════╡
│"A"          │0           │
├─────────────┼────────────┤
│"A"          │1           │
├─────────────┼────────────┤
│"A"          │2           │
├─────────────┼────────────┤
│"A"          │3           │
├─────────────┼────────────┤
│"A"          │4           │
├─────────────┼────────────┤

但是因为我有一个 gid 的列表:["A", "B", "C", "D", ...],我想 运行 遍历所有节点,每次 gid 值改变递增数字重置。所以结果将是:

╒═════════════╤════════════╕
│"pair[0].gid"│"pair[0].id"│
╞═════════════╪════════════╡
│"A"          │0           │
├─────────────┼────────────┤
│"A"          │1           │
├─────────────┼────────────┤
│"A"          │2           │
├─────────────┼────────────┤
│...          │...         │
├─────────────┼────────────┤
│"A"          │15          │
├─────────────┼────────────┤
│"B"          │1           │
├─────────────┼────────────┤
│"B"          │2           │ 

我用

MATCH (p) with collect(DISTINCT p.gid) as gids
UNWIND gids as gid
MATCH (n) where n.gid=gid
WITH collect(n) as nodes
WITH apoc.coll.zip(nodes, range(0, size(nodes))) as pairs
UNWIND pairs as pair 
SET (pair[0]).id = pair[1]
return pair[0].name, pair[0].id

并且它不会重置号码,即

╒═════════════╤════════════╕
│"pair[0].gid"│"pair[0].id"│
╞═════════════╪════════════╡
│"A"          │0           │
├─────────────┼────────────┤
│"A"          │1           │
├─────────────┼────────────┤
│"A"          │2           │
├─────────────┼────────────┤
│...          │...         │
├─────────────┼────────────┤
│"A"          │15          │
├─────────────┼────────────┤
│"B"          │16          │
├─────────────┼────────────┤
│"B"          │17          │ 

这是为什么?

“为什么会这样?”问题的答案是你的密码只产生一个列表。

我认为当您通过在第 4 行添加 n.gid 来拆分列表时

MATCH (p) with collect(DISTINCT p.gid) as gids
UNWIND gids as gid
MATCH (n) where n.gid=gid

// <<< do a "group by"
WITH n.gid AS gid, 
     collect(n) as nodes    // <<< do a "group by"

WITH apoc.coll.zip(nodes, range(0, size(nodes))) as pairs
UNWIND pairs as pair 
SET (pair[0]).id = pair[1]
return pair[0].name, pair[0].id

它可以工作。