尽管目前世界上大多数国家都在半封锁状态、以减慢致命的COVID-19病毒的传播,但寻找治愈方法的斗争从未停止。赢得这场前所未有的反病毒战争的关键很大程度上取决如何利用现有的数据来确定感染源、了解病毒如何传播以及保护社区免受感染。到目前为止,接触史追踪(Contact Tracing)已被认为是遏制情况恶化的最有效方法之一。
时机至关重要。
政府,组织甚至个人都需要一种追踪高风险患者和地点的方法。每天发布的确诊病例数量还远远不够。能够将那些确诊案例的详细信息包括何人、何时、何地以及传播途径等联系起来的能力比以往任何时候都更加重要,只有这样才能提供及时和可行的反应和预测。显然,这是图数据库解决方案的一个完美的问题。
基于Neo4j社区和相关政府机构的一些想法,使用公开可用的案例数据(不包含身份信息),我用周四花了一个晚上的时间使用Neo4j Bloom构建此解决方案,以帮助回答(是的,以自然语言)接触史追踪的关键问题。以下是具体的方法。
1.加载数据
为了深入了解病毒如何在人群中传播,我们需要个别的病例数据,而不是病例统计。实际上,Kaggle发起的COVID-19挑战赛提供这样的个别案例数据,可在此处找到:UNCOVER COVID-19挑战赛1
我也在Github上分享了本项目,可以找到2个数据文件。个例文件的布局不难理解,以下是Cypher LOAD CSV语句,可将数据加载到Neo4j中:
// 1.1 Load individual case data of Canada file by Kaggle
USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS FROM 'file:///individual-level-cases.csv' AS line
MERGE (p:State:Canada
{name:line.province})
CREATE (c:Case:Canada
{caseId:line.case_id})
SET c.ageGroup = line.age, c.healthRegion = line.health_region, c.reportDate = line.date_report,
c.acquireMethod = line.locally_acquired, c.acquireSource = line.travel_history_country, c.source = line.case_source,
c.sex = line.sex, c.state= line.province, c.community = line.community,
c.linkedCase = line.linked_case
MERGE (c) -[:LIVES_IN]-> (p)
WITH c,p,split(line.travel_history_country,',') AS places
UNWIND places AS place
MERGE (pl:Place{name:trim(place)})
MERGE (c) -[:HAS_VISITED]-> (pl)
// 1.2 Load indivudual case file of Kore