Проблема в том, что вы сравниваете даты, сохраненные в текстовом формате, и получаете неправильный результат:
RETURN "15/08/2017" < "9/02/2017" // => true
Таким образом, ваш первый запрос также дает неверный результат.И вам нужно конвертировать date
поле из текстового формата в datetime .Например:
MATCH (L:Location)
MATCH p1 = (C1:Crime {type: 'Bicycle theft'})-[:OCCURRED_AT]->(L)
MATCH p2 = (C2:Crime {type: 'Burglary'})-[:OCCURRED_AT]->(L)
MATCH p3 = (C3:Crime {type: 'Drugs'})-[:OCCURRED_AT]->(L)
WITH p1, p2, p3, C1, C2, C3,
split(C1.date, '/') as tmp1,
split(C2.date, '/') as tmp2,
split(C3.date, '/') as tmp3
WITH p1, p2, p3, C1, C2, C3,
datetime(tmp1[2] + '-' + tmp1[1] + '-' + tmp1[0]) as dt1,
datetime(tmp2[2] + '-' + tmp2[1] + '-' + tmp2[0]) as dt2,
datetime(tmp3[2] + '-' + tmp3[1] + '-' + tmp3[0]) as dt3
WHERE dt1 < dt2 AND
dt1 > dt3
RETURN p1, p2, p3