首页 > 解决方案 > 在 Neo4j 中添加与现有数据的关系

问题描述

从 Neo4j (4.2.3) 开始,我加载了一年的航班数据(7m 行),并想尝试将航班建模为始发地和目的地机场之间的关系。然而,下面的查询只是消耗了内存,两天后还没有完成,所以显然有些不对劲:

MATCH (f:Flight), (dest:Airport), (orig:Airport)
WHERE f.Dest = dest.IATA_Code AND f.Origin = orig.IATA_Code
CREATE (orig)-[r:FlightTo {DeptDateTime:f.DepDT, ArriveDateTime:f.ArrDT, Flight:f.Name}]->(dest)

我可以这样做:

LOAD CSV WITH HEADERS FROM 'file:///flights.csv' AS row
MERGE (o:Org_Airport {Org_IATA:row.Origin})
MERGE (d:Dest_Airport {Dest_IATA:row.Dest})
CREATE (o)-[r:FlightTo {DeptDateTime:row.DepDT, ArriveDateTime:row.ArrDT, Flight:row.Name}]->(d)

虽然这具有工作的优势(即使在合理的时间内),但基本上复制机场并且当所有需要的数据已经在数据库中时再次检查 CSV 文件时感觉很难看。我的图表思维可能并不完全在那里,所以我很感激一些关于添加这样的关系的最佳方法的指导,请记住原始加载文件可能会丢失。

标签: neo4jcypher

解决方案


你有设置索引吗?查看您的第一个查询,您需要:

CREATE INDEX ON :Flight(Dest);
CREATE INDEX ON :Airport(IATA_Code);

如果您没有在标签/属性上设置索引/约束,则查找/合并将非常慢。


推荐阅读