在线问诊 Python、FastAPI、Neo4j — 创建 节点关系

在线,问诊,python,fastapi,neo4j,创建,节点,关系 · 浏览次数 : 62

小编点评

**关系定义:** * **症状-检查关系:** 症状是检查结果,检查结果是症状。 * **疾病-症状代码重构relationship_data.csv症状,检查,疾病、药品、宜吃,忌吃:** 代码重构关系,将症状和检查结果作为实体进行存储。 **代码重构:** ```python def generate_examine(): # ... def generate_cql(start_node, end_node, edges, rel_type, rel_name): # ... def create_relationship(l_node, r_node, relationship, l_data_name, r_data_name, relation_name): # ... ``` **关系关系检查:** ```python def relationship_relation_check(): # ... ``` **疾病症状关系检查:** ```python def relationship_has_symptom(): # ... ``` **疾病常用药物关系检查:** ```python def relationship_used_drugs(): # ... ``` **推荐饮食关系检查:** ```python def relationship_doeat_foods(): # ... ``` **不宜饮食关系检查:** ```python def relationship_noteat_foods(): # ... ```

正文

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)

image

关系:疾病-症状

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

image

代码重构

包括疾病用药,食物能吃,食物不能吃的关系。
详细代码如下

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()

image

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

与在线问诊 Python、FastAPI、Neo4j — 创建 节点关系相似的内容:

在线问诊 Python、FastAPI、Neo4j — 创建 节点关系

目录关系:症状-检查关系:疾病-症状代码重构 relationship_data.csv 症状,检查,疾病,药品,宜吃,忌吃 "上下楼梯疼,不能久站,感觉有点肿","膝关节核磁","右膝髌上囊及关节腔少量积液","扶他林","西红柿,香蕉","辣椒,大蒜" "眼睛胀痛,干涩,畏光,眼胀,眼痛,看东西

在线问诊 Python、FastAPI、Neo4j — 创建 疾病节点

目录疾病数据创建节点 根据检查结果、医生的临床经验得出疾病 疾病数据 disease_data.csv 建议值用“”引起来。避免中间有,号造成误识别 疾病 "干眼" "右膝髌上囊及关节腔少量积液" 创建节点 import logging import pandas as pd from utils.

在线问诊 Python、FastAPI、Neo4j — 创建症状节点

目录症状数据创建节点附学习 电子病历中,患者主诉对应的相关检查,得出的诊断以及最后的用药情况。症状一般可以从主诉中提取。 症状数据 symptom_data.csv CSV 中,没有直接一行一个症状,主要想后面将 症状 => 疾病 做关联,最后会在一个 Excel 中表达 所以每行实际对应一个症病,

在线问诊 Python、FastAPI、Neo4j — 创建药品节点

目录前提条件创建节点 Demo准备数据创建药品标签节点 在线问诊 Python、FastAPI、Neo4j — 创建节点 Neo4j 节点的标签可以理解为 Java 中的实体。 根据常规流程:首先有什么症状,做哪些对应的检查,根据检查诊断什么疾病,需要用什么药物治疗,服药期间要注意哪些饮食,需要做哪

在线问诊 Python、FastAPI、Neo4j — 创建 检查节点

目录检查数据创建节点 根据不同的症状,会建议做些相对应的检验、检查 检查数据 examine_data.csv 建议值用“”引起来。避免中间有,号造成误识别 检查 "膝关节核磁" "眼睛酸胀" "视力" "砂眼" "辨色力" "角膜" "眼底" 创建节点 参考 创建药品 节点。 import log

在线问诊 Python、FastAPI、Neo4j — 创建 饮食节点

目录饮食数据创建节点 根据疾病、症状,判断出哪些饮食不能吃,哪些建议多吃 饮食数据 foods_data.csv 建议值用“”引起来。避免中间有,号造成误识别 饮食 "辣椒" "大蒜" "芥末" "海鲜" "胡萝卜" "核桃仁" "菠菜" "西红柿" "香蕉" 创建节点 重构代码,将 def exe

在线问诊 Python、FastAPI、Neo4j — 提供咨询接口服务

目录构建服务层接口路由层PostMan 调用 采用 Fast API 搭建服务接口: https://www.cnblogs.com/vipsoft/p/17684079.html Fast API 文档:https://fastapi.tiangolo.com/zh/ 构建服务层 qa_servi

在线问诊 Python、FastAPI、Neo4j — 问题咨询

目录查出节点拼接节点属性测试结果问答演示 通过节点关系,找出对应的节点,获取节点属性值,并拼接成想要的结果。 接上节生成的CQL # 输入 question_class = {'args': {'看东西有时候清楚有时候不清楚': ['symptom']}, 'question_types': ['s

在线问诊 Python、FastAPI、Neo4j — 生成 Cypher 语句

目录构建节点字典构建Cypher CQL语句Test 这边只是为了测试,演示效果和思路,实际应用中,可以通过NLP构建CQL 接上一篇的问题分类 question = "请问最近看东西有时候清楚有时候不清楚是怎么回事" # 最终输出 data = {'args': {'看东西有时候清楚有时候不清楚'

在线问诊 Python、FastAPI、Neo4j — 构建问题分类器

目录构建字典数据构建 Trie 字典树按实体组装字典问题分析 将问题进行分析,和系统已有的分类进行关联 构建字典数据 将构建的知识图片字典化, 用于后面对问题的解析,下图为症状的字典,其它字典同理 构建 Trie 字典树 将建字典数据,组装集合 cur_dir = '/'.join(os.path.