Take a look at this Neo4j knowledge base article on performing match intersection.
The kind of queries you're looking for are going to be similar.
For example, using the first technique mentioned, we can do something like this:
MATCH (abc:Actor{name:'abc'})-[:ACTED_IN]->(m:Movie)
WITH abc, collect(distinct m) as movies
WITH abc, movies, size(movies) as movieCnt
UNWIND movies as m
MATCH (m)<-[:ACTED_IN]-(a:Actor)
WHERE abc <> a
WITH a, collect(distinct m) as commonMovies, movieCnt
WHERE size(commonMovies) = movieCnt
RETURN a
If you wanted to use the alternate approach with ALL(), it might look like this:
MATCH (abc:Actor{name:'abc'})-[:ACTED_IN]->(m:Movie)
WITH abc, collect(distinct m) as movies
WITH abc, movies, head(movies) as first
MATCH (first)<-[:ACTED_IN]-(a:Actor)
WHERE abc <> a AND ALL(m in movies WHERE (m)<-[:ACTED_IN]-(a))
RETURN a
We start the match from the first of the movies collection so we start from a relevant set of :Actors instead of having to filter starting from all :Actor nodes. That can be improved further if we sort the movies by the number of actors ascending first, since that will lead to the narrowest starting pool of coactors.