Skip to content

Instantly share code, notes, and snippets.

@thomasfr
Last active August 29, 2015 13:57
Show Gist options
  • Save thomasfr/9840876 to your computer and use it in GitHub Desktop.
Save thomasfr/9840876 to your computer and use it in GitHub Desktop.
A Neo4J GraphGist about an attempt to model Office Hours. I want to be abel to ask questions like: "What location has opened now or at a given date and time?" and "Has this location open now or at a given date and time?"

Opening / Office/ Business hours in Neo4J

CREATE (year2014:Year{value:2014}),
(year2014)-[:hasMonth]->(january:January:Month{name:"January",value:1}),
(year2014)-[:hasMonth]->(february:February:Month{name:"February",value:2}),
(year2014)-[:hasMonth]->(march:March:Month{name:"March",value:3}),
(year2014)-[:hasMonth]->(april:April:Month{name:"April",value:4}),
(year2014)-[:hasMonth]->(may:May:Month{name:"May",value:5}),
(year2014)-[:hasMonth]->(june:June:Month{name:"June",value:6}),
(year2014)-[:hasMonth]->(july:July:Month{name:"July",value:7}),
(year2014)-[:hasMonth]->(august:August:Month{name:"August",value:8}),
(year2014)-[:hasMonth]->(september:September:Month{name:"September",value:9}),
(year2014)-[:hasMonth]->(october:Oktober:Month{name:"October",value:10}),
(year2014)-[:hasMonth]->(november:November:Month{name:"November",value:11}),
(year2014)-[:hasMonth]->(december:December:Month{name:"December",value:12}),

(march)-[:hasDay]->(d1:Day{value:1}),
(march)-[:hasDay]->(d2:Day{value:2}),
(march)-[:hasDay]->(d3:Day{value:3}),
(march)-[:hasDay]->(d4:Day{value:4}),
(march)-[:hasDay]->(d5:Day{value:5}),
(march)-[:hasDay]->(d6:Day{value:6}),
(march)-[:hasDay]->(d7:Day{value:7}),
(march)-[:hasDay]->(d8:Day{value:8}),
(march)-[:hasDay]->(d9:Day{value:9}),
(march)-[:hasDay]->(d10:Day{value:10}),
(march)-[:hasDay]->(d11:Day{value:11}),
(march)-[:hasDay]->(d12:Day{value:12}),
(march)-[:hasDay]->(d13:Day{value:13}),
(march)-[:hasDay]->(d14:Day{value:14}),
(march)-[:hasDay]->(d15:Day{value:15}),
(march)-[:hasDay]->(d16:Day{value:16}),
(march)-[:hasDay]->(d17:Day{value:17}),
(march)-[:hasDay]->(d18:Day{value:18}),
(march)-[:hasDay]->(d19:Day{value:19}),
(march)-[:hasDay]->(d20:Day{value:20}),
(march)-[:hasDay]->(d21:Day{value:21}),
(march)-[:hasDay]->(d22:Day{value:22}),
(march)-[:hasDay]->(d23:Day{value:23}),
(march)-[:hasDay]->(d24:Day{value:24}),
(march)-[:hasDay]->(d25:Day{value:25}),
(march)-[:hasDay]->(d26:Day{value:26}),
(march)-[:hasDay]->(d27:Day{value:27}),
(march)-[:hasDay]->(d28:Day{value:28}),
(march)-[:hasDay]->(d29:Day{value:29}),
(march)-[:hasDay]->(d30:Day{value:30}),
(march)-[:hasDay]->(d31:Day{value:31}),

(d1)-[:isA]->(saturday:Saturday:DayName{name:"Saturday",value:6}),
(d2)-[:isA]->(sunday:Sunday:DayName{name:"Sunday",value:7}),

(d3)-[:isA]->(monday:Monday:DayName{name:"Monday",value:1}),
(d4)-[:isA]->(tuesday:Tuesday:DayName{name:"Tuesday",value:2}),
(d5)-[:isA]->(wednesday:Wednesday:DayName{name:"Wednesday",value:3}),
(d6)-[:isA]->(thursday:Thursday:DayName{name:"Thursday",value:4}),
(d7)-[:isA]->(friday:Friday:DayName{name:"Friday",value:5}),
(d8)-[:isA]->(saturday),
(d9)-[:isA]->(sunday),

(d10)-[:isA]->(monday),
(d11)-[:isA]->(tuesday),
(d12)-[:isA]->(wednesday),
(d13)-[:isA]->(thursday),
(d14)-[:isA]->(friday),
(d15)-[:isA]->(saturday),
(d16)-[:isA]->(sunday),

(d17)-[:isA]->(monday),
(d18)-[:isA]->(tuesday),
(d19)-[:isA]->(wednesday),
(d20)-[:isA]->(thursday),
(d21)-[:isA]->(friday),
(d22)-[:isA]->(saturday),
(d23)-[:isA]->(sunday),

(d24)-[:isA]->(monday),
(d25)-[:isA]->(tuesday),
(d26)-[:isA]->(wednesday),
(d27)-[:isA]->(thursday),
(d28)-[:isA]->(friday),
(d29)-[:isA]->(saturday),
(d30)-[:isA]->(sunday),

(d31)-[:isA]->(monday)

CREATE (locationA:Location{name:"Location A"}),

(locationA)-[:hasOpeningHours]->(ohA1:OpeningHours),
(ohA1)-[:hasInterval]->(:Interval{from:800,to:1200}),
(ohA1)-[:hasInterval]->(:Interval{from:1400,to:1900}),

(locationA)-[:hasOpeningHours]->(ohA2:OpeningHours),
(ohA2)-[:hasInterval]->(:Interval{from:800,to:1200}),
(ohA2)-[:hasInterval]->(:Interval{from:1400,to:1630}),

(ohA1)-[:hasValidity]->(january),
(ohA1)-[:hasValidity]->(february),
(ohA1)-[:hasValidity]->(march),
(ohA1)-[:hasValidity]->(april),
(ohA1)-[:hasValidity]->(may),
(ohA1)-[:hasValidity]->(june),
(ohA1)-[:hasValidity]->(august),
(ohA1)-[:hasValidity]->(september),
(ohA1)-[:hasValidity]->(october),
(ohA1)-[:hasValidity]->(november),
(ohA1)-[:hasValidity]->(december),

(ohA2)-[:hasValidity]->(january),
(ohA2)-[:hasValidity]->(february),
(ohA2)-[:hasValidity]->(march),
(ohA2)-[:hasValidity]->(april),
(ohA2)-[:hasValidity]->(may),
(ohA2)-[:hasValidity]->(june),
(ohA2)-[:hasValidity]->(august),
(ohA2)-[:hasValidity]->(september),
(ohA2)-[:hasValidity]->(october),
(ohA2)-[:hasValidity]->(november),
(ohA2)-[:hasValidity]->(december),


(ohA1)-[:hasValidity]->(tuesday),
(ohA1)-[:hasValidity]->(wednesday),
(ohA1)-[:hasValidity]->(thursday),
(ohA2)-[:hasValidity]->(friday)


CREATE (locationB:Location{name:"Location B"}),

(locationB)-[:hasOpeningHours]->(ohB1:OpeningHours),
(ohB1)-[:hasInterval]->(:Interval{from:1000,to:1400}),
(ohB1)-[:hasInterval]->(:Interval{from:1500,to:1900}),

(locationB)-[:hasOpeningHours]->(ohB2:OpeningHours),
(ohB2)-[:hasInterval]->(:Interval{from:1000,to:1400}),
(ohB2)-[:hasInterval]->(:Interval{from:1600,to:2100}),

(locationB)-[:hasOpeningHours]->(ohB3:OpeningHours),
(ohB3)-[:hasInterval]->(:Interval{from:1000,to:1300}),

(ohB1)-[:hasValidity]->(january),
(ohB1)-[:hasValidity]->(february),
(ohB1)-[:hasValidity]->(march),
(ohB1)-[:hasValidity]->(april),
(ohB1)-[:hasValidity]->(may),
(ohB1)-[:hasValidity]->(june),
(ohB1)-[:hasValidity]->(july),
(ohB1)-[:hasValidity]->(august),
(ohB1)-[:hasValidity]->(september),
(ohB1)-[:hasValidity]->(october),
(ohB1)-[:hasValidity]->(november),
(ohB1)-[:hasValidity]->(december),

(ohB2)-[:hasValidity]->(january),
(ohB2)-[:hasValidity]->(february),
(ohB2)-[:hasValidity]->(march),
(ohB2)-[:hasValidity]->(april),
(ohB2)-[:hasValidity]->(may),
(ohB2)-[:hasValidity]->(june),
(ohB2)-[:hasValidity]->(july),
(ohB2)-[:hasValidity]->(august),
(ohB2)-[:hasValidity]->(september),
(ohB2)-[:hasValidity]->(october),
(ohB2)-[:hasValidity]->(november),
(ohB2)-[:hasValidity]->(december),

(ohB3)-[:hasValidity]->(january),
(ohB3)-[:hasValidity]->(february),
(ohB3)-[:hasValidity]->(march),
(ohB3)-[:hasValidity]->(april),
(ohB3)-[:hasValidity]->(may),
(ohB3)-[:hasValidity]->(june),
(ohB3)-[:hasValidity]->(august),
(ohB3)-[:hasValidity]->(september),
(ohB3)-[:hasValidity]->(october),
(ohB3)-[:hasValidity]->(november),
(ohB3)-[:hasValidity]->(december),

(ohB1)-[:hasValidity]->(monday),
(ohB1)-[:hasValidity]->(tuesday),
(ohB2)-[:hasValidity]->(thursday),
(ohB1)-[:hasValidity]->(friday),
(ohB3)-[:hasValidity]->(saturday)


Graph


Get all locations which are open at 16:23

MATCH
  (location:Location)-[:hasOpeningHours]->(openingHours:OpeningHours),
  (openingHours)-[:hasInterval]->(interval:Interval),
  (openingHours)-[:hasValidity]->(day:DayName),
  (openingHours)-[:hasValidity]->(month:Month)
WHERE
  interval.from <= 1623 AND
  interval.to > 1623
RETURN DISTINCT location.name, day.name, interval.from + " - " + interval.to as OpeningHours



Get all days of locations which are open after 20:00

MATCH
  (location:Location)-[:hasOpeningHours]->(openingHours:OpeningHours),
  (openingHours)-[:hasInterval]->(interval:Interval),
  (openingHours)-[:hasValidity]->(day:DayName),
  (openingHours)-[:hasValidity]->(month:Month)
WHERE
  interval.to >= 2000
RETURN DISTINCT location.name, collect(DISTINCT day.name) as days, collect(month.name) as months

'''

Which locations are opened at saturdays?

Returns all locations which are opened at saturdays. Also returns all months where this is valid. E.g. "Location B" has open on saturdays, every month except in july (holidays yay \o/)

MATCH
  (location:Location)-[:hasOpeningHours]->(openingHours:OpeningHours),
  (openingHours)-[:hasInterval]->(interval:Interval),
  (openingHours)-[:hasValidity]->(day:Saturday),
  (openingHours)-[:hasValidity]->(month:Month)
RETURN DISTINCT location.name, collect(month.name) as months, interval.from + " - " + interval.to as OpeningHours



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