首页 > 解决方案 > Cypher - 加载 CSV 文件时的多重映射

问题描述

我是 Cypher 语言(Neo4J)的初学者,我试图找到我的问题的答案,但没有成功。我已经成功加载了具有 Has_Month 和 Has_Day 关系的 Year(year)、Month(month) 和 Day(day) 节点。我也成功加载了 Airports(airportCode) 节点。

现在,我有一个包含这些数据的 CSV 文件:

Origin,YearDeparture,MonthDeparture,DayDeparture
AGP,2018,02,16
CDG,2017,05,24
...

我想创建 Day 和 Origin 之间的关系(这是一个已经创建的机场)。我需要做这样的伪代码:

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 })

标签: neo4jcypher

解决方案


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)

此外,如果您在以下位置创建索引,您的查询将更加高效:

  • :年(年)
  • :AIRPORT(机场代码)

推荐阅读