在線問診 Python、FastAPI、Neo4j — 創建 節點關係

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章