Well, it is a still a non-trivial question. Let's try restating the requirement in full:
For all directors that have directed a movie they haven't written, find directors they know that have directed movies (that they haven't written) where none of the writers of those movies have worked with the original director. Suggest those writers.
One interesting thing here...because of the patterns that we've been using, we've only been considering directors of movies with writers. There are actually quite a few other relevant results if we also consider movies that don't have writers, as this brings quite a few directors into consideration that were previously excluded.
So to amend my previous query, we can use an optional match to the writers of a movie and collect them:
MATCH (t:Person)-[:DIRECTED]->(m1:Movie)
WHERE NOT (t)-[:WROTE]->(m1)
OPTIONAL MATCH (m1)<-[:WROTE]-(w1)
WITH t, collect(DISTINCT m1) as directedMovies, collect(DISTINCT w1) as UsedWriters
MATCH (t)-[:HAS_CONTACT]->(t2)-[:DIRECTED]->(m2:Movie)<-[:WROTE]-(w2)
WHERE t <> w2 and NOT m2 in directedMovies and NOT w2 in UsedWriters and NOT (t2)-[:WROTE]->(m2)
WITH t, UsedWriters, collect(distinct w2.name) as SuggestedWriters
ORDER BY t.name DESC
RETURN t.name as director, [writer in UsedWriters | writer.name] as UsedWriters, SuggestedWriters
Now we can make this writer-centric and do away with the movie filtering if we want. The movie filtering was mostly there so we could rule out writers early. That is, if m2 is one of the movies in the collection of m1, we already know that the director has worked with all of the writers. That's an optimization thing.
So let's see that query without doing the filtering on movies:
MATCH (t:Person)-[:DIRECTED]->(m1:Movie)
WHERE NOT (t)-[:WROTE]->(m1)
OPTIONAL MATCH (m1)<-[:WROTE]-(w1)
WITH t, collect(DISTINCT w1) as UsedWriters
MATCH (t)-[:HAS_CONTACT]->(t2)-[:DIRECTED]->(m2:Movie)<-[:WROTE]-(w2)
WHERE t <> w2 and NOT w2 in UsedWriters and NOT (t2)-[:WROTE]->(m2)
WITH t, UsedWriters, collect(distinct w2.name) as SuggestedWriters
ORDER BY t.name DESC
RETURN t.name as director, [writer in UsedWriters | writer.name] as UsedWriters, SuggestedWriters
That might work a bit better as far as trimming down the complexity.
If you wanted the graphiest query, though, we could avoid the collection and list filtering, but we'd pay a cost with additional expansions per potentially suggested writer to see if they wrote for a movie directed by the original director. For such a small query though the performance difference should be negligible.
MATCH (t:Person)-[:DIRECTED]->(m1:Movie)
WHERE NOT (t)-[:WROTE]->(m1)
WITH DISTINCT t
MATCH (t)-[:HAS_CONTACT]->(t2)-[:DIRECTED]->(m2:Movie)<-[:WROTE]-(w2)
WHERE t <> w2 and NOT (t2)-[:WROTE]->(m2) and NOT (t)-[:DIRECTED]->()<-[:WROTE]-(w2)
WITH t, collect(distinct w2.name) as SuggestedWriters
ORDER BY t.name DESC
RETURN t.name as director, SuggestedWriters