1
+ //Student Name: PEIYU LIU
2
+ //Student ID: 31153291
3
+
4
+ // Task C1 Database Design.
5
+
6
+ // ● Create a new project called MASL.
7
+ //DONE
8
+ // ● Create a new graph called MASLgraph.
9
+ //DONE
10
+
11
+ // import csv to neo4j graph
12
+ //Analysis
13
+ //ufo: individual_nodes:[year,day,month,hour, shape,conds,wdire,location]
14
+ //state: state-countyname-city[latitude,longitude]
15
+ //Potential nodes: UFO,YEAR,DAY,MONTH,HOUR,SHAPE,WEATHER_CONDITION,WIND_DIRECTION,LOCATION(CITY,COUNTYNAME,STATE)
16
+ //Potential relationships:
17
+ // (UFO)-[:IS_HAPPENED_IN]->(LOCATION)
18
+ // (UFO) -[:IS_SHAPE_OF]-> (SHAPE)
19
+ // (UFO) -[:IS_WEAHTER_CONDITION_OF]-> (WEAHTER_CONDITION)
20
+ // (UFO) -[:IS_WEAHTER_DIRECTION_OF]-> (WEAHTER_DIRECTION)
21
+ // (UFO) -[:IN_MONTH_OF]-> (MONTH)
22
+ // (UFO) -[:IN_YEAR_OF]-> (YEAR)
23
+ // (UFO) -[:IN_DAY_OF]-> (DAY)
24
+ // (UFO) -[:IN_HOUR_OF]-> (HOUR)
25
+
26
+ //Import state
27
+ LOAD CSV WITH HEADERS FROM 'file:///states_a2.csv' AS data
28
+ WITH data
29
+ // check null value
30
+ WHERE data .city IS NOT NULL
31
+ // set node with properties[city,county,state,lat,lng]
32
+ // ensure data format is right using toUpper and toFloat
33
+ MERGE (location :Location {
34
+ city : toUpper (data .city ),
35
+ lat : toFloat (data .lat ),
36
+ lng : toFloat (data .lng ),
37
+ countyName : toUpper (data .countyName ),
38
+ state : toUpper (data .state )} );
39
+
40
+ //Import ufo
41
+ LOAD CSV WITH HEADERS FROM 'file:///ufo_a2.csv' AS data
42
+ WITH data
43
+ //Create nodes for each row in ufo.csv
44
+ CREATE (u :UFO {
45
+ } )
46
+ // give conditions to check null value: CASE X WHEN NULL THEN NULL ELSE X
47
+ // match data value with csv file, `` to avoid space between variables' name
48
+ SET u .duration = (CASE data .`duration` WHEN "" THEN NULL WHEN "NA" THEN NULL ELSE trim (data .`duration` )END )
49
+ // trim to remove empty space in front of string value or in the end of string value
50
+ SET u .text = (CASE data .`text` WHEN "" THEN NULL WHEN "NA" THEN NULL ELSE trim (data .`text` )END )
51
+ SET u .summary = (CASE data .`summary` WHEN "" THEN NULL WHEN "NA" THEN NULL ELSE trim (data .`summary` )END )
52
+ // ensure float and integer format when I set value to my properties
53
+ SET u .pressure = (CASE toFloat (data .`pressure` ) WHEN "" THEN NULL WHEN "NA" THEN NULL ELSE toFloat (data .`pressure` )END )
54
+ SET u .temp = (CASE toFloat (data .`temp` ) WHEN "" THEN NULL WHEN "NA" THEN NULL ELSE toFloat (data .`temp` )END )
55
+ SET u .hail = (CASE toInteger (data .`hail` ) WHEN "" THEN NULL WHEN "NA" THEN NULL ELSE toInteger (data .`hail` )END )
56
+ SET u .heatindex = (CASE toFloat (data .`heatindex` ) WHEN "" THEN NULL WHEN "NA" THEN NULL ELSE toFloat (data .`heatindex` )END )
57
+ SET u .windchill = (CASE data .`windchill` WHEN "" THEN NULL WHEN "NA" THEN NULL ELSE toFloat (data .`windchill` )END )
58
+ SET u .rain = (CASE data .`rain` WHEN "" THEN NULL WHEN "NA" THEN NULL ELSE toInteger (data .`rain` )END )
59
+ SET u .vis = (CASE data .`vis` WHEN "" THEN NULL WHEN "NA" THEN NULL ELSE toFloat (data .`vis` )END )
60
+ SET u .dewpt = (CASE data .`dewpt` WHEN "" THEN NULL WHEN "NA" THEN NULL ELSE toFloat (data .`dewpt` )END )
61
+ SET u .thunder = (CASE data .`thunder` WHEN "" THEN NULL WHEN "NA" THEN NULL ELSE toInteger (data .`thunder` )END )
62
+ SET u .fog = (CASE data .fog WHEN "" THEN NULL WHEN "NA" THEN NULL ELSE toInteger (data .`fog` )END )
63
+ SET u .precip = (CASE data .precip WHEN "" THEN NULL WHEN "NA" THEN NULL ELSE toFloat (data .`precip` )END )
64
+ SET u .wspd = (CASE data .wspd WHEN "" THEN NULL WHEN "NA" THEN NULL ELSE toFloat (data .`wspd` )END )
65
+ SET u .tornado = (CASE data .tornado WHEN "" THEN NULL WHEN "NA" THEN NULL ELSE toInteger (data .`tornado` )END )
66
+ SET u .hum = (CASE data .hum WHEN "" THEN NULL WHEN "NA" THEN NULL ELSE toFloat (data .`hum` )END )
67
+ SET u .snow = (CASE data .snow WHEN "" THEN NULL WHEN "NA" THEN NULL ELSE toInteger (data .`snow` )END )
68
+ SET u .wgust = (CASE data .wgust WHEN "" THEN NULL WHEN "NA" THEN NULL ELSE toFloat (data .`wgust` ) END )
69
+ SET u .city = (CASE data .city WHEN "" THEN NULL WHEN "NA" THEN NULL ELSE toUpper (data .`city` )END )
70
+ SET u .state = (CASE data .state WHEN "" THEN NULL WHEN "NA" THEN NULL ELSE toUpper (data .`state` ) END )
71
+ // traverse each row and unwind shape as individual node for query's convenience.
72
+ // CASE WHEN ELSE END to deal with null value.
73
+ // Create relationships with UFO
74
+ FOREACH (IGNOREME IN CASE data .shape WHEN NULL THEN NULL WHEN "NA" THEN NULL ELSE toUpper (trim (data .shape )) END |
75
+ MERGE (s :Shape { shape : toUpper (trim (data .shape ))} )
76
+ MERGE (u ) - [ : IS_SHAPE_OF ] -> (s )
77
+ )
78
+ // traverse each row and unwind weahter condition as individual node for query's convenience.
79
+ // CASE WHEN ELSE END to deal with null value.
80
+ // Create relationships with UFO
81
+ FOREACH (IGNOREME IN CASE data .conds WHEN NULL THEN NULL WHEN "NA" THEN NULL ELSE toUpper (trim (data .conds )) END |
82
+ MERGE (c :Conds { condition : toUpper (trim (data .conds ))} )
83
+ MERGE (u ) - [ : IS_WEAHTER_CONDITION_OF ] -> (c )
84
+ )
85
+ // traverse each row and unwind weather direction as individual node for query's convenience.
86
+ // CASE WHEN ELSE END to deal with null value.
87
+ // Create relationships with UFO
88
+ FOREACH (IGNOREME IN CASE data .wdire WHEN NULL THEN NULL WHEN "NA" THEN NULL ELSE toUpper (trim (data .wdire )) END |
89
+ MERGE (wd :Wdire { direction : toUpper (trim (data .wdire ))} )
90
+ MERGE (u ) - [ : IS_WEAHTER_DIRECTION_OF ] -> (wd )
91
+ )
92
+ // traverse each row and unwind month as individual node for query's convenience.
93
+ // CASE WHEN ELSE END to deal with null value.
94
+ // Create relationships with UFO
95
+ FOREACH (IGNOREME IN CASE data .month WHEN NULL THEN NULL WHEN "NA" THEN NULL ELSE data .month END |
96
+ MERGE (m :Month { month : data .month } )
97
+ MERGE (u ) - [ : IN_MONTH_OF ] -> (m )
98
+ )
99
+ // traverse each row and unwind year as individual node for query's convenience.
100
+ // CASE WHEN ELSE END to deal with null value.
101
+ // Create relationships with UFO
102
+ FOREACH (IGNOREME IN CASE data .year WHEN NULL THEN NULL WHEN "NA" THEN NULL ELSE data .year END |
103
+ MERGE (y :Year { year : data .year } )
104
+ MERGE (u ) - [ : IN_YEAR_OF ] -> (y )
105
+ )
106
+ // traverse each row and unwind day as individual node for query's convenience.
107
+ // CASE WHEN ELSE END to deal with null value.
108
+ // Create relationships with UFO
109
+ FOREACH (IGNOREME IN CASE data .day WHEN NULL THEN NULL WHEN "NA" THEN NULL ELSE data .day END |
110
+ MERGE (d :Day { day : data .day } )
111
+ MERGE (u ) - [ : IN_DAY_OF ] -> (d )
112
+ )
113
+ // traverse each row and unwind hour as individual node for query's convenience.
114
+ // CASE WHEN ELSE END to deal with null value.
115
+ // Create relationships with UFO
116
+ FOREACH (IGNOREME IN CASE data .hour WHEN NULL THEN NULL WHEN "NA" THEN NULL ELSE data .hour END |
117
+ MERGE (h :Hour { hour : data .hour } )
118
+ MERGE (u ) - [ : IN_HOUR_OF ] -> (h )
119
+ );
120
+
121
+ //Create relationships between UFO and where was it happened.
122
+ LOAD CSV WITH HEADERS FROM 'file:///ufo_a2.csv' AS data
123
+ WITH data
124
+ // MATCH right UFO and Location nodes.
125
+ MATCH (u :UFO {
126
+ city : toUpper (data .city ),
127
+ state : toUpper (data .state ),
128
+ text : data .text ,
129
+ summary : data .summary ,
130
+ pressure : toFloat (data .pressure )} )
131
+ MATCH (location :Location { city : toUpper (data .city ), state : toUpper (data .state )} )
132
+ // create relationship
133
+ CREATE (u )- [ : IS_HAPPENED_IN ] -> (location );
134
+ // change year,month,hour,day to int format.
135
+ MATCH (y :Year ) SET y .year = toInteger (y .year );
136
+ MATCH (y :Month ) SET y .month = toInteger (y .month );
137
+ MATCH (y :Day ) SET y .day = toInteger (y .day );
138
+ MATCH (y :Hour ) SET y .hour = toInteger (y .hour );
0 commit comments