relationship_data.csv

症状,检查,疾病,药品,宜吃,忌吃
"上下楼梯疼,不能久站,感觉有点肿","膝关节核磁","右膝髌上囊及关节腔少量积液","扶他林","西红柿,香蕉","辣椒,大蒜"
"眼睛胀痛,干涩,畏光,眼胀,眼痛,看东西有时候清楚有时候不清楚","视力,眼底","干眼","施图伦","胡萝卜,核桃仁,菠菜","海鲜,芥末"

关系:症状-检查

def generate_examine() -> list:
"""
关系:疾病-检查
"""
rels_check = []
df = pd.read_csv('relationship_data.csv')
for idx, row in df.iterrows():
for symptom in row['检查'].split(','):
for exam in row['症状'].split(','):
rels_check.append([exam, symptom])
rels_check = deduplicate(rels_check)
return rels_check def relationship_rels_check():
"""
# 创建关系
match(p:Symptom),(q:Examine) where p.name='上下楼梯疼' and q.name='膝关节核磁' create (p)-[rel:need_check{name:'症状检查'}]->(q) # 删除关系
MATCH(p: Symptom)-[r: need_check]-(q:Examine)
WHERE p.name = '上下楼梯疼' and q.name = '膝关节核磁'
DELETE r
"""
cql = "MATCH(p:Symptom)-[r:need_check]-(q:Examine) DELETE r"
neo4j.execute_write(cql)
print("删除成功 => need_check")
# 症状 需要 做哪些检查
rels_check = generate_examine()
print(rels_check)
cql_list = generate_cql('Symptom', 'Examine', rels_check, 'need_check', '症状检查')
for cql in cql_list:
neo4j.execute_write(cql)
print(cql)

关系:疾病-症状

def generate_symptom() -> list:
"""
关系:疾病-症状 (疾病有哪些症状)
"""
rels_check = []
df = pd.read_csv('relationship_data.csv')
for idx, row in df.iterrows():
for symptom in row['症状'].split(','):
for exam in row['疾病'].split(','):
rels_check.append([exam, symptom])
rels_check = deduplicate(rels_check)
return rels_check

代码重构

包括疾病用药,食物能吃,食物不能吃的关系。

详细代码如下

import logging
from utils.neo4j_provider import neo4j
import pandas as pd logging.root.setLevel(logging.INFO) # 关系去重函数
def deduplicate(relation_old) -> list:
relation_new = []
for each in relation_old:
if each not in relation_new:
relation_new.append(each)
return relation_new def generate_cql(start_node, end_node, edges, rel_type, rel_name) -> str:
"""
生成 CQL
"""
cql = []
for edge in edges:
p = edge[0]
q = edge[1]
# 创建关系的 Cypher 语句
cql.append(
"MATCH(p:%s),(q:%s) WHERE p.name='%s' and q.name='%s' CREATE (p)-[rel:%s{name:'%s'}]->(q)" % (start_node, end_node, p, q, rel_type, rel_name))
print('创建关系 {}-{}->{}'.format(p, rel_type, q))
return cql def generate_relation(l_name, r_name) -> list:
relation_list = []
df = pd.read_csv('relationship_data.csv')
for idx, row in df.iterrows():
for l_node in row[l_name].split(','):
for r_node in row[r_name].split(','):
relation_list.append([l_node, r_node])
return deduplicate(relation_list) def create_relationship(l_node, r_node, relationship, l_data_name, r_data_name, relation_name):
"""
创建关系
:param l_node: 左节点 name
:param r_node: 右节点 name
:param relationship: 关系
:param l_data_name: 左数据列名
:param r_data_name: 右数据列名
:param relation_name: 关系 name
:return:
"""
neo4j.delete_relationship(l_node, r_node, relationship) relation_list = generate_relation(l_data_name, r_data_name)
print(relation_list) cql_list = generate_cql(l_node, r_node, relation_list, relationship, relation_name)
for cql in cql_list:
neo4j.execute_write(cql)
print(cql) def relationship_relation_check():
l_node = "Symptom"
r_node = "Examine"
relationship = "need_check"
l_data_name = '症状'
r_data_name = '检查'
rel_name = '症状检查'
create_relationship(l_node, r_node, relationship, l_data_name, r_data_name, rel_name) def relationship_has_symptom():
l_node = "Disease"
r_node = "Symptom"
relationship = "has_symptom"
l_data_name = '疾病'
r_data_name = '症状'
rel_name = '症状'
create_relationship(l_node, r_node, relationship, l_data_name, r_data_name, rel_name) def relationship_used_drugs():
l_node = "Disease"
r_node = "Drug"
relationship = "used_drugs"
l_data_name = '疾病'
r_data_name = '药品'
rel_name = '常用药品'
create_relationship(l_node, r_node, relationship, l_data_name, r_data_name, rel_name) def relationship_doeat_foods():
l_node = "Disease"
r_node = "Foods"
relationship = "doeat_foods"
l_data_name = '疾病'
r_data_name = '宜吃'
rel_name = '推荐食物'
create_relationship(l_node, r_node, relationship, l_data_name, r_data_name, rel_name) def relationship_noteat_foods():
l_node = "Disease"
r_node = "Foods"
relationship = "noteat_foods"
l_data_name = '疾病'
r_data_name = '忌吃'
rel_name = '忌吃食物'
create_relationship(l_node, r_node, relationship, l_data_name, r_data_name, rel_name) if __name__ == "__main__":
# 有症状需要做哪些检查
relationship_relation_check() # 疾病有哪些症状
relationship_has_symptom() # 疾病常用药物
relationship_used_drugs() # 推荐饮食
relationship_doeat_foods() # 不宜饮食
relationship_noteat_foods()

源代码地址:https://gitee.com/VipSoft/VipQA

在线问诊 Python、FastAPI、Neo4j — 创建 节点关系的更多相关文章

  1. python 查询Neo4j多节点的多层关系

    需求:查询出满足3人及3案有关系的集合 # -*- coding: utf-8 -*- from py2neo import Graph import psycopg2 # 二维数组查找 def fi ...

  2. python将知识图谱的节点关系(CSV或其他格式)转换成Echarts所需的json格式

    python将知识图谱的节点关系(CSV或其他格式)转换成Echarts所需的json格式 前言: 1. 此代码以如下(CSV)格式的数据为例, 故事 时间 地点 人物 xx 2020 安徽合肥 小戈 ...

  3. Eclipse下maven使用嵌入式(Embedded)Neo4j创建Hello World项目

    Eclipse下maven使用嵌入式(Embedded)Neo4j创建Hello World项目 新建一个maven工程,这里不赘述如何新建maven工程. 添加Neo4j jar到你的工程 有两种方 ...

  4. Neo4j创建自动索引

    一.创建Neo4j的Legacy indexing 1.为节点创建索引 官方API的创建示例为: 将一节点添加至索引: public static void AddNodeIndex(String n ...

  5. Python网络数据采集- 创建爬虫

    1. 初见网络爬虫 1.1 网络连接 输出某个网页的全部 HTML 代码. urllib 是 Python 的标准库(就是说你不用额外安装就可以运行这个例子),包含了从网络请求数据,处理 cookie ...

  6. jacascript DOM节点——节点关系与操作

    前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 节点关系 DOM可以将任何HTML描绘成一个由多层节点构成的结构.每个节点都拥有各自的特点.数据和方法,也 ...

  7. python之multiprocessing创建进程

    python的multiprocessing模块是用来创建多进程的,下面对multiprocessing总结一下使用记录. multiprocessing创建多进程在windows和linux系统下的 ...

  8. neo4j 将一个节点的属性复制到另一个节点上

    在使用Python操作Neo4j数据库的时候,经常会遇到重复的节点,需要将一个节点的属性复制到另一个节点,之后将该节点删除. def copy_node_properties(source_node_ ...

  9. Python | 面试必问,线程与进程的区别,Python中如何创建多线程?

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题第20篇文章,我们来聊聊Python当中的多线程. 其实关于元类还有很多种用法,比如说如何在元类当中设置参数啦,以及一 ...

  10. 深入理解DOM节点关系

    × 目录 [1]父级属性 [2]子级属性 [3]同级属性[4]包含方法[5]关系方法 前面的话 DOM可以将任何HTML描绘成一个由多层节点构成的结构.节点分为12种不同类型,每种类型分别表示文档中不 ...

随机推荐

  1. JUC同步锁原理源码解析二--ReentrantReadWriteLock

    JUC同步锁原理源码解析二----ReentrantReadWriteLock 1.读写锁的来源 ​ 在开发场景下,对于写操作我们为了保证原子性所以需要上锁,但是对于读操作,由于其不改变数据,只是单纯 ...

  2. 【对比】ChatGPT Plus与ChatGPT实操对比体验

    前言 缘由 20美刀大洋充值ChatGPT Plus,必须分享让它物尽其用 应单位追求科技前沿需求,以及花钱就是香的原则.遂找了远在他乡的高中老同学,斥资20美刀为公司身先士卒怒充会员.秉承分享至上原 ...

  3. 从RDD创建DataFrame

    0.前次作业:从文件创建DataFrame 1.pandas df 与 spark df的相互转换     df_s=spark.createDataFrame(df_p)     df_p=df_s ...

  4. 计算机网络那些事之 MTU 篇

    哈喽大家好,我是咸鱼 今天我们来聊聊计算机网络中的 MTU (Maximum Transmission Unit) 什么是 MTU ? MTU(Maximum Transmission Unit)是指 ...

  5. 写博文之必备技能MarkDown

    前言 Markdown是一种轻量级标记语言,排版语法简洁,让人们更多地关注内容本身而非排版.它使用易读易写的纯文本格式编写文档,可与HTML混编,可导出 HTML.PDF 以及本身的 .md 格式的文 ...

  6. Selenium:设置元素等待、上传文件、下载文件

    前言:在工作和学习selenium自动化过程中记录学习知识点,深化知识点 1. 设置元素等待 元素定位之元素等待-- WebDriver提供了两种类型的等待:显示等待和隐式等待. 1.1 显示等待 显 ...

  7. IoTOS v1.0.0 开源 高效 实用 | 免费商用

    IoTOS v1.0.0 一款高效实用 IoTCard 管理 & 运营系统. IoTOS 目前取名范围过大,其主要用于IoTCard 管理业务以高效.健壮.灵活设计 SaaS.多语言.机器人推 ...

  8. 【websocket】小白快速上手flask-socketio

    大家好,我是一个初级的Python开发工程师.本文是结合官方教程和代码案例,简单说下我对flask-socketio的使用理解. 一.websocket简介 websocket 说白一点就是,建立客户 ...

  9. 【Python】数据可视化利器PyCharts在测试工作中的应用

    PyCharts 简介 PyCharts 是一个基于 Python 的数据可视化库,它支持多种图表类型,如折线图.柱状图.饼图等.PyCharts 提供了简洁的 API,使得用户能够轻松地创建各种图表 ...

  10. 巧用 nc 命令传输文件

    今天在业务上云的时候,遇到了些问题.最终发现问题的根源不好排查,于是-- 把生产环境的全量配置文件,还有日志全量打包下载到开发机器分析! 刚入职不是很久的整个运维团队,也不是很熟悉生产环境(有时候觉得 ...