neo4j - 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 })
解决方案
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(机场代码)
推荐阅读
- spring-mvc - 如何从 Liferay 7.1 中的 url 中删除 '/o' 前缀
- html - 如何从值为真的 JSON 中提取键
- cluster-analysis - 了解聚类中的轴
- c# - 使用 IEnumerable 从连接中返回 IQueryable
- spring-boot - 如何使用springboot将所有微服务日志记录在一个日志文件中
- microcontroller - 在 I2C 总线中,从设备如何知道数据是否属于它们
- javascript - iFrame 中 Firefox 上的麦克风权限不是永久性的
- spring - Keycloak - 找不到指定孩子的公钥
- java - 断言对象是一个有效的顶级 json 可序列化
- google-cloud-platform - 当我使用 Google Cloud Application Flex 提供的 Memcache 服务时,“session_memcached_host:”会是什么。引擎?