The Patrick Bösch answer works, but it is building a cartesian product between (p:Person)
and (m:Movie)
nodes.
The below query will do the same job, but avoiding cartesian products (and in a more clear way, I think):
MATCH (m:Movie)
WHERE NOT (m)<-[:ACTED_IN]-(:Person {name : 'Keanu Reeves'})
RETURN m
The query will MATCH
all movies avoiding ones that have a relation :ACTED_IN
with a :Person
node that name is equal to Keanu Reeves.
UPDATE
From comments:
What if it is not just Keanu Reeves but keanu Reeves AND Robin
Williams?
Then you can do:
MATCH (m:Movie)<-[:ACTED_IN]-(p:Person)
WITH m, collect(p) as actors
WHERE NONE (actor in actors WHERE actor.name IN ['Keanu Reeves', 'Robin Williams'])
RETURN m
Or:
MATCH (m:Movie)
WHERE NONE(n in ['Keanu Reeves', 'Robin Williams']
WHERE (m)<-[:ACTED_IN]-(:Person {name:n}))
RETURN m