【问题标题】:Neo4j - Load CSV with Sequence RelationshipNeo4j - 加载具有序列关系的 CSV
【发布时间】:2019-09-21 09:27:01
【问题描述】:

我计划将火车时刻表和车站从 CSV 加载到 Neo4j 中。

源数据

TrainNo TrainName   SEQ   StationCode   Arrival Departure Distance
1           TN_1          1      S1           8      9       0
1           TN_1          2      S2           10     11     10
1           TN_1          3      S3           12     1      15 
1           TN_1          4      S4           3      4       15
2           TN_2          1      S1         
2           TN_2          2      S2         
2           TN_2          3      S5         
2           TN_2          4      S6         
2           TN_2          5      S7         
2           TN_2          6      S8         

我需要像这样建立节点和关系

S1--(TrainNo,TrainName,SEQ,Arrival,Depature,Distance)--S2--(TrainNo,TrainName,SEQ,Arrival,Depature,Distance)--S3--(TrainNo,TrainName,SEQ,Arrival,Depature,Distance)-S4

基本上,TrainNo、TrainName、Seq、Arrival、Depature 和 Distance 都会在关系上,相同的关系会形成车站之间的路线。

Neo4j - 3.5

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 我已经使用 MERGE 加载了所有的 StationCode,所以没有重复的 stationcode。同样在我过去的经验中,我已经加载了 From 和 To 列等数据。我还没有加载任何序列
  • 这是一个非常奇怪的 CSV。通常你会有类似关系 CSV 的东西,其中每一行代表你想要创建的关系(假设所有节点都已经创建),所以 CSV 应该有类似TrainNo, TrainName, SEQ, StationCodeFrom, StationCodeTo, Arrival, Departure, Distance 的东西。这样所有行都是相互独立的。在您当前的结构中,行依赖于其他行,例如,仅查看第 1 行无法判断 To 站是什么,它需要来自其他行的信息。如果可以,请创建一个更好的 CSV 文件。

标签: csv import neo4j cypher


【解决方案1】:

您可以按火车和序列进行排序和分组(假设文件名为train.csv

LOAD CSV WITH HEADERS FROM "file:///train.csv" AS row
WITH row ORDER BY row.TrainNo, row.SEQ
WITH row.TrainNo AS TrainNo, collect(row) AS stations
UNWIND range(0, size(stations) - 2) AS idx
WITH TrainNo, stations[idx] AS start, stations[idx+1] AS end
MERGE (s1:Station {code:start.StationCode})
MERGE (s2:Station {code:end.StationCode})
// depends on your model (see below)
CREATE (s1)-[:ROUTE {train:TrainNo}]->(s2);

// alternative
LOAD CSV WITH HEADERS FROM "file:///train.csv" AS row
WITH row ORDER BY row.TrainNo, row.SEQ
MERGE (t:Train {trainNo: row.TrainNo})
WITH row.TrainNo AS TrainNo, collect(row) AS stations
UNWIND range(0, size(stations) - 2) AS idx
WITH TrainNo, stations[idx] AS begin, stations[idx+1] AS last
MERGE (s1:Station {code:begin.StationCode})
MERGE (s2:Station {code:last.StationCode})
CREATE (s1)-[:LEAVES]->(l:Leg)-[:ENTERS]->(s2)
CREATE (l)-[:OF_TRAIN]->(t)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    相关资源
    最近更新 更多