天津某百货大楼内部相继出现 5 例新冠肺炎确诊病例,从起初的 3 个病例来看,彷佛找不到任何流行病学上的关联性。在这种背景之下,做为技术人员能够经过什么技术来找寻病例之间的联系呢?html
最初,nCoV 新冠病毒的扩散过程是由一我的(节点)向各其余人(节点)扩散的树状结构,但随着病毒的变异和人员交叉感染、“百家宴”、“联欢会”、“春运”等人员汇集,疫情扩散为网状结构。可使用图数据库来存储相关人员、地理位置、感染时间等数据,本文将使用图数据库 Nebula Graph 做为工具,带你们一块儿探讨疫情的传播路径,并找到相关的疑似病例。git
下面用 Usr一、Usr二、Usr三、Usr四、Usr5 来代指这 5 例病例,看一下他们的行为轨迹:github
Usr1 信息:数据库
下面咱们来创建一个传播路径的模型。bash
以咱们现有的资料显示,本次 nCoV 的传播路径为人传人(图 Demo1),即一个点经过特定访问路径链接到一个点。单个节点看来传播路径为一个树形结构(图 Demo2)——确诊病人 A 感染 B,B 再感染 C,C 再感染 D…。根据如今疫情传播状况,存在多个确诊病人,因此整个传播链路呈网状结构(图 Demo3)。而不管是树形结构仍是网状结构都很适合用图(网络)这种数据结构来存储、查询和分析。网络
在建模以前咱们须要清楚人和人之间的关系载体是什么?根据现有的病例信息,咱们知道 A 和 B 会的接触场景最多见的是:**同一个时间段逗留在某个相同的空间。**这也是本次疫情筛选需隔离人群的重要指标:是否和确诊 / 疑似病例在酒店、火车、超市有过密切接触。数据结构
可见最小模型中有两类节点 Person
和 Space
,关系为 stay
。最小模型有了,那么咱们须要 Person 和 Space 的什么信息呢?工具
Person 类型节点的属性:大数据
Space 类型节点的属性:人工智能
咱们构建完 Person 和 Space 的模型以后,再构建人和位置之间的关系:
在 stay 关系上,记录有逗留的起始时间和终止时间。这样就能够帮助咱们判断两我的是否有过期间和空间上的交集。
构建完最小模型以后,咱们来分析一下天津病例中的信息,将模型应用在这个案例中。并经过图数据库 Nebula Graph 构建病例间关系、找寻病例1 的发病缘由——病例1 怎么被传染的,及病例1 确诊后咱们须要观察/隔离哪些人?
整个模型的示意以下:
Usr1:
Usr2:
Usr3:
Usr4:
Usr5:
将它导入到 NebulaGraph 中, 创建人和空间之间的关系。这里以 Usr1 的轨迹为例,其他几份病例相似。
-- 插入 Usr1 INSERT VERTEX person(ID, HealthStatus, SickTime) VALUES 1:(2020020201, ‘Sick’, '2020-01-24'); -- 插入 位置 “天津百货大厦 A 区” INSERT VERTEX place(name) VALUES 101:("天津百货大厦 A 区") -- Usr1 到 “天津百货大厦 A 区” INSERT EDGE stay (start_time, end_time) VALUES 1 -> 101: ('2020-01-23 12:00:00', '2020-01-23 18:00:00') -- 插入 位置 “天津市和平区 A 小区” INSERT VERTEX place(name) VALUES 102:("天津市和平区 A 小区") -- Usr1 回家 INSERT EDGE stay (start_time, end_time) VALUES 1 -> 102: ('2020-01-23 18:00:00', '2020-01-24 8:00:00')
数据导入后,让咱们一步步揭开病例1 被感染之谜:
$PlaceUsr1Goto = GO FROM 1 OVER stay WHERE stay.start_time > '2020-01-23 15:00:00' AND stay.start_time < '2020-01-23 23:00:00' YIELD stay._dst AS placeid
GO FROM $PlaceUsr1Goto OVER stay REVERSELY WHERE $$.person.HealthStatus == 'Sick' AND $$.person.SickTime <= "2020-01-23"
很奇怪,在 Usr1 发病的时候(2020-01-24),他接触的人群里面并无发热患者。那会不会是这些人又接触过其余的患者呢(从而成为携带者),让咱们继续分析。
$PersonUsr1Meet = GO FROM $PlaceUsr1Goto OVER stay REVERSELY YIELD stay._dst AS id $PlaceThosePersonGoto = GO FROM $PersonUsr1meet.id OVER stay YIELD stay.start_time AS start stay.end_time AS end GO FROM $PlaceThosePersonGoto.id FROM stay REVERSELY WHERE $$.person.HealthStatus == 'Sick' AND $$.person.SickTime <= "2020-01-23" -- 在此以前已经发病 stay.start_time > $PlaceTHosePersonGoto.start AND stay.end_time < $PlaceThosePersonGoto.end -- 而且有过接触
咱们发现,虽然 Usr1 在 1 月 23 日 12 点到 1 月 24 日 8 点之间接触的人(Usr2, Usr5)都尚未发热,可是 Usr5 却在以前接触过发热病人 Usr4。至此,咱们找到了这条传播链路:
Usr4 在 1 月 21 日发病。发病后,他仍前往天津南开区某火锅店(1 月 23 日 11 点- 20 点)。在这里,他接触到(当时健康的)Usr5(1 月 23 日 11 点-15 点)。在接触过程当中使得 Usr5 成为一个携带者。以后 Usr5 前往天津百货大厦 A、B、C 区( 1 月 23 日 16 - 23 点),在这段时间内,他将病毒传染给在 A 区上班的 Usr1(1 月 23 日 12 点 - 18 点)。最终 Usr1 在 1 月 24 日发病。
Usr1 确诊以后,咱们须要查看她在哪些时候到过哪些地方。而对应这个时间段相同地点内,又有哪些人同她接触。 咱们判断这些亲密接触者,须要重点隔离和观察。
GO FROM 1 OVER stay YIELD stay.start_time AS usr1_start, stay.end_time AS usr1_end, stay._dst AS placeid | GO FROM $placeid OVER stay REVERSELY WHERE stay.start_time > usr1_start AND stay.start_time < usr1_end YIELD $$.person.ID
能够发现 Usr1 和 Usr2 在天津市和平区 A 小区有过交集,这使得 Usr2 须要被重点观察。
上面这段分析过程,也可使用图形化界面的方式来交互分析,这样更加直观。
固然,若是有很是大批量的关注点(例如上千万离开湖北的潜在人员和他们的二次三次传播轨迹),经过批量程序查询的方式会更加高效。
因为春节返乡和一些不可描述的影响,致使冠状病毒的大面积扩散。从报道和社交媒体上能够看到,各个社区、村庄、企业都采用了至关严格的隔离措施,要求我的每日汇报行踪和健康状态,并密切跟踪从疫区来的人员。这样十几亿人的隔离和追踪须要极大的人力物力和动员能力,充分体现了“集中力量办大事”的制度优越性。
但另一方面,这样的自我申报和层层统计,很是依赖我的的自觉,也依赖于汇报体系的响应速度。特别是当生死攸关(或者一刀切的歧视政策)的时候,我的反而有很强的动机隐瞒过去的行为和病史,致使未能获得及时的隔离和救治,也极大的影响了须要专业分工合做的现代经济生产活动。
另一方面,随着大数据技术的发展和智能设备的普及,使得安防、运营商、交通、医疗部门的数据体系已经创建的较为全面。
在天津这个案例中,只选取了少数几个病例和场所做为示意,咱们相信若是可以结合前述数据体系,并经过采用新的大数据和人工智能技术,可以极大提升定位和隔离疑似患者的速度,大大减小各类“有效人传人”和“超级毒王”的发生,减小一线医疗和社区工做人员的压力。也能下降全社会的全面隔离时间,尽快恢复经济活动。