作者 | 閉雨哲
出品 | 北京圖特摩斯科技 (thutmose.cn) ---- 點擊 原文 <--觀看視覺更佳
一、背景介紹
新冠肺炎是一種具有最長達24天潛伏期的新型突發性傳染疾病,這種特性給疫情防控帶來了巨大的挑戰,隨着感染規模的不斷擴增,簡單的人爲治理已不太奏效,使用“大數據”技術手段來輔助人爲治理社會有助於快速準確的定位問題關鍵,幫助決策者及時作出下一步規劃。
個人感受:
這一個月來每天都會在各大站點查看感染人數的更新、病例的行程發佈等等,然而互聯信息更新總是不能趕上羣衆急切的小手手...
技術背景:
知識圖譜技術作爲大數據走向人工智能的臺階,它以最契合社會行爲的形式表達複雜的社會結構,非常適合分析具有關聯關係的數據,使用知識圖譜技術分析傳染關係及社會動向非常有利於疫情的防控,對疫後的研究分析也有幫助。儘管當前大數據和人工智能的應用尚處於初級階段,但以知識圖譜爲核心的研究成果正在帶來一波新興的科技潮流。
知識圖譜背後的技術關鍵“圖數據庫”:
圖形數據庫是一種應用關係圖理論存儲複雜的實體之間的關係信息,即用“點”和“邊”的形式來存儲數據,最常見例子就是社會網絡中人與人之間的關係,正是本次疫情中的關鍵線索。
使用技術:
本文使用圖特摩斯科技自研的國內首個時序圖譜平臺AbutionGraph作爲技術支撐,主要技術突破點爲:靜態圖+動態圖+時序圖+多維的存儲形式。
解決問題:
疫情實時統計:實時統計醫院/城市/省份的確診/疑似/死亡/接觸人數等
疫情實時分析:病例接觸者人羣溯源及時排查、高風險同行人羣分析、城市區域風險等級計算等
疫情數據研究:病毒傳播渠道及路徑、尋找疾病候選藥物,提供相應的藥物作用機制等
使用數據:
本次演示共使用5類實體數據:包括正常人、病例、地址、交通工具、醫院等數據信息,以及各類實體之間的關聯關係,如“某患者曾出現於某超市”等關係。我們使用AbutionGraph依據真實場景建模,由於詳細數據不公開,本文中均使用模擬數據進行分析。
二、與普通圖存儲的技術區別
在建模前,我們有必要先來理解一下多維、動態、時序這些在圖譜存儲中的新概念。
1)“一維”圖譜和“多維”圖譜的區別
一維圖譜:
(常見的圖形存儲結構,如:JanusGraph、Neo4J等技術中使用)
多維圖譜:
AbutionGraph獨有的存儲形式(實體屬性細分,任意維度的數據包含,如張某某具有2個維度的數據,而李某某不患有疾病,可不包含“維度2”。)
2)“靜態”、“動態”及“時序”圖譜的區別
假定場景:實時統計每個人之間的交易總金額。
1.靜態圖譜:
靜態圖譜統計歷史賬單總金額方法:10+5+5=20元
(所有交易信息都查詢出來,再逐個累加彙總)
2.動態圖譜:
動態圖譜統計歷史賬單總金額方法:
數據產生後發生存儲即實時自動彙總,及時查詢得出20元。
3.動靜結合:
靜態圖譜+動態圖譜是AbutionGraph特有形式,即可以保持歷史數據不變,又可無需人爲干預 實時根據歷史數據統計出指標。
4.時序圖譜:
時序指標計算是動態圖譜的特殊形式,即根據“事件”發生的時間線,使用劃分的時間區間進行實時指標計算。
如場景~統計每個人之間每天的實時交易總金額、統計每週(統計區間)實時新增病患。
三、新冠肺炎數據建模
瞭解了圖形的多種存儲形式後,接下來我們使用模擬數據依次建模,並詳細介紹每個實體與關係的數據映射關係。
當發生突發公共事件時,我們在“正常時期”的數據圖譜之上進行多維擴展,以支持更多業務,靈活應對疫情。
一)節點“人”數據建模
正常人數據(2維):
1.基本信息:性別、生日、籍貫等 (數據來自身份證採集等渠道)
2.曾患病信息:疾病名稱、發病時間、就診醫院等 (數據來自醫院聯網數據等渠道)
患病人數據(3維):
1.基本信息:性別、生日、籍貫等
2.曾患病信息:疾病名稱、發病時間、就診醫院等
3.患新冠肺炎:感染程度、診斷時間、感染原因、症狀等 (數據來自各地醫院實時上報等)
二) “人”-(收治於)->“醫院”
實體“醫院”數據(2維):
1.基本信息:病牀數、醫護數、病人數等 (實時動態數據 來自醫院資源管理系統等渠道)
2.病例信息:收治數、確診數、疑似數、病亡數、治癒數等 (實時動態數據 來自醫院聯網實時上報等渠道)
關係“收治於”數據(1維):
1.收治信息:收治時間、收治原因等 (數據 來自醫院實時上報等渠道)
三) “人”-(住在、出現於、感染於)->“地址”
關係數據(3維邊):
1.居住於:入住日期等 (歷史數據 來自社區物業管理系統等渠道)
2.出現於:出現日期等 (歷史數據 來自社區街道管理系統等渠道)
3.感染於:感染日期等 (實時數據 來自醫院聯網實時上報等渠道)
實體“地址”數據(1維):
1.地址:(無屬性信息)
四) “人”-(乘坐)->“交通工具”
關係數據(1維):
1.乘坐:上車時間、上車地點、下車時間、下車地點、座位號等 (數據 來自交管部門管理系統等渠道)
實體“交通工具”數據(多維):
1.車基本信息:編號、座位數、交管局、投入時間、維修信息、描述信息 (數據 來自交管部門管理系統等)
2.高鐵:司機、乘車人數、發車時間、始發站、終點站、途徑站點等 (數據 來自交管部門管理系統等)
3.飛機:司機、登機人數、出發城市、到達城市、起飛時間等 (數據 來自航空公司管理系統等)
4.地鐵:司機、車輛型號、發車時間、始發站、終點站、途徑站點等 (數據 來自城市軌道管理系統等)
Ps:交通數據種類豐富, 有公交站點、地鐵站點等靜態數據,還有基於事件流的動態數據,例如,公交車進出站、地鐵刷卡出行、出租車到達某一地理點等。
五) “人”-(接觸、傳染)->“人”
關係數據(1-2維):
1.接觸:接觸時間等 (數據 來自臨時背調等渠道)
2.傳染:無屬性
實體“人”維度(多維可變):
健康人(未得過病)1個維度:“基本信息” 維度
亞健康(得過疾病)2個維度:“基本信息”、“曾患病信息” 維度
患病人(患新肺炎)3個維度:“基本信息”、“曾患病信息” 、“患新冠肺炎” 維度
(各維度的屬性信息前章節已給出)
未確診前樣例數據:
確診後樣例數據:
感染人羣數據時間線:
2020-02-07:“趙六”(未發病)--探親->“趙七”(健康)
2020-02-10:“趙六”(發病),確診患新冠肺炎
2020-02-11:“趙七”(未發病),但爲確診病例“趙六”密切接觸者,隨後查出感染
“趙七”的密切接觸者“張女士”即應進入醫學觀察期
六) “醫院”-(歸屬於、院上報)->“城市”
關係數據(2維):
1.院上報:患者姓名、患者年齡、患者病情(危重/嚴重/輕症)、診斷情況(確診/疑似)、上報時間、上報人員等 (數據 來自醫院病患數據採集等)
2.歸屬於: (無屬性信息)
實體“城市”數據(2維):
1.市患者實時統計(動態):確診總數、疑似總數、嚴重患者總數、輕症患者總數、時間區間-按天分區等(數據 來自市醫院醫護實時彙報等)
2.市患者每日新增趨勢統計(時序):確診總數、疑似總數、嚴重患者總數、輕症患者總數、統計開始時間、結束時間等
七) “城市”-(歸屬於、市上報)->“省份”
關係數據(2維):
1.市上報(按天):確診總數、疑似總數、嚴重患者總數、輕症患者總數等 (數據 來自市級數據實時自動獲取)
2.歸屬於: (無屬性信息)
實體“省份”數據(2維):
1.省總患者統計(動態):確診總數、疑似總數、嚴重患者總數、輕症患者總數等 (數據 來自市醫院醫護實時彙報等)
2.省每日新增患者統計(時序):確診總數、疑似總數、嚴重患者總數、輕症患者總數、統計開始時間、結束時間等
至此,數據建模介紹完畢。如上,數據統計部分已經實現自動化,即查即用。接下來基於此設定數據集進行一些更上層的分析場景演示。
四、場景分析演示
Ps:AbutionGraph查詢方式偏API,暫未實現GSQL,爲了方便理解,查詢語句均使用相應查詢邏輯的僞代碼方式演示。
場景1、城市病例每日新增趨勢查詢(每日彙總)
查詢:
vertex ["北京市","深圳市"]
use "市患者每日新增趨勢統計"
select "開始時間" execute ">2019.01.20" //<<--按天分區彙總(預聚合-即圖庫自動計算的)
select "結束時間" execute "<2020.01.24"
結果:
北京市(2020.01.20):2例
北京市(2020.01.21):6例
北京市(2020.01.22):13例
北京市(2020.01.23):8例
深圳市(2020.01.20):4例
深圳市(2020.01.21):6例
深圳市(2020.01.22):18例
深圳市(2020.01.23):19例
場景2、城市病例分佈情況查詢(指定區間全量彙總)
查詢:
vertex ["北京市","深圳市"]
use "市患者實時統計維度"
select "開始時間" execute ">2019.01.20" //<<--按天分區彙總(後聚合)
select "結束時間" execute "<2020.02.24" //<<--不指定區間即所有天數據彙總
groupBy [] ;
結果:
北京市(2020.01.20-2020.01.24):29例
深圳市(2020.01.20-2020.01.24):47例
場景3、省份病例每日新增趨勢查詢(每日彙總)
查詢:
vertex ["廣西省"]
use "省每日新增患者統計維度"
select "開始時間" execute ">2019.02.10"
select "結束時間" execute "<2020.02.11"
count "確診總數,疑似總數" ;
結果:
廣西省(2020.02.10):
確診總數:11
疑似總數:29
廣西省(2020.02.11):
確診總數:18
疑似總數:30
場景4、城市病例的年齡段分佈情況(3跳查詢)
查詢:
vertex ["北京市"] toEdge [“院歸屬於”] toEntity ["市患者實時統計"] toEdge [“院上報”]
use ["院上報維度"] select [“患者年齡”] mean() ;
結果:
70~79歲:1人
60~69歲:4人
50~59歲:3人
40~49歲:8人
30~39歲:5人
20~29歲:1人
10~19歲:0人
0~9歲:0人
Ps:如上查詢爲3-跳查詢,如需求固定可在建模時爲此邏輯創建一個動態維度,實現自動化計算。
場景5、查出某病例確診前3天接觸過的人羣
查詢:
Vertex [“梁某某”,“陳某”] toEntity [“患新冠肺炎”] select [“確診時間”] toEdge [“接觸”] by [“接觸時間”>“確診時間”-3天]
use "基本信息維度" ;
結果:
梁某妹
梁某兄
陳某夫
場景6、找出所有超級傳播者
Ps:假定傳染人數超過4個即爲超級傳播者。
查詢:
use ["患新冠肺炎"] toEdge [“傳染”] count >= 5 ;
結果:
場景7、查找患者傳播鏈
Ps:假定傳染人數超過4個即爲超級傳播者。
查詢:
//<<--按患者傳染的路徑逐步遍歷,直到終點實體無“患新冠肺炎”維度
use ["患新冠肺炎"] for ( toEdge [“傳染”] ) until ( toEdge [] Dimension !=“患新冠肺炎”) ;
結果:
總結:
AbutionGraph是個年輕的圖數據庫系統,它可以滿足永不掉線的實時指標計算任務以及歷史數據分析,多維度的存儲模式除文中介紹的場景外,我們也可以在實體上動態存儲關係上的屬性,反之亦然,比如:在實體“張三”的某個維度上實時統計它最近聯繫過的10個朋友的名字並不斷更新與保存。
更多應用場景或者任何問題請反饋至郵箱: [email protected]