Hi,
1. you should use a label + index or constraint to find your starting node
2. I'd change it to use shortest path perhaps, at least rewrite it a bit
3. do you have only one relationship-type ?
// lookup via label + osm_id in index/constraint
MATCH (S:Waypoint) WHERE S.osm_id="1683208894"
MATCH path = (S)-[rels *0..75]->(E)
WHERE REDUCE(cost=0.0, r IN rels | cost + toFloat(r.minutes)) < 15
WITH E, REDUCE(cost=0.0, r IN rels | cost + toFloat(r.minutes)) as cost
RETURN cost, collect(distinct E) as isochrones
ORDER BY cost
I'm not sure if the cost expression is pulled into the expansion, please compare the query above with the one below
explain MATCH (S:Waypoint) WHERE S.osm_id="1683208894"
MATCH path = (S)-[rels *0..75]->(E)
WITH E, REDUCE(cost=0.0, r IN rels | cost + toFloat(r.minutes)) as cost
WHERE cost < 15
RETURN cost, collect(distinct E) as isochrones
ORDER BY cost
In reality you want to use an path expansion algorithm. If you use Neo4j 3.0.x you can check out the graph algorithms of the APOC library (like dikjstra, A*, allSimplePaths etc)
Or perhaps check out Neo4j Spatial which got an uplift for 3.0 as well, you could use a boundary-circle for a first estimate, e.g. 30km and then do the post-filtering with the actual cost
Craig can say more to that.