# Count type of nodes in a list

Hi,
I have list of nodes with the same label (e.g :Car), there is a property call "type" (e.g SUV, Coupe, Sedan.....) which is used to differenciate the nodes, Now I would like to get the number of different types inside the list (e,g 25 SUVs, 35 Coupes, 40 Sedans). How could I do that?

Thanks,
Oli

``````match (a:Car)
with distinct a.type as type, count(a) as cnt
return type, cnt order by cnt desc
``````

Thanks for your reply. I think the result is what I need. Just one thing is that all my nodes are in a list and I need to get the value based on the list, if you know how to do that?

oli

Please let me know what you mean by 'nodes are in a list'. I assume the node has property with list values. Post a sample of that property so that I can suggest an answer.

``````// suppost I randomly sample the car nodes
with collect(c) as car
// now I have a list called "cars"
// I wish to know the types and their corresponding amount within a list
with distinct a.type as type, count(a) as cnt
return type, cnt order by cnt desc
// The car structure is (c:car {carID, carType})
``````
``````Try this:
// suppost I randomly sample the car nodes
with collect(c) as car
// now I have a list called "cars"

UNWIND car as car1
WITH car1.type as type, count(distinct car1) as cnt
return type, cnt order by cnt desc
// The car structure is (c:car {carID, carType})
``````

I got this (the list contains 100 samples and 2 or 3 types)

Post your Cypher query that produced 100 samples and 2 or 3 types.

It works finally, mis-typed, my bad
By the way, I would like to ask that if it's possible for us to use uwind with case when to achieve this？

Send me the Cypher you used with CASE statement.

``````with collect(c) as car
unwind car as car1
case car1.type
when "SUC"
Then
// something like x = x + 1
when "Coupe"
Then
// y = y + 1
when "Sedan"
Then
// z = z + 1
end
// or maybe use foreach
foreach(ig in case when car1.type = "SUV") THEN [1] ELSE [] END |  x = x + 1)
foreach(ig in case when car1.type = "Coupe") THEN [1] ELSE [] END |  y = y + 1)
foreach(ig in case when car1.type = "Sedan") THEN [1] ELSE [] END |  z = z + 1)
``````

It would be better to count based on type, then sum over the counts:

``````...
with collect(c) as cars
UNWIND cars as car
WITH car.type as type, count(distinct car) as cnt
WITH CASE WHEN type = 'SUV' THEN cnt ELSE 0 END as suvs,
CASE WHEN type = 'Coupe' THEN cnt ELSE 0 END as coupes,
CASE WHEN type = 'Sedan' THEN cnt ELSE 0 END as sedans
RETURN sum(suvs) as suvs, sum(coupes) as coupes, sum(sedans) as sedans
``````