屈新明 郭 鵬 丘建棟 譚章智 董紹軒
(1. 深圳市城市交通規劃設計研究中心有限公司,廣東 深圳 518021;2. 中交第二公路勘察設計研究院有限公司,湖北 武漢 430056)
關鍵字:圖數據庫;Neo4j;IC卡數據;公交出行行為
近年來隨著大數據挖掘分析技術的快速發展,在各領域處理復雜網狀關系的挖掘分析需求逐漸增加[1]。在面向復雜場景下數據關聯挖掘分析中,主流的關系型數據庫并不是都適用于場景分析,尤其是在多維關聯查詢分析時,關系型數據庫效率較低[2]。隨著圖數據庫的快速發展[3-5],為數據挖掘分析提供了新的解決方案。郝培豪[6]研究分析了圖數據庫的警務安保知識圖譜可視化分析;康杰華[7]研究分析了圖形數據庫Neo4j的RDF數據存儲;柴博[8]等人研究分析了基于圖數據庫的電力通信網絡運行方式建模;張蕓蕓[9]等人研究了基于Neo4j圖譜的信用卡欺詐檢測。
目前圖數據庫在交通中的應用較少,在公交出行行為分析方面,游婷[10]等人研究了基于公交IC卡信息的公交客流推算;孫世超[11]研究基于宏微觀數據嵌套的公交用戶細分方法;秦政[12]研究基于公交IC卡和GPS數據的乘客上下車站點提??;馬曉磊[13]研究了基于公交IC卡數據的上車站點推算。
本文將探索圖數據庫在公交出行行為分析中的應用,利用Neo4j圖數據庫對深圳市某一工作日的公交刷卡數據,公交線路數據進行建模分析,挖掘識別公交出行行為,并對比分析了相同分析場景下ORACLE數據庫與Neo4j圖數據庫的查詢效率。
圖數據庫是基于圖形理論實現的一種非關系型數據庫,它的底層數據存儲和與查詢方式都是以圖論為基礎,其中圖論中的基礎元素為節點和節點之間的邊,在圖數據庫中對應的就是節點和關系。圖形數據庫作為一種非關系型數據庫,將結構化數據存儲在網絡 (圖) 上而不是關系型數據庫中的表,常見的有Neo4j、FlockDB、AllegroGraph、GraphDB、InfiniteGraph、TigerGraph、騰訊星圖等。Neo4j是由Java實現的開源圖數據庫,實現了專業數據庫界別的圖數據模型存儲,并提供完整的數據庫特性,是目前生產環境中主流的圖數據庫引擎,由于開源特性及其豐富的文檔,本文將使用Neo4j構建公交出行圖數據庫場景。
關系型數據庫與Neo4j建庫示意如圖1所示。


圖1 關系型數據庫與Neo4j建庫示意
關系型數據庫通過外鍵記錄兩個表或者多個表之間的引用關系,在進行關聯查詢時通過外鍵在主表中尋找對應的主鍵記錄進行數據搜索與匹配計算操作,關聯查詢時將會耗費大量系統計算資源,尤其是在多表關聯查詢場景下查詢效率極低。關系型數據庫中多對多關系需要使用中間表,查詢效率進一步下降。圖數據庫使用圖論存儲節點和節點之間的關系,而每個節點都包含對應的關系列表,用于存放該節點與其他節點的關系,節點之間的關聯挖掘分析直接基于圖論進行搜索分析,在復雜數據挖掘分析效率上遠高于關系型數據庫。
基礎數據為公交線路Busline表和公交刷卡記錄IC_card_record表,其中,Busline表包含了深圳市約1 000條公交線路對應站點數據,IC_card_record表為深圳市某個工作日約300萬條刷卡記錄,刷卡記錄已經匹配下車站點信息。公交線路如表1所示,公交刷卡記錄如表2所示。

表1 公交線路表

表2 公交刷卡記錄表
將公交出行行為關聯數據抽象成如圖2所示的建??蚣?。

圖2 公交出行行為場景建??蚣?/p>
其中實體包含:公交車輛、 公交站點、公交線路、IC卡(公交出行者)、刷卡記錄;關系包含:公交車輛—公交線路(屬于)、公交線路-公交站點(經過)、IC卡-刷卡出行(出行)、公交站點-刷卡出行(上車)、公交站點-公交站點(相鄰)、刷卡出行-公交站點(下車),場景建模規模達到5 00萬節點,1 000萬條邊。
將原始數據兩張表轉為圖數據庫對應的節點,其中數據表中的一條記錄對應圖數據庫中的一個節點,整個數據表對應圖數據庫中某一節點集合(標簽)。
公交車輛實體:從IC_card_record表中提取vehicle標簽(去重),單個節點僅包含vehicle_id屬性。
公交線路實體:從busline表中提取line標簽,單個節點包含line_id、line_name、dir、line_dir_name等屬性。
公交站點實體:從busline表中提取station標簽,單個節點包含:station_id、station_name、lng、lat等屬性。
刷卡記錄實體: 從ride表中提取ride標簽, 單個節點包含:ride_id、card_id兩個屬性。
IC卡標簽實體:從IC_card_record表中提取card標簽(去重),單個節點僅包含card_id屬性。
根據基礎數據中的兩張表處理節點之間的對應關系。
公交車輛—>公交線路(屬于關系):從IC_card_record表中提取公交車輛與公交線路的屬于關系(去重),關系匹配字段為vehicle_id—>line_id。
公交線路—>公交站點(經過關系):從busline表中描述了每條公交線路經過公交站點的關系,關系匹配字段為line_id—>station_id,關系屬性包含station_index。
公交站點—>刷卡記錄(上車關系):從IC_card_record表中提取公交站點與刷卡記錄的上車關系,匹配字段為station_id—>ride_id, 關 系 屬 性 包 含line_id,up_station_index,up_day,up_min。
刷卡記錄—>公交站點(下車關系):從IC_card_record表中提取刷卡記錄與公交站點的下車關系,匹配字段為ride_id—> station_id,關系屬性包含line_id、down_station_index、down_day、down_min。
IC卡—>刷卡記錄(出行關系):從IC_card_record表中提取IC卡與刷卡記錄出行關系,匹配字段為card_id—>card_id。
公交站點-公交站點(相鄰):從busline表中根據經緯度坐標記錄公交站點之間的相鄰關系,匹配字段為station_id—station_id。
識別提取早高峰遠距離同乘人員,根據圖數據庫挖掘分析早高峰(7:30~9:00)、長距離(大于10個站)的同乘人員(同一站點上車、同一站點下車)情況。同乘人員識別分析結果如表3所示。

表3 同乘人員識別分析結果
分析結果表明,早高峰乘坐公交長距離出行到科技園站的人較多,可以進一步優化預約巴士地到發班次。
提取識別全天點對點最大公交客流情況,支撐公交站點線路優化,其中采用ORACLE查詢時間為3.214 s,Neo4j查詢時間為25.637 s,單表之間的查詢中Neo4j性能低于ORACLE數據庫。站點最大客流提取識別如表4所示。

表4 站點最大客流提取識別
在Neo4j中進行多表關聯查詢,查詢科技園公交站周邊鄰近站點經過的各條公交線路擁有的車輛數,用于提取各公交線路運行車輛數。關聯查詢識別如表5所示,關聯識別框架如圖3所示。

表5 關聯查詢識別

圖3 關聯識別框架
其中,采用ORACLE查詢時間為2.403 s,Neo4j查詢時間為0.142 s,多維關聯查詢中Neo4j性能遠高于ORACLE數據庫。
根據站點之間的鄰近關系,識別提取公交站點群之間的公交出行量,支撐預約巴士開通與線路優化。直接通過ORACLE數據庫無法單獨完成查詢檢索,基于Neo4j可直接查詢,得到分析結果。公交站點群之間的出行量識別結論如圖4所示。

圖4 公交站點群之間的出行量識別結論
本文基于圖數據庫Neo4j構建了公交出行行為分析場景建模,對深圳市1 000條公交線路,一天工作日的公交刷卡數據進行建模分析,建模規模達到500萬節點,1 000萬條邊。在不同的公交出行行為場景分析中對比分析了ORACLE數據庫與Neo4j的查詢性能,多維關聯查詢中Neo4j性能遠高于ORACLE數據庫,基于圖數據庫可以方便高效實現復雜數據的關聯挖掘分析。
本文僅對深圳市一天工作日的公交刷卡數據進行建模分析,后續將構建更為復雜建模場景,構建交通知識圖譜。