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

在线,问诊,python,fastapi,neo4j,生成,cypher,语句 · 浏览次数 : 51

小编点评

**目录构建节点字典** 该函数用于构建一个包含匹配节点的字典,用于拼成 Cypher CQL 语句。 ```python def build_nodedict(self, args): """ 构建节点字典 :param args: {'看东西 Sometimes Clear Sometimes Unclear': ['symptom']} :return: 组装成 => {'symptom': '看东西 Sometimes Clear Sometimes Unclear'} """ node_dict = {} for arg, types in args.items(): for type in types: if type not in node_dict: node_dict[type] = [arg] else: node_dict[type].append(arg) return node_dict ``` **构建 Cypher CQL 语句** ```python # 查询症状会导致哪些疾病 sql = [ "MATCH (m:Disease)-[r:has_symptom]->(n:Symptom) where n.name = '{0}' return m.name, r.name, n.name\".format(i) for i in entities] # 查询症状会导致哪些疾病 sql = [ "MATCH (m:Disease)-[r:has_symptom]->(n:Symptom) where n.name = '{0}' return m.name, r.name, n.name\".format(i) for i in entities ] # 查询疾病常用药品-药品别名记得扩充 sql = [ "MATCH (m:Disease)-[r:used_drugs]->(n:Drug) where m.name = '{0}' return m.name, r.name, n.name\".format(i) for i in entities ] # 查询疾病的忌口 sql = [ "MATCH (m:Disease)-[r:noteat_foods]->(n:Foods) where m.name = '{0}' return m.name, r.name, n.name\".format(i) for i in entities ] ``` **测试示例** ```python # 输入question_class = {'args': {'看东西 Sometimes Clear Sometimes Unclear': ['symptom']}, 'question_types': ['symptom_disease']} cql = handler.parser_main(question_class) # 打印CQL语句 print(cql) ``` **输出** ``` [ {'question_type': 'symptom_disease', 'sql': "MATCH (m:Disease)-[r:has_symptom]->(n:Symptom) where n.name = '看东西 Sometimes Clear Sometimes Unclear' return m.name, r.name, n.name"} ] ```

正文


这边只是为了测试,演示效果和思路,实际应用中,可以通过NLP构建CQL
接上一篇的问题分类

question = "请问最近看东西有时候清楚有时候不清楚是怎么回事"
# 最终输出
data = {'args': {'看东西有时候清楚有时候不清楚': ['symptom']}, 'question_types': ['symptom_disease']}

question = "干眼常用药有哪些"
# 最终输出
data = {'args': {'干眼': ['disease']}, 'question_types': ['disease_drug']}

question = "干眼哪些不能吃"
data = {'args': {'干眼': ['disease']}, 'question_types': ['disease_not_food']}

构建节点字典

目的,为了拼CQL,查出符合条件的节点详情

def build_nodedict(self, args):
    """
    构建节点字典
    :param args: {'看东西有时候清楚有时候不清楚': ['symptom']}
    :return: 组装成 => {'symptom': '看东西有时候清楚有时候不清楚'}
    """
    node_dict = {}
    for arg, types in args.items():
        for type in types:
            if type not in node_dict:
                node_dict[type] = [arg]
            else:
                node_dict[type].append(arg)
    return node_dict
# 输入:
{'看东西有时候清楚有时候不清楚': ['symptom']}
# 输出:
{'symptom': ['看东西有时候清楚有时候不清楚']}

构建Cypher CQL语句

# 查询症状会导致哪些疾病
if question_type == 'symptom_disease':
    sql = ["MATCH (m:Disease)-[r:has_symptom]->(n:Symptom) where n.name = '{0}' return m.name, r.name, n.name".format(i) for i in entities]

# 查询症状会导致哪些疾病
if question_type == 'symptom_disease':
    sql = ["MATCH (m:Disease)-[r:has_symptom]->(n:Symptom) where n.name = '{0}' return m.name, r.name, n.name".format(i) for i in entities]

# 查询疾病常用药品-药品别名记得扩充
if question_type == 'disease_drug':
    sql = ["MATCH (m:Disease)-[r:used_drugs]->(n:Drug) where m.name = '{0}' return m.name, r.name, n.name".format(i) for i in entities]


# 查询疾病的忌口
if question_type == 'disease_not_food':
    sql = ["MATCH (m:Disease)-[r:noteat_foods]->(n:Foods) where m.name = '{0}' return m.name, r.name, n.name".format(i) for i in entities]

node_dict.get('symptom')

Test

if __name__ == '__main__':
    handler = QuestionPaser()
    question_class = {'args': {'看东西有时候清楚有时候不清楚': ['symptom']}, 'question_types': ['symptom_disease']}
    cql = handler.parser_main(question_class)
    print(cql)

输出:

# 输入
question_class = {'args': {'看东西有时候清楚有时候不清楚': ['symptom']}, 'question_types': ['symptom_disease']}
# 输出
[{'question_type': 'symptom_disease', 'sql': ["MATCH (m:Disease)-[r:has_symptom]->(n:Symptom) where n.name = '看东西有时候清楚有时候不清楚' return m.name, r.name, n.name"]}]

# 输入:
question_class = {'args': {'干眼': ['disease']}, 'question_types': ['disease_drug']}
# 输出: 
[{'question_type': 'disease_drug', 'sql': ["MATCH (m:Disease)-[r:used_drugs]->(n:Drug) where m.name = '干眼' return m.name, r.name, n.name"]}]

# 输入:
question_class = {'args': {'干眼': ['disease']}, 'question_types': ['disease_not_food']}
# 输出:
[{'question_type': 'disease_not_food', 'sql': ["MATCH (m:Disease)-[r:noteat_foods]->(n:Foods) where m.name = '干眼' return m.name, r.name, n.name"]}]

image

后面根据 生成的 CQL语句,查询出知识图谱中对应的数据,

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

与在线问诊 Python、FastAPI、Neo4j — 生成 Cypher 语句相似的内容:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

在线问诊 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 — 构建问题分类器

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

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

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