When I want to inquire about the names and number of actors who have appeared in two movies, I can write this way.
match (actor:Person) -[acted_in] ->(movie:Movie)
with actor,count(movie) as num_m
where num_m>2
return actor {.name,num_m}
But when I wanted to check out his films
match (actor:Person) -[acted_in] ->(movie:Movie)
with actor,count(movie) as num_m , movie
where num_m>2
return actor {.name,num_m},movie{.title}
But the result of my inquiry is incorrect. I don't know where I made a mistake, so I asked for help.
Thank you
The crucial thing to understand here is how aggregations work: If you have an aggregation function (e.g. count
) in a WITH
(or RETURN
) the base for the aggregation are all non-aggregated expression in that part - in your example actor, movie
. Therefore it's obvious that the count is always 1 since we don't have actor acting in the same movie twice.
To fix your statement I see to options:
MATCH (actor:Person)
WHERE size((actor)-[:ACTED_IN]->() ) > 1
MATCH (actor)-[:ACTED_IN]->(movie:Movie)
RETURN actor {.name,num_m},movie{.title}
or
MATCH (actor)-[:ACTED_IN]->(m:Movie)
WITH actor, count(movie) as c, collect(m) as movies
WHERE c>1
UNWIND movies as movie
RETURN actor {.name,num_m},movie{.title}
2 Likes
excellent!!that‘s right ,thank you very much