code for adding edges added in but not quite done to avoid duplicate edge creation yet and completely untested

This commit is contained in:
Pagwin 2025-04-24 16:32:53 -04:00
parent 9118e59b3a
commit a7a7abd901
No known key found for this signature in database
GPG key ID: 81137023740CA260

View file

@ -20,6 +20,13 @@ interface GTFSStop {
stop_url?: string; stop_url?: string;
[key: string]: string | undefined; // Allow for additional fields [key: string]: string | undefined; // Allow for additional fields
} }
interface GTFSStopTime {
trip_id: string;
arrival_time: string;
departure_time: string;
stop_id: string;
stop_sequence: number;
}
/** /**
* Sets up a Neo4j graph database with location nodes from JSON and GTFS stop data * Sets up a Neo4j graph database with location nodes from JSON and GTFS stop data
@ -31,6 +38,7 @@ export async function graph_setup(
driver: Neo4j.Driver, driver: Neo4j.Driver,
OCCT_stops_json: string = "./data/OCCT/stops.json", OCCT_stops_json: string = "./data/OCCT/stops.json",
BCT_GTFS_stops_txt: string = "./data/BCT/stops.txt", BCT_GTFS_stops_txt: string = "./data/BCT/stops.txt",
BCT_GTFS_stops_times_txt: string = "./data/BCT/stop_times.txt",
): Promise<void> { ): Promise<void> {
const session = driver.session(); const session = driver.session();
@ -45,6 +53,10 @@ export async function graph_setup(
await stops_gtfs_node_import(session, BCT_stops, { provider: "BCT" }); await stops_gtfs_node_import(session, BCT_stops, { provider: "BCT" });
const BCTStopTimesData = await Deno.readTextFile(BCT_GTFS_stops_times_txt);
const BCT_stop_times = await parse_gtfs_stop_times(BCTStopTimesData);
await gtfs_edge_import(session, BCT_stop_times);
await session.close(); await session.close();
} }
@ -102,23 +114,20 @@ async function stops_gtfs_node_import(
s.name = $name, s.name = $name,
s.latitude = $lat, s.latitude = $lat,
s.longitude = $lng, s.longitude = $lng,
s.locationType = $locationType,
s.parentStation = $parentStation,
s.zoneId = $zoneId,
s.url = $url, s.url = $url,
s.originalId = $originalId,
s.source = '${provider}' s.source = '${provider}'
ON MATCH SET ON MATCH SET
s.name = $name, s.name = $name,
s.latitude = $lat, s.latitude = $lat,
s.longitude = $lng, s.longitude = $lng,
s.locationType = $locationType,
s.parentStation = $parentStation,
s.zoneId = $zoneId,
s.url = $url, s.url = $url,
s.originalId = $originalId,
s.source = '${provider}' s.source = '${provider}'
`, `,
{ {
id: `${provider}_` + stop.stop_id, id: `${provider}_` + stop.stop_id,
originalId: stop.stop_id,
name: stop.stop_name, name: stop.stop_name,
lat: parseFloat(stop.stop_lat), lat: parseFloat(stop.stop_lat),
lng: parseFloat(stop.stop_lon), lng: parseFloat(stop.stop_lon),
@ -172,3 +181,69 @@ async function parse_gtfs_stops(txt: string): Promise<GTFSStop[]> {
return validStops; return validStops;
} }
async function parse_gtfs_stop_times(
fileContents: string,
): Promise<GTFSStopTime[]> {
const records = await parseCSV(fileContents, {
skipFirstRow: true,
columns: true,
});
const stopTimes: GTFSStopTime[] = [];
for (const row of records as Record<string, string>[]) {
stopTimes.push({
trip_id: row.trip_id,
arrival_time: row.arrival_time,
departure_time: row.departure_time,
stop_id: row.stop_id,
stop_sequence: parseInt(row.stop_sequence, 10),
});
}
return stopTimes;
}
async function gtfs_edge_import(
session: neo4j.Session,
stop_times: GTFSStopTime[],
): Promise<void> {
const groupedByTrip = new Map<string, GTFSStopTime[]>();
// Group by trip_id
for (const stopTime of stop_times) {
if (!groupedByTrip.has(stopTime.trip_id)) {
groupedByTrip.set(stopTime.trip_id, []);
}
groupedByTrip.get(stopTime.trip_id)!.push(stopTime);
}
for (const [tripId, stops] of groupedByTrip.entries()) {
// Sort by stop_sequence
stops.sort((a, b) => a.stop_sequence - b.stop_sequence);
for (let i = 0; i < stops.length - 1; i++) {
const from = stops[i];
const to = stops[i + 1];
await session.run(
`
MATCH (from:TransportNode {originalId: $fromId}), (to:TransportNode {originalId: $toId})
MERGE (from)-[:DEPARTS_TO {
tripId: $tripId,
departureTime: $departureTime,
arrivalTime: $arrivalTime
}]->(to)
`,
{
fromId: from.stop_id,
toId: to.stop_id,
tripId,
departureTime: from.departure_time,
arrivalTime: to.arrival_time,
},
);
}
}
}