Sec Hotspot 首页  排行榜  收藏本站  技术博客  RSS
统计信息
已收录文章数量:17788 篇
已收录公众号数量:91 个
本站文章为爬虫采集,如有侵权请告知
已收录微信公众号
阿里云先知 网安寻路人 网信中国 区块链大本营 白说区块链 区块链投资家 区块链官微 区块链铅笔Blockchain HACK学习呀 二道情报贩子 合天智汇 小白帽学习之路 小米安全中心 弥天安全实验室 SAINTSEC SecPulse安全脉搏 TideSec安全团队 360安全卫士 游侠安全网 计算机与网络安全 安全祖师爷 安全学习那些事 腾讯安全联合实验室 黑客技术与网络安全 安全圈 腾讯御见威胁情报中心 Python开发者 Python之禅 编程派 Python那些事 Python程序员 安全威胁情报 吾爱破解论坛 行长叠报 安在 i春秋 嘶吼专业版 E安全 MottoIN 网信防务 网安杂谈 数说安全 互联网安全内参 漏洞战争 安全分析与研究 邑安全 ChaMd5安全团队 天融信阿尔法实验室 安全牛 SecWiki 安全学术圈 信安之路 漏洞感知 浅黑科技 Secquan圈子社区 奇安信集团 奇安信 CERT 国舜股份 雷神众测 盘古实验室 美团安全应急响应中心 瓜子安全应急响应中心 顺丰安全应急响应中心 蚂蚁金服安全响应中心 携程安全应急响应中心 滴滴安全应急响应中心 字节跳动安全中心 百度安全应急响应中心 腾讯安全应急响应中心 网易安全应急响应中心 OPPO安全应急响应中心 京东安全应急响应中心 Bypass CNNVD安全动态 安恒应急响应中心 天融信每日安全简报 奇安信威胁情报中心 看雪学院 黑白之道 水滴安全实验室 安全客 木星安全实验室 云鼎实验室 绿盟科技安全预警 白帽汇 深信服千里目安全实验室 腾讯玄武实验室 长亭安全课堂 FreeBuf 绿盟科技 nmask
Task 3 Neo4j图数据库导入数据
本文来自公众号:网安杂谈   2021.01.14 11:13:58



昨天跑通了整个项目,但细节并不是很了解,第三天的任务,主要是两点:一是把图数据库本身和展示的关系搞清楚;二是把导入部分的代码搞清楚。

一、数据集

源数据存储格式为csv,一共有14337条
字段名称包括:

数据是这样的:

我们对关系型数据库的组织都比较熟悉了,现在要把数据转换成图数据库,直观看就是这样一个效果,图中的圆表示实体,边表示关系,每个实体/关系具有自己的属性。


节点。节点表示对象实例,每个节点有唯一的ID区别其它节点,节点带有属性;
关系。就是图里面的边,连接两个节点,另外这里的关系是有向的并带有属性;
属性。key-value对,存在于节点和关系中,如图所示。

在这个案例中,一共有7种实体类型,在neo4j中用不同颜色表示出来,展示界面中就是那些不同颜色的圆。

实体之间的关系有6种,也就是图里的那些边:


实体的属性
每个实体有自己的属性,比如疾病这种实体(图里面的圆),它有8种属性,如下图所示。

基于特征词分类的方法来识别用户查询意图,当然它也不是很智能

它的回答也确实很让人头疼呀。

二、导入数据代码

先回顾下项目的代码结构


data:存放数据

img:存放readme里的图片

model:存放训练好的tfidf模型和意图识别模型

build_graph.py:构建图,详见task03

entity_extractor.py:抽取问句中的实体和识别意图,详见task04

search_answer.py:根据不同的实体和意图构造cypher查询语句,查询图数据库并返回答案,详见task05


那我们今天的任务就是分析build_grapy.py

主程序非常简洁

if __name__ == "__main__":
handler = MedicalGraph()
handler.create_graphNodes()
handler.create_graphRels()


看来就主要是MedicalGraph()这个主体类。类的结构如下:


分析read_file代码:

def read_file(self):        """        读取文件,获得实体,实体关系        :return:        """        # cols = ["name", "alias", "part", "age", "infection", "insurance", "department", "checklist", "symptom",        #         "complication", "treatment", "drug", "period", "rate", "money"]        # 实体        diseases = []  # 疾病        aliases = []  # 别名        symptoms = []  # 症状        parts = []  # 部位        departments = []  # 科室        complications = []  # 并发症        drugs = []  # 药品

# 疾病的属性:age, infection, insurance, checklist, treatment, period, rate, money diseases_infos = [] # 关系 disease_to_symptom = [] # 疾病与症状关系 disease_to_alias = [] # 疾病与别名关系 diseases_to_part = [] # 疾病与部位关系 disease_to_department = [] # 疾病与科室关系 disease_to_complication = [] # 疾病与并发症关系 disease_to_drug = [] # 疾病与药品关系

all_data = pd.read_csv(self.data_path, encoding='gb18030').loc[:, :].values for data in all_data: disease_dict = {} # 疾病信息 # 疾病 disease = str(data[0]).replace("...", " ").strip() disease_dict["name"] = disease # 别名 line = re.sub("[,、;,.;]", " ", str(data[1])) if str(data[1]) else "未知" for alias in line.strip().split(): aliases.append(alias) disease_to_alias.append([disease, alias]) # 部位 part_list = str(data[2]).strip().split() if str(data[2]) else "未知" for part in part_list: parts.append(part) diseases_to_part.append([disease, part]) # 年龄 age = str(data[3]).strip() disease_dict["age"] = age # 传染性 infect = str(data[4]).strip() disease_dict["infection"] = infect # 医保 insurance = str(data[5]).strip() disease_dict["insurance"] = insurance # 科室 department_list = str(data[6]).strip().split() for department in department_list: departments.append(department) disease_to_department.append([disease, department]) # 检查项 check = str(data[7]).strip() disease_dict["checklist"] = check # 症状 symptom_list = str(data[8]).replace("...", " ").strip().split()[:-1] for symptom in symptom_list: symptoms.append(symptom) disease_to_symptom.append([disease, symptom]) # 并发症 complication_list = str(data[9]).strip().split()[:-1] if str(data[9]) else "未知" for complication in complication_list: complications.append(complication) disease_to_complication.append([disease, complication]) # 治疗方法 treat = str(data[10]).strip()[:-4] disease_dict["treatment"] = treat # 药品 drug_string = str(data[11]).replace("...", " ").strip() for drug in drug_string.split()[:-1]: drugs.append(drug) disease_to_drug.append([disease, drug]) # 治愈周期 period = str(data[12]).strip() disease_dict["period"] = period # 治愈率 rate = str(data[13]).strip() disease_dict["rate"] = rate # 费用 money = str(data[14]).strip() if str(data[14]) else "未知" disease_dict["money"] = money

diseases_infos.append(disease_dict)

return set(diseases), set(symptoms), set(aliases), set(parts), set(departments), set(complications), \ set(drugs), disease_to_alias, disease_to_symptom, diseases_to_part, disease_to_department, \ disease_to_complication, disease_to_drug, diseases_infos