新冠肺炎傳染圖譜建模與分析

​1、背景與數據來源介紹java

新型肺炎做爲一種存在潛伏期的傳染病,分析其傳染關係及接觸關係很是有利於疫情的防控,對疫後的研究分析也有幫助。本文將介紹基於圖數據庫對新型肺炎圖譜進行建模與分析的過程及效果。數據庫

圖數據庫(Graph Database)是一種複雜關係數據的處理系統,一種使用頂點、邊和屬性來表示與存儲數據,並以圖結構進行語義查詢的數據庫。圖數據庫的關鍵概念是邊,經過邊將頂點鏈接在一塊兒,從而進行快速的圖檢索操做。ide

圖數據庫很是適合用於分析此類關聯關係數據,這次使用百度開源的HugeGraph圖數據庫做爲分析工具。分析數據數據均來源於各地衛健委或權威網站公開公佈,如北京、石家莊、溫州、南昌、宜春等城市。分析場景包括:工具

  • 疫情中分析,如:病例接觸了哪些人以及我的的風險分析、高風險羣體分析等;
  • 疫情後分析,如:病毒傳播路徑、病毒變異、抗體等分析。

新型肺炎傳染圖譜網站

本次演示共導入了5類實體數據:包括正常人、病例、地址、交通工具、醫院等數據信息,以及各種實體之間的關聯關係,如「病例乘坐某交通工具」關係。spa

數據導入後效果3d

導入數據詳細介紹以下:code

一、病例數據:共導入了43條病例數據,包括病例的年齡、性別、感染緣由、症狀、確診日期、省市等信息。blog

 

二、地址數據:共導入了32條地址數據,好比「裕華區裕翔社區衛生服務中心」,主要包括上述病例出現過的地址。rem

 

三、交通工具數據:共導入了6條交通工具數據,如高鐵、航班、公交地鐵等信息,主要包括上述病例乘坐過的交通工具。(這個數據較少省市公佈)

 

四、醫院數據:共導入了10條醫院數據,如「北醫科大學第四醫院」,主要包括上述病例收治的醫院。

 

五、「傳染鏈」視圖:共導入了8條傳染數據,如「病例甲傳染了病例乙」,主要包括上述病例和疑似病例的傳染關係。

六、「交通工具鏈」視圖:共導入了8條交通工具乘坐信息數據,好比「病例甲在1月18日乘坐了G310次高鐵」,主要包括上述病例和疑似病例的乘坐關係。

七、「出現於場所」視圖:共導入了9條病例、19條正常人出現的場所地址信息數據,好比「病例甲在1月21日10點到過XX超市」,主要包括上述病例和正常人的出現的地址關係。

八、某個病例關係鏈視圖:除上述關聯關係外,還導入了「感染於」、「現住」、「常住」、「收治於」等關係,主要包括上述病例和疑似病例的各類其它關係。

九、「正常人」數據:共導入了22條正常人數據,包括姓名、年齡、性別、詳細地址等信息;另外還導入了28條正常人的軌跡信息,如「某個正常人在1月19日乘坐過G512次高鐵」、「某個正常人在1月20日10點到過XX超市」。(注意:正常人數據並不許確,僅供演示參考)

到此,數據建模與導入介紹完畢。接下來基於此數據集進行各類分析場景的演示。

2、分析場景演示

場景1:基本統計信息

本場景中包含了7種基本的統計分析,分別是:分析確診病例的城市分佈狀況、病例的省份分佈狀況、病例的確診日期分佈狀況、病例的平均年齡、病例的年齡段分佈狀況等。(注意:這些統計信息僅僅是基於上述導入數據集計算的)

場景2:與確診病例直接接觸過的人(1層關係)

下圖中的3個紅色點表明已確診病例,深藍色點表明正常人,這些人與病例有過接觸,有感染風險:

查詢語句:

g.V().hasLabel('病例') .union(out('乘坐').in('正常乘坐').simplePath(), out('出現於').in('正常出現於').simplePath()) .hasLabel('正常人').path()

注:查詢語句使用的是HugeGraph提供的標準Gremlin圖查詢語言,下同。

場景3:與確診病例間接接觸過的人(2層關係)

下圖中的左上角紅色點表明已確診病例,深藍色點表明正常人,這些正常人與病例有過直接接觸(如田某某),或者間接接觸(其它藍色點,如李某某與田某某在建設大街XX菸酒超市接觸過),均有感染風險:

查詢語句:

g.V().hasLabel('病例') .union( out('乘坐').in('正常乘坐').simplePath().out('正常乘坐').in('正常乘坐').simplePath(), out('出現於').in('正常出現於').simplePath().out('正常出現於').in('正常出現於').simplePath()) .hasLabel('正常人').path()

場景4:某個正常人是否與確診病例直接或間接接觸過

換一個角度,以正常人爲中心來考慮並進行分析。下圖中的左上角藍色點是一個正常人「黃某某」,查看他是否有直接或間接和紅色點所表明的已確診病例關係,從圖中能夠看出,他與病例「sjz0203-21」有直接接觸,且與病例「sjz0202-14」有間接接觸。

查詢語句:

g.V('黃某某').repeat(out('正常乘坐','正常出現於') .in('正常乘坐','正常出現於','乘坐','出現於').simplePath()) .times(2).emit(hasLabel('病例')) .hasLabel('病例').path()

場景5:找出全部的超級傳播者

咱們要從全部的病例裏面找到超級傳播者,這裏假設一個病例若傳染了5個以上的人則定義爲超級傳播者,下圖中心的紅色點「sjz0202-14」病例便是找出來的超級傳播者(傳染了「sjz0202-15」和「sjz0203-21」等5我的)。

查詢語句:

g.V().hasLabel('病例').where(outE('傳染').count().is(gte(5))) .order().by(outE('傳染').count(),desc).limit(10)

場景6:找出超級傳播者接觸過的人(包括已確診病例和正常人)

通常來講,超級傳播者的風險比較高,與超級傳播者接觸過的人風險也是比較高的,下圖展現瞭如何找到這些高風險的人:中心的紅色點是超級傳播者,周圍的紅色點和藍色點所表明的人是高風險的人。

查詢語句:

g.V().hasLabel('病例').where(outE('傳染').count().is(gte(5))) .order().by(outE('傳染').count(),desc).limit(10) .both().choose(hasLabel('病例'),identity(), both('乘坐','出現於','正常乘坐','正常出現於').simplePath()) .path()

場景7:病例傳染鏈分析(如疫情後病毒變異分析)

爲了在疫情後進行病毒變異分析,須要分析一個病例的上游傳染鏈,即某病例是被誰傳染的,上一我的又是被誰傳染的,找到直到源頭,造成一條傳染鏈。有了傳染鏈以後能夠對鏈上的每一個病例的病毒信息進行比對分析(假設每條病例數據裏面存儲了病毒的身份簽名信息)。下圖展現了最左邊的病例「sjz0205-123」的傳染鏈,傳染源頭則是最右邊的病例「sjz0127-9」。

查詢語句:

g.V('sjz0205-123').repeat(__.in('傳染')) .until(__.not(__.in('傳染'))).path()

下一步計算鏈上的病毒變異次數,也就是比對鏈上病例的病毒簽名,計算去重以後病毒的種類數量。以下圖示例中的結果是變異3次。

查詢語句:

g.V('sjz0205-123').repeat(__.in('傳染')) .until(__.not(__.in('傳染'))).path() .unfold().values('病毒').dedup().count()

每一個病例都有一條傳染鏈,爲了分析全部病例的傳染鏈的病毒變異狀況,好比找出變異次數最多的那條鏈,那麼須要先找到全部的傳染鏈,而後計算每條鏈的變異次數,最後比較各條鏈,找出變異次數最多的一條鏈。下圖展現了全部的傳染鏈。

查詢語句:

g.V().hasLabel('病例').repeat(__.in('傳染')) .until(__.not(__.in('傳染'))).path().dedup()

下圖展現了全部傳染鏈的病毒變異次數。

查詢語句:

g.V().hasLabel('病例').repeat(__.in('傳染')).until(__.not(__.in('傳染'))).path().dedup() .project('傳染鏈','變異次數').by(unfold().id().fold()).by(unfold().values('病毒').dedup().count())

場景8:病例傳染環分析

在疫情早中期,對於某個病例來講,隨着病毒傳染更多的人,每每會在該病例的周圍造成一圈一圈的傳染環,好比某病例傳染了3我的,假設被傳染的人又每一個傳染3人,則第一層環上包括3人,第二層環上包含9人。爲了分析某一層環上病例的病毒變異狀況,須要找到該層環上的病例,而後對環上的每一個病例的病毒信息進行比對分析。下圖展現了病例「sjz0127-9」的第一層和第二層傳染環。

查詢語句:

g.V('sjz0127-9').repeat(out('傳染')).times(2).emit().path()

更多場景或者任何問題請反饋至郵箱:javaloveme@gmail.com

相關文章
相關標籤/搜索