新冠肺炎传染图谱建模与分析
一、背景与数据来源介绍
新型肺炎作为一种存在潜伏期的传染病,分析其传染关系及接触关系非常有利于疫情的防控,对疫后的研究分析也有帮助。本文将介绍基于图数据库对新型肺炎图谱进行建模与分析的过程及效果。
图数据库(Graph Database)是一种复杂关系数据的处理系统,一种使用顶点、边和属性来表示与存储数据,并以图结构进行语义查询的数据库。图数据库的关键概念是边,通过边将顶点连接在一起,从而进行快速的图检索操作。
图数据库非常适合用于分析此类关联关系数据,此次使用百度开源的HugeGraph图数据库作为分析工具。分析数据数据均来源于各地卫健委或权威网站公开公布,如北京、石家庄、温州、南昌、宜春等城市。分析场景包括:
- 疫情中分析,如:病例接触了哪些人以及个人的风险分析、高风险群体分析等;
- 疫情后分析,如:病毒传播路径、病毒变异、抗体等分析。
新型肺炎传染图谱
本次演示共导入了5类实体数据:包括正常人、病例、地址、交通工具、医院等数据信息,以及各类实体之间的关联关系,如“病例乘坐某交通工具”关系。
数据导入后效果
导入数据详细介绍如下:
1、病例数据:共导入了43条病例数据,包括病例的年龄、性别、感染原因、症状、确诊日期、省市等信息。
2、地址数据:共导入了32条地址数据,比如“裕华区裕翔社区卫生服务中心”,主要包括上述病例出现过的地址。
3、交通工具数据:共导入了6条交通工具数据,如高铁、航班、公交地铁等信息,主要包括上述病例乘坐过的交通工具。(这个数据较少省市公布)
4、医院数据:共导入了10条医院数据,如“北医科大学第四医院”,主要包括上述病例收治的医院。
5、“传染链”视图:共导入了8条传染数据,如“病例甲传染了病例乙”,主要包括上述病例和疑似病例的传染关系。
6、“交通工具链”视图:共导入了8条交通工具乘坐信息数据,比如“病例甲在1月18日乘坐了G310次高铁”,主要包括上述病例和疑似病例的乘坐关系。
7、“出现于场所”视图:共导入了9条病例、19条正常人出现的场所地址信息数据,比如“病例甲在1月21日10点到过XX超市”,主要包括上述病例和正常人的出现的地址关系。
8、某个病例关系链视图:除上述关联关系外,还导入了“感染于”、“现住”、“常住”、“收治于”等关系,主要包括上述病例和疑似病例的各种其它关系。
9、“正常人”数据:共导入了22条正常人数据,包括姓名、年龄、性别、详细地址等信息;另外还导入了28条正常人的轨迹信息,如“某个正常人在1月19日乘坐过G512次高铁”、“某个正常人在1月20日10点到过XX超市”。(注意:正常人数据并不准确,仅供演示参考)
到此,数据建模与导入介绍完毕。接下来基于此数据集进行各种分析场景的演示。
二、分析场景演示
场景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
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
是时候该开始读一读JDK源码了
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 为什么要读JDK源码 当然不是为了装,毕竟谁没事找事虐自己 ... 1、面试跑不掉。现在只要面试Java相关的岗位,肯定或多或少会会涉及JDK源码相关的问题。 2、弄懂原理才不慌。我们作为JDK的使用者,虽然说天天用得很开心,但是有时候遇到问题还是得跟到底层源码去看看,才能帮助我们更好的弄懂原理, 3、学习优秀的代码、思想和模式。JDK毕竟是一个优秀的代码库,我们天天用,源码也就在里面,作为一个有志向的程序员,读一读源码也能让我们吸取到更多优秀的思想和模式。 4、睡前催眠。额 …… 不过的确有效(滑稽)。 源码难吗? 废话,当然有难度啦,不然我也不会到现在都还没看完,而且看了也经常忘,哭唧唧... 毕竟像JDK这种源码,和我们平常练手写小例子、写业务代码不一样,人家毕竟是 类库,为了性能、稳定性、通用性,扩展性等因素考虑,加入了很多辅助代码、泛型、以及一些设计模式上的考量,所以看起来肯定没有那么轻松,**没办法一眼看穿它。**所以这玩意儿肯定是一个长期的过程,我个人建议(包括我自己也是这...
- 下一篇
nginx搭建及加固
系统使用的是centos7 Nginx安装及配置 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务 安装 我是用的环境是centos 7,系统默认的yum源没有nginx,找到一个使用nginx官方源地址 首先建立nginx的yum仓库,执行下面的命令 sudo rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm 可以看到已经添加上了nginx的源,下面就是下载安装了 下载安装命令也很简单 sudo yum install -y nginx 安装成功^_^ 查看官方安装文档(https://www.nginx.com/resources/wiki/start/topics/tutorials/install/)上的源不一样,不过都是一样的建立本地yum仓库 启动nginx服务 service nginx start 默认是80端口,但测试访问发现并不能进入欢迎页面,...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker快速安装Oracle11G,搭建oracle11g学习环境