Skip to content

Instantly share code, notes, and snippets.

@luanne
Last active January 8, 2016 11:29
Show Gist options
  • Save luanne/8159102 to your computer and use it in GitHub Desktop.
Save luanne/8159102 to your computer and use it in GitHub Desktop.
Bombay Trains graph gist

Bombay Railway Routes

Most people from Bombay have a love-hate relation with trains. While they are still the quickest way to get to almost any place, getting into a train is an entirely different matter. We have beautiful structures such as CST (formerly Victoria Terminus):

cst

and then horrors such as these:

western

Still, our train system deserves a graph.

How to get from one station to another is easy to answer after this network is modeled as a graph.

train

The graph in this example contains stations on the Western line (pink) from Churchgate to Vasai, Harbour line (green) from Andheri to Wadala and CST to Vashi and a few stations on Central(orange).

Domain

We have four main railway lines- Western, Central, Harbour and Trans Harbour. Each line serves various sections of the city. There are also two minor lines- Vasai Road-Diva and Nerul-Uran line. To travel across sections, one must change lines at various interchange stations (many lines converge here). A couple of lines notably Western and Central operate fast trains that do not stop at every station.

bombay railway

Entities

Station with attribute name

Relationships

Each station is connected to one or more stations by fast or slow trains (property on the relation), and a railway line (property on the relation). Direction does not matter in this case.

Setup

CREATE (churchgate { name: "Churchgate" })
CREATE (marine { name: "Marine Lines" })
CREATE (charni { name: "Charni Road" })
CREATE (grant { name: "Grant Road" })
CREATE (bombaycentral { name: "Bombay Central" })
CREATE (mahalaxmi { name: "Mahalaxmi" })
CREATE (lowerparel { name: "Lower Parel" })
CREATE (elphinstone { name: "Elphinstone" })
CREATE (dadar { name: "Dadar" })
CREATE (matunga { name: "Matunga" })
CREATE (sion { name: "Sion" })
CREATE (kurla { name: "Kurla" })
CREATE (tilaknagar { name: "Tilak Nagar" })
CREATE (chembur { name: "Chembur" })
CREATE (govandi { name: "Govandi" })
CREATE (mankhurd { name: "Mankhurd" })
CREATE (matungaroad { name: "Matunga Road" })
CREATE (mahim { name: "Mahim" })
CREATE (bandra { name: "Bandra" })
CREATE (khar { name: "Khar" })
CREATE (santacruz { name: "Santa Cruz" })
CREATE (vileparle { name: "Vile Parle" })
CREATE (andheri { name: "Andheri" })
CREATE (jogeshwari { name: "Jogeshwari" })
CREATE (goregaon { name: "Goregaon" })
CREATE (malad { name: "Malad" })
CREATE (kandivali { name: "Kandivali" })
CREATE (borivali { name: "Borivali" })
CREATE (dahisar { name: "Dahisar" })
CREATE (miraroad { name: "Mira Road" })
CREATE (bhayandar { name: "Bhayandar" })
CREATE (naigaon { name: "Naigaon" })
CREATE (cst { name: "CST" })
CREATE (masjid { name: "Masjid" })
CREATE (sandhurst { name: "Sandhurst" })
CREATE (dockyard { name: "Dockyard Road" })
CREATE (reay { name: "Reay Road" })
CREATE (cottongreen { name: "Cotton Green" })
CREATE (sewri { name: "Sewri" })
CREATE (wadala { name: "Wadala" })
CREATE (gtb { name: "GTB Nagar" })
CREATE (chunabhatti { name: "Chunabhatti" })
CREATE (kingscircle { name: "Kings Circle" })
CREATE (vasai { name: "Vasai" })
CREATE (vashi { name: "Vashi" })

CREATE (churchgate)-[:NEXT {line:"Western",type:"Slow"}]->(marine)-[:NEXT {line:"Western",type:"Slow"}]->(charni)-[:NEXT {line:"Western",type:"Slow"}]->(grant)-[:NEXT {line:"Western",type:"Slow"}]->(bombaycentral)-[:NEXT {line:"Western",type:"Slow"}]->(mahalaxmi)-[:NEXT {line:"Western",type:"Slow"}]->(lowerparel)-[:NEXT {line:"Western",type:"Slow"}]->(elphinstone)-[:NEXT {line:"Western",type:"Slow"}]->(dadar)-[:NEXT {line:"Western",type:"Slow"}]->(matungaroad)-[:NEXT {line:"Western",type:"Slow"}]->(mahim)-[:NEXT {line:"Western",type:"Slow"}]->(bandra)-[:NEXT {line:"Western",type:"Slow"}]->(khar)-[:NEXT {line:"Western",type:"Slow"}]->(santacruz)-[:NEXT {line:"Western",type:"Slow"}]->(vileparle)-[:NEXT {line:"Western",type:"Slow"}]->(andheri)-[:NEXT {line:"Western",type:"Slow"}]->(jogeshwari)-[:NEXT {line:"Western",type:"Slow"}]->(goregaon)-[:NEXT {line:"Western",type:"Slow"}]->(malad)-[:NEXT {line:"Western",type:"Slow"}]->(kandivali)-[:NEXT {line:"Western",type:"Slow"}]->(borivali)-[:NEXT {line:"Western",type:"Slow"}]->(dahisar)-[:NEXT {line:"Western",type:"Slow"}]->(miraroad)-[:NEXT {line:"Western",type:"Slow"}]->(bhayandar)-[:NEXT {line:"Western",type:"Slow"}]->(naigaon)-[:NEXT {line:"Western",type:"Slow"}]->(vasai)

CREATE (churchgate)-[:NEXT {line:"Western",type:"Fast"}]->(marine)-[:NEXT {line:"Western",type:"Fast"}]->(charni)-[:NEXT {line:"Western",type:"Fast"}]->(grant)-[:NEXT {line:"Western",type:"Fast"}]->(bombaycentral)-[:NEXT {line:"Western",type:"Fast"}]->(dadar)-[:NEXT {line:"Western",type:"Fast"}]->(bandra)-[:NEXT {line:"Western",type:"Fast"}]->(andheri)-[:NEXT {line:"Western",type:"Fast"}]->(borivali)

CREATE (cst)-[:NEXT {line:"Harbour",type:"Slow"}]->(masjid)-[:NEXT {line:"Harbour",type:"Slow"}]->(sandhurst)-[:NEXT {line:"Harbour",type:"Slow"}]->(dockyard)-[:NEXT {line:"Harbour",type:"Slow"}]->(reay)-[:NEXT {line:"Harbour",type:"Slow"}]->(cottongreen)-[:NEXT {line:"Harbour",type:"Slow"}]->(sewri)-[:NEXT {line:"Harbour",type:"Slow"}]->(wadala)-[:NEXT {line:"Harbour",type:"Slow"}]->(kingscircle)-[:NEXT {line:"Harbour",type:"Slow"}]->(mahim)-[:NEXT {line:"Harbour",type:"Slow"}]->(bandra)-[:NEXT {line:"Harbour",type:"Slow"}]->(khar)-[:NEXT {line:"Harbour",type:"Slow"}]->(santacruz)-[:NEXT {line:"Harbour",type:"Slow"}]->(vileparle)-[:NEXT {line:"Harbour",type:"Slow"}]->(andheri)

CREATE (wadala)-[:NEXT {line:"Harbour",type:"Slow"}]->(gtb)-[:NEXT {line:"Harbour",type:"Slow"}]->(chunabhatti)-[:NEXT {line:"Harbour",type:"Slow"}]->(kurla)-[:NEXT {line:"Harbour",type:"Slow"}]->(tilaknagar)-[:NEXT {line:"Harbour",type:"Slow"}]->(chembur)-[:NEXT {line:"Harbour",type:"Slow"}]->(govandi)-[:NEXT {line:"Harbour",type:"Slow"}]->(mankhurd)-[:NEXT {line:"Harbour",type:"Slow"}]->(vashi)

CREATE (dadar)-[:NEXT {line:"Central",type:"Slow"}]->(matunga)-[:NEXT {line:"Central",type:"Slow"}]->(sion)-[:NEXT {line:"Central",type:"Slow"}]->(kurla)

The graph

match n return n

Queries:

Route from Churchgate to Vashi

The shortest path is a fast train on the Western line up to Dadar, and then one switches over to Central line taking a slow up to Kurla, followed by a slow on Harbour line to Vashi.

churchgate vashi
match (churchgate {name:"Churchgate"}),(vashi {name:"Vashi"}),p=shortestPath((churchgate)-[:NEXT*]->(vashi)) return p

Route from Santa Cruz to Dockyard Road

A slow train from Santa Cruz right up to Dockyard Road on the Harbour line is the shortest path.

santacruz dockyard
match (santacruz {name:"Santa Cruz"}),(dockyard {name:"Dockyard Road"}),p=shortestPath((santacruz)-[:NEXT*]-(dockyard)) return p

Route from Elphinstone to Andheri

From Elphinstone, take a slow train to Dadar on the Western line, then switch over to a fast train on the same line up to Andheri.

elphin andheri fast
match (elphinstone {name:"Elphinstone"}),(andheri {name:"Andheri"}),p=shortestPath((elphinstone)-[:NEXT*]-(andheri)) return p

Route from Elphinstone to Andheri without having to change trains

The query above might be the shortest path, but it involves changing trains, wherein you might face this:

CST station

To stay on the same train (without switching lines or train types), the query below correctly advises that one must pick a slow train on Western line from Elphinstone all the to Andheri.

match (elphinstone {name:"Elphinstone"}),(andheri {name:"Andheri"})
with elphinstone, andheri
match p=(elphinstone)-[r:NEXT*..10]-(andheri)
with head(r).type as trainType, head(r).line as railwayLine, p,r
where all(x in r where x.type=trainType) and
all(y in r where y.line=railwayLine)
return p;

Created by Luanne Misquitta:

@mantri-govind
Copy link

If I store all the trains as a relation in between stations i.e. Between Elphinstone to Andheri my structure goes like this
Elphistone-[next,train_123,train_234]->Dadar-[next,train_123,train_234]->Bandra-[next,train_123,train_456]->Andheri
Now my query should return me
relations : train_123,train_123,train_123,train_234,train_234,train_456
nodes: Elphistone,Dadar,Bandra,Andheri
Is there any way to do so?
Thanks,

@allaoui-chaker
Copy link

Thank you for agreeing to add the rest of stations and relations.

CREATE (churchgate { name: "Churchgate" })
CREATE (marine { name: "Marine Lines" })
CREATE (charni { name: "Charni Road" })
CREATE (grant { name: "Grant Road" })
CREATE (bombaycentral { name: "Bombay Central" })
CREATE (mahalaxmi { name: "Mahalaxmi" })
CREATE (lowerparel { name: "Lower Parel" })
CREATE (elphinstone { name: "Elphinstone" })
CREATE (dadar { name: "Dadar" })
CREATE (matunga { name: "Matunga" })
CREATE (sion { name: "Sion" })
CREATE (kurla { name: "Kurla" })
CREATE (tilaknagar { name: "Tilak Nagar" })
CREATE (chembur { name: "Chembur" })
CREATE (govandi { name: "Govandi" })
CREATE (mankhurd { name: "Mankhurd" })
CREATE (matungaroad { name: "Matunga Road" })
CREATE (mahim { name: "Mahim" })
CREATE (bandra { name: "Bandra" })
CREATE (khar { name: "Khar" })
CREATE (santacruz { name: "Santa Cruz" })
CREATE (vileparle { name: "Vile Parle" })
CREATE (andheri { name: "Andheri" })
CREATE (jogeshwari { name: "Jogeshwari" })
CREATE (goregaon { name: "Goregaon" })
CREATE (malad { name: "Malad" })
CREATE (kandivali { name: "Kandivali" })
CREATE (borivali { name: "Borivali" })
CREATE (dahisar { name: "Dahisar" })
CREATE (miraroad { name: "Mira Road" })
CREATE (bhayandar { name: "Bhayandar" })
CREATE (naigaon { name: "Naigaon" })
CREATE (cst { name: "CST" })
CREATE (masjid { name: "Masjid" })
CREATE (sandhurst { name: "Sandhurst" })
CREATE (dockyard { name: "Dockyard Road" })
CREATE (reay { name: "Reay Road" })
CREATE (cottongreen { name: "Cotton Green" })
CREATE (sewri { name: "Sewri" })
CREATE (wadala { name: "Wadala" })
CREATE (gtb { name: "GTB Nagar" })
CREATE (chunabhatti { name: "Chunabhatti" })
CREATE (kingscircle { name: "Kings Circle" })
CREATE (vasai { name: "Vasai" })
CREATE (vashi { name: "Vashi" })
CREATE (uran { name: "Uran" })
CREATE (dronagiri { name: "Dronagiri" })
CREATE (vashi { navha: "Navha Sheva" })
CREATE (jasai { name: "Jasai" })
CREATE (sagar { name: "Sagar Sangam" })

CREATE (churchgate)-[:NEXT {line:"Western",type:"Slow"}]->(marine)-[:NEXT {line:"Western",type:"Slow"}]->(charni)-[:NEXT {line:"Western",type:"Slow"}]->(grant)-[:NEXT {line:"Western",type:"Slow"}]->(bombaycentral)-[:NEXT {line:"Western",type:"Slow"}]->(mahalaxmi)-[:NEXT {line:"Western",type:"Slow"}]->(lowerparel)-[:NEXT {line:"Western",type:"Slow"}]->(elphinstone)-[:NEXT {line:"Western",type:"Slow"}]->(dadar)-[:NEXT {line:"Western",type:"Slow"}]->(matungaroad)-[:NEXT {line:"Western",type:"Slow"}]->(mahim)-[:NEXT {line:"Western",type:"Slow"}]->(bandra)-[:NEXT {line:"Western",type:"Slow"}]->(khar)-[:NEXT {line:"Western",type:"Slow"}]->(santacruz)-[:NEXT {line:"Western",type:"Slow"}]->(vileparle)-[:NEXT {line:"Western",type:"Slow"}]->(andheri)-[:NEXT {line:"Western",type:"Slow"}]->(jogeshwari)-[:NEXT {line:"Western",type:"Slow"}]->(goregaon)-[:NEXT {line:"Western",type:"Slow"}]->(malad)-[:NEXT {line:"Western",type:"Slow"}]->(kandivali)-[:NEXT {line:"Western",type:"Slow"}]->(borivali)-[:NEXT {line:"Western",type:"Slow"}]->(dahisar)-[:NEXT {line:"Western",type:"Slow"}]->(miraroad)-[:NEXT {line:"Western",type:"Slow"}]->(bhayandar)-[:NEXT {line:"Western",type:"Slow"}]->(naigaon)-[:NEXT {line:"Western",type:"Slow"}]->(vasai)

CREATE (churchgate)-[:NEXT {line:"Western",type:"Fast"}]->(marine)-[:NEXT {line:"Western",type:"Fast"}]->(charni)-[:NEXT {line:"Western",type:"Fast"}]->(grant)-[:NEXT {line:"Western",type:"Fast"}]->(bombaycentral)-[:NEXT {line:"Western",type:"Fast"}]->(dadar)-[:NEXT {line:"Western",type:"Fast"}]->(bandra)-[:NEXT {line:"Western",type:"Fast"}]->(andheri)-[:NEXT {line:"Western",type:"Fast"}]->(borivali)

CREATE (cst)-[:NEXT {line:"Harbour",type:"Slow"}]->(masjid)-[:NEXT {line:"Harbour",type:"Slow"}]->(sandhurst)-[:NEXT {line:"Harbour",type:"Slow"}]->(dockyard)-[:NEXT {line:"Harbour",type:"Slow"}]->(reay)-[:NEXT {line:"Harbour",type:"Slow"}]->(cottongreen)-[:NEXT {line:"Harbour",type:"Slow"}]->(sewri)-[:NEXT {line:"Harbour",type:"Slow"}]->(wadala)-[:NEXT {line:"Harbour",type:"Slow"}]->(kingscircle)-[:NEXT {line:"Harbour",type:"Slow"}]->(mahim)-[:NEXT {line:"Harbour",type:"Slow"}]->(bandra)-[:NEXT {line:"Harbour",type:"Slow"}]->(khar)-[:NEXT {line:"Harbour",type:"Slow"}]->(santacruz)-[:NEXT {line:"Harbour",type:"Slow"}]->(vileparle)-[:NEXT {line:"Harbour",type:"Slow"}]->(andheri)

CREATE (wadala)-[:NEXT {line:"Harbour",type:"Slow"}]->(gtb)-[:NEXT {line:"Harbour",type:"Slow"}]->(chunabhatti)-[:NEXT {line:"Harbour",type:"Slow"}]->(kurla)-[:NEXT {line:"Harbour",type:"Slow"}]->(tilaknagar)-[:NEXT {line:"Harbour",type:"Slow"}]->(chembur)-[:NEXT {line:"Harbour",type:"Slow"}]->(govandi)-[:NEXT {line:"Harbour",type:"Slow"}]->(mankhurd)-[:NEXT {line:"Harbour",type:"Slow"}]->(vashi)-[:NEXT {line:"Harbour",type:"Slow"}]->(sanapada)-[:NEXT {line:"Harbour",type:"Slow"}]->(juinagar)-[:NEXT {line:"Harbour",type:"Slow"}]->(nerul)-[:NEXT {line:"Harbour",type:"Slow"}]->(seawood)-[:NEXT {line:"Harbour",type:"Slow"}]->(belapur)-[:NEXT {line:"Harbour",type:"Slow"}]->(kharghar)-[:NEXT {line:"Harbour",type:"Slow"}]->(mansarovar)-[:NEXT {line:"Harbour",type:"Slow"}]->(khandeshwar)-[:NEXT {line:"Harbour",type:"Slow"}]->(pavel)

CREATE (dadar)-[:NEXT {line:"Central",type:"Slow"}]->(matunga)-[:NEXT {line:"Central",type:"Slow"}]->(sion)-[:NEXT {line:"Central",type:"Slow"}]->(kurla)-[:NEXT {line:"Central",type:"Slow"}]->(vidyavihar)-[:NEXT {line:"Central",type:"Slow"}]->(ghatkopar)-[:NEXT {line:"Central",type:"Slow"}]->(vikhorli)-[:NEXT {line:"Central",type:"Slow"}]->(kanjurmarg)-[:NEXT {line:"Central",type:"Slow"}]->(bhandup)-[:NEXT {line:"Central",type:"Slow"}]->(nahur)-[:NEXT {line:"Central",type:"Slow"}]->(mulund)-[:NEXT {line:"Central",type:"Slow"}]->(thane)-[:NEXT {line:"Central",type:"Slow"}]->(kalwa)-[:NEXT {line:"Central",type:"Slow"}]->(mumbra)-[:NEXT {line:"Central",type:"Slow"}]->(diva)-[:NEXT {line:"Central",type:"Slow"}]->(dombivli)-[:NEXT {line:"Central",type:"Slow"}]->(thakurli)-[:NEXT {line:"Central",type:"Slow"}]->(kalyan)-[:NEXT {line:"Central",type:"Slow"}]->(shahad)-[:NEXT {line:"Central",type:"Slow"}]->(ambivili)-[:NEXT {line:"Central",type:"Slow"}]->(titwala)-[:NEXT {line:"Central",type:"Slow"}]->(khadavali)-[:NEXT {line:"Central",type:"Slow"}]->(vashind)-[:NEXT {line:"Central",type:"Slow"}]->(asangaon)-[:NEXT {line:"Central",type:"Slow"}]->(atgaon)-[:NEXT {line:"Central",type:"Slow"}]->(khardi)-[:NEXT {line:"Central",type:"Slow"}]->(kisara)

CREATE (kalyan)-[:NEXT {line:"Central",type:"Slow"}]->(vithalwadi)-[:NEXT {line:"Central",type:"Slow"}]->(ulhasnagar)-[:NEXT {line:"Central",type:"Slow"}]->(ambernath)-[:NEXT {line:"Central",type:"Slow"}]->(badlapur)-[:NEXT {line:"Central",type:"Slow"}]->(vangani)-[:NEXT {line:"Central",type:"Slow"}]->(shelu)-[:NEXT {line:"Central",type:"Slow"}]->(neral)-[:NEXT {line:"Central",type:"Slow"}]->(bhivpuri)-[:NEXT {line:"Central",type:"Slow"}]->(karjat)-[:NEXT {line:"Central",type:"Slow"}]->(palasdari)-[:NEXT {line:"Central",type:"Slow"}]->(kelvavli)-[:NEXT {line:"Central",type:"Slow"}]->(dolavli)-[:NEXT {line:"Central",type:"Slow"}]->(lowjee)-[:NEXT {line:"Central",type:"Slow"}]->(khopoli)

CREATE (thane)-[:NEXT {line:"Trans Harbour",type:"Slow"}]->(airoli)-[:NEXT {line:"Trans Harbour",type:"Slow"}]->(rabale)-[:NEXT {line:"Trans Harbour",type:"Slow"}]->(ghansoli)-[:NEXT {line:"Trans Harbour",type:"Slow"}]->(kopar)-[:NEXT {line:"Trans Harbour",type:"Slow"}]->(turbhe)-[:NEXT {line:"Trans Harbour",type:"Slow"}]->(juinagar)-[:NEXT {line:"Trans Harbour",type:"Slow"}]->(nerul)

CREATE (turbhe)-[:NEXT {line:"Trans Harbour",type:"Slow"}]->(sanapada)-[:NEXT {line:"Trans Harbour",type:"Slow"}]->(vashi)

CREATE (vasai)-[:NEXT {line:"Vasai Road",type:"Slow"}]->(juchandra)-[:NEXT {line:"Harbour",type:"Slow"}]->(kaman)-[:NEXT {line:"Harbour",type:"Slow"}]->(kharbao)-[:NEXT {line:"Harbour",type:"Slow"}]->(bhiwandi)-[:NEXT {line:"Harbour",type:"Slow"}]->(dombivli)-[:NEXT {line:"Harbour",type:"Slow"}]->(diva)

CREATE (uran)-[:NEXT {line:"Nerul-Uran Line",type:"Slow"}]->(dronagiri)-[:NEXT {line:"Nerul-Uran Line",type:"Slow"}]->(navha)-[:NEXT {line:"Nerul-Uran Line",type:"Slow"}]->(jasai)-[:NEXT {line:"Nerul-Uran Line",type:"Slow"}]->(sagar)-[:NEXT {line:"Nerul-Uran Line",type:"Slow"}]->(belapur)

CREATE (sagar)-[:NEXT {line:"Nerul-Uran Line",type:"Slow"}]->(seawood)-[:NEXT {line:"Nerul-Uran Line",type:"Slow"}]->(nerul)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment