Я новичок в Cypher language (Neo4J), и я безуспешно пытаюсь найти ответ на свою проблему.Я успешно загрузил узлы для года (года), месяца (месяца) и дня (дня) с отношениями Has_Month и Has_Day.Я также успешно загружаю узел Аэропорты (airportCode).
Теперь у меня есть файл CSV со следующими данными:
Origin,YearDeparture,MonthDeparture,DayDeparture
AGP,2018,02,16
CDG,2017,05,24
...
Я хочу создать связь между Днем и Происхождением (которая являетсяАэропорт уже создан).Мне нужно сделать что-то вроде этого псевдокода:
if YearDeparture = Year.year AND
MonthDeparture = Month.month AND
DayDeparture = Day.day AND
Origin = Airport.airportCode then
CREATE (d)-[:HAS_AIRPORT]->(a)
(where d is a Day and a is an airport)
Я пробовал этот код безуспешно:
LOAD CSV WITH HEADERS FROM "File:///AirportLinkedToDay.csv" AS csvLine
WITH csvLine WHERE NOT csvLine.Origin IS NULL
MATCH (y:Year {year: csvLine.YearDeparture})
MATCH (m:Month {month: csvLine.MonthDeparture})
MATCH (d:Day {day: csvLine.DayDeparture})
MATCH (a:AIRPORT {airportCode: csvLine.Origin })
MATCH (y)-[:HAS_MONTH]->(m)-[:HAS_DAY]->(d)
MERGE (d)-[:HAS_AIRPORT]->(a)
Большое спасибо за вашу помощь.И не стесняйтесь, если что-то неясно.M.
Обновление: код для создания частей иерархических дат (год, месяц, узлы дня):
WITH range(2012, 2025) AS years, range(1,12) as months
FOREACH(year IN years |
MERGE (y:Year {year: year})
FOREACH(month IN months |
CREATE (m:Month {month: month})
MERGE (y)-[:HAS_MONTH]->(m)
FOREACH(day IN (CASE
WHEN month IN [1,3,5,7,8,10,12] THEN range(1,31)
WHEN month = 2 THEN
CASE
WHEN year % 4 <> 0 THEN range(1,28)
WHEN year % 100 <> 0 THEN range(1,29)
WHEN year % 400 = 0 THEN range(1,29)
ELSE range(1,28)
END
ELSE range(1,30)
END) |
CREATE (d:Day {day: day})
MERGE (m)-[:HAS_DAY]->(d))))
Обновление: код для создания узлов аэропортов:
LOAD CSV WITH HEADERS FROM "File:///Airports.csv" AS csvLine
CREATE (p:AIRPORT { airportCode: csvLine.Code })