Cypher - множественное отображение при загрузке файлов CSV - PullRequest
0 голосов
/ 03 октября 2018

Я новичок в 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 })

1 Ответ

0 голосов
/ 03 октября 2018

Основная проблема была вызвана тем, что LOAD CSV обрабатывает все входные значения как строки.Для сопоставления с целочисленными значениями необходимо преобразовать входные строки в целые числа с помощью функции TOINTEGER().Например:

LOAD CSV WITH HEADERS FROM "File:///AirportLinkedToDay.csv" AS row
WITH row WHERE NOT row.Origin IS NULL
MATCH (y:Year {year: TOINTEGER(row.YearDeparture)})
MATCH (m:Month {month: TOINTEGER(row.MonthDeparture)})
MATCH (d:Day {day: TOINTEGER(row.DayDeparture)})
MATCH (a:AIRPORT {airportCode: row.Origin })
MATCH (y)-[:HAS_MONTH]->(m)-[:HAS_DAY]->(d)
MERGE (d)-[:HAS_AIRPORT]->(a)

Кроме того, ваш запрос будет более эффективным, если вы создали индексы on:

  • : Год (год)
  • : АЭРОПОРТ (код аэропорта)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...