Search code examples
neo4jcyphercounting

neo4j - Count the number of duplicates in result


Community,

I am new to neo4j and I'm trying to get a list of nodes (that has not a specific relation) and count node name duplicates.

Query:

MATCH (e:ExampleNode)
WHERE NOT exists((e)-[:EXAMPLE_REL]->())
RETURN e.name as name, count(e.name) as count

Result:

name count
name1 3
name23 1
name8 4

So far so good...

Beside the name of the node I also need some more values. This value makes each result unique and returns every node separately even (if the name is the same).

Query:

MATCH (e:ExampleNode)
WHERE NOT exists((e)-[:EXAMPLE_REL]->())
RETURN e.name as name, count(e.name) as count, e.property as someValue

Result:

name count someValue
name1 1 abc
name1 1 cba
name1 1 xyz
name23 1 abc
name8 1 123
name8 1 321
name8 1 987
name8 1 789
... ... ...

But...this is the result I would like to have:

name count someValue
name1 3 abc
name1 3 cba
name1 3 xyz
name23 1 abc
name8 4 123
name8 4 321
name8 4 987
name8 4 789
... ... ...

I would like to return every node that hasn't the specific relation and count all duplicates by the name.

So, is it possible to get the result I would like to have?


Solution

  • Yess it is possible. When calculating the count, collect the property values in a list using collect function and then use UNWIND on the previous list, to get distinct rows for each property. Like this:

    MATCH (e:ExampleNode) 
    WHERE NOT exists((e)-[:EXAMPLE_REL]->()) 
    WITH e.name as name, count(e.name) as count, collect(e.property) as properties 
    UNWIND properties as property 
    RETURN name, count, property