Filtering & WHERE

Comparison Operators

MATCH (n:Person) WHERE n.age > 25 RETURN n
MATCH (n:Person) WHERE n.age >= 18 AND n.age <= 65 RETURN n
MATCH (n:Person) WHERE n.name <> "Bob" RETURN n

Boolean Logic

MATCH (n:Person)
WHERE n.age > 25 AND (n.city = "Sydney" OR n.city = "Melbourne")
RETURN n

MATCH (n:Person)
WHERE NOT n.retired
RETURN n

String Predicates

MATCH (n:Person) WHERE n.name STARTS WITH "Al" RETURN n
MATCH (n:Person) WHERE n.name ENDS WITH "ce" RETURN n
MATCH (n:Person) WHERE n.name CONTAINS "li" RETURN n
MATCH (n:Person) WHERE n.email =~ ".*@example\.com" RETURN n

NULL Checks

MATCH (n:Person) WHERE n.email IS NOT NULL RETURN n
MATCH (n:Person) WHERE n.phone IS NULL RETURN n

IN Operator

MATCH (n:Person)
WHERE n.city IN ["Sydney", "Melbourne", "Brisbane"]
RETURN n

Pattern Predicates

Use patterns directly in WHERE to filter based on the existence of relationships.

-- Nodes that know Alice
MATCH (n:Person)
WHERE (n)-[:FRIEND]->(:Person {name: "Alice"})
RETURN n.name

-- Nodes that do NOT know anyone named Charlie
MATCH (n:Person)
WHERE NOT (n)-[:FRIEND]->(:Person {name: "Charlie"})
RETURN n.name

List Predicates

PredicateDescriptionExample
all(x IN list WHERE expr)All elements satisfy conditionall(x IN n.scores WHERE x > 50)
any(x IN list WHERE expr)At least one satisfiesany(x IN n.tags WHERE x = 'urgent')
none(x IN list WHERE expr)No element satisfiesnone(x IN n.scores WHERE x < 0)
single(x IN list WHERE expr)Exactly one satisfiessingle(x IN n.tags WHERE x = 'primary')