Search code examples
propertiescypherincrement

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


From the answer of How to set node properties as incrementing numbers?, I can set node properties as increasing numbers:

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           │
├─────────────┼────────────┤

But since I have a list of gid: ["A", "B", "C", "D", ...], and I want to run through all the nodes, and each time the gid value changes the incrementing numbers reset. So the result would be:

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

I use

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

and it doesn't reset the number, i.e.

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

Why is that?


Solution

  • The answer to the question "Why is that?" is that your cypher only results in a single list.

    I think that when you split the lists by adding a n.gid on line 4

    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
    

    it could work.