Агрегации (в одиночку, без каких-либо неагрегирующих переменных в качестве ключей группировки) будут успешными, даже если строк нет, и будет выдана одна строка с результатом, что позволит проводить дальнейшую обработку, поскольку есть строка для работы.
Чтобы получить желаемое поведение, добавьте фильтр после агрегирования, чтобы убедиться, что у вас есть непустой список. Это обеспечит, что если список пуст, строки переходят в 0 и последующие операции не будут выполняться:
MATCH (c1:Concept)
WHERE c1.name in (['word'])
WITH COLLECT(distinct c1) as concepts
WHERE size(concepts) <> 0
MATCH (ctx:Context)
WHERE ALL(c in concepts
WHERE (c)-->(ctx) AND ((ctx.by) = '15229100-b20e-11e3-80d3-6150cb20a1b9'))
RETURN ctx