通过节点关系,找出对应的节点,获取节点属性值,并拼接成想要的结果。

接上节生成的CQL

  1. # 输入
  2. question_class = {'args': {'看东西有时候清楚有时候不清楚': ['symptom']}, 'question_types': ['symptom_disease']}
  3. # 输出
  4. [{'question_type': 'symptom_disease', 'sql': ["MATCH (m:Disease)-[r:has_symptom]->(n:Symptom) where n.name = '看东西有时候清楚有时候不清楚' return m.name, r.name, n.name"]}]
  5. # 输入:
  6. question_class = {'args': {'干眼': ['disease']}, 'question_types': ['disease_drug']}
  7. # 输出:
  8. [{'question_type': 'disease_drug', 'sql': ["MATCH (m:Disease)-[r:used_drugs]->(n:Drug) where m.name = '干眼' return m.name, r.name, n.name,n.usage_dosage,n.generic_name,n.contraindications"]}]
  9. # 输入:
  10. question_class = {'args': {'干眼': ['disease']}, 'question_types': ['disease_not_food']}
  11. # 输出:
  12. [{'question_type': 'disease_not_food', 'sql': ["MATCH (m:Disease)-[r:noteat_foods]->(n:Foods) where m.name = '干眼' return m.name, r.name, n.name"]}]

查出节点

  1. def search_main(self, sqls):
  2. """执行cypher查询,并返回相应结果"""
  3. final_answers = []
  4. for sql_ in sqls:
  5. question_type = sql_['question_type'] # 'question_type': 'symptom_disease'
  6. queries = sql_['sql'] # 'sql': ["MATCH (m:Disease)-[r:has_symptom]->(n:Symptom) where n.name = '看东西有时候清楚有时候不清楚' return m.name, r.name, n.name"]
  7. answers = []
  8. for cql in queries:
  9. ress = neo4j.execute_query(cql) # logging.info("%s, %s", record["p"]["name"], record["p"]["generation"])
  10. answers += ress
  11. final_answer = self.answer_prettify(question_type, answers)
  12. if final_answer:
  13. final_answers.append(final_answer)
  14. return final_answers

拼接节点属性

  1. def answer_prettify(self, question_type, answers):
  2. if question_type == 'symptom_disease':
  3. desc = [i['m.name'] for i in answers]
  4. subject = answers[0]['n.name']
  5. final_answer = '{0}可能是:{1}'.format(subject, ';'.join(list(set(desc))[:self.num_limit]))
  6. if question_type == 'disease_drug':
  7. desc = []
  8. for i in answers:
  9. desc.append(i['n.name'] + "(" + i['n.generic_name'] + ")" + " 【用法用量】:" + i['n.usage_dosage'] + " 【禁忌】:" + i['n.contraindications'])
  10. subject = answers[0]['m.name']
  11. final_answer = '{0}一般可以用:{1}'.format(subject, ';'.join(list(set(desc))[:self.num_limit]))
  12. if question_type == 'disease_not_food':
  13. desc = [i['n.name'] for i in answers]
  14. subject = answers[0]['m.name']
  15. final_answer = '{0}忌食的食物包括有:{1}'.format(subject, ';'.join(list(set(desc))[:self.num_limit]))

测试结果

  1. searcher = AnswerSearcher()
  2. # 根据 症状描述 查出 对应的疾病
  3. sqls = [{'question_type': 'symptom_disease',
  4. 'sql': ["MATCH (m:Disease)-[r:has_symptom]->(n:Symptom) where n.name = '看东西有时候清楚有时候不清楚' return m.name, r.name, n.name"]}]
  5. answer = searcher.search_main(sqls)
  6. print(answer)
  7. # 根据 疾病 查出 常用药品
  8. sqls = [{'question_type': 'disease_drug', 'sql': [
  9. "MATCH (m:Disease)-[r:used_drugs]->(n:Drug) where m.name = '干眼' return m.name, r.name, n.name,n.usage_dosage,n.generic_name,n.contraindications"]}]
  10. answer = searcher.search_main(sqls)
  11. print(answer)
  12. # 根据 药品 查出 给出饮食建议
  13. sqls = [{'question_type': 'disease_not_food', 'sql': ["MATCH (m:Disease)-[r:noteat_foods]->(n:Foods) where m.name = '干眼' return m.name, r.name, n.name"]}]
  14. answer = searcher.search_main(sqls)
  15. print(answer)
  1. ['看东西有时候清楚有时候不清楚可能是:干眼']
  2. ['干眼一般可以用:施图伦(七叶洋地黄双苷滴眼液) 【用法用量】:黄斑变性:每日3次,每次1滴,滴入眼结膜囊内(近耳侧外眼角)。\n眼疲劳:每日3次,每次1滴,滴入眼结膜囊内(近耳侧外眼角),延续1周或至病情好转,建议每日2次,每次1滴。 【禁忌】:对制剂中活性成份或其它任一成份过敏者禁用。']
  3. ['干眼,下列食物不要吃:芥末;海鲜']

问答演示

  1. if __name__ == '__main__':
  2. print("VipQA:您好,我是人工智能助理,希望可以帮到您")
  3. handler = ChatBotGraph()
  4. while 1:
  5. colorama.init()
  6. question = input(Fore.WHITE + '用户:') # 请问最近看东西有时候清楚有时候不清楚是怎么回事,干眼常用药有哪些,干眼哪些不能吃
  7. answer = handler.chat_main(question)
  8. log_msg = f"医生:{Fore.CYAN}{answer} \n"
  9. print(log_msg)
  1. VipQA:您好,我是人工智能助理,希望可以帮到您
  2. model init finished ......
  3. 用户:请问最近看东西有时候清楚有时候不清楚是怎么回事
  4. VipQA 可能是:干眼
  5. 用户:干眼常用药有哪些
  6. VipQA 干眼一般可以用:施图伦(七叶洋地黄双苷滴眼液) 【用法用量】:黄斑变性:每日3次,每次1滴,滴入眼结膜囊内(近耳侧外眼角)。
  7. 眼疲劳:每日3次,每次1滴,滴入眼结膜囊内(近耳侧外眼角),延续1周或至病情好转,建议每日2次,每次1滴。 【禁忌】:对制剂中活性成份或其它任一成份过敏者禁用。
  8. 用户:干眼哪些不能吃
  9. VipQA 干眼,下列食物不要吃:海鲜;芥末
  10. 用户:

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

在线问诊 Python、FastAPI、Neo4j — 问题咨询的更多相关文章

  1. python查询neo4j的数据以字典的方式返回数据

    在使用python操作neo4j的时候,如果查询的数据比较多,结构比较复杂的时候,返回的数据量会比较大,而且信息比较多,并且不唯一.所以写了该方法,用于查询比较复杂的数据. def query_gra ...

  2. 转:对比python 链接 neo4j 驱动,py2neo 和 neo4j-driver 和 neo4jrestclient

    Comparing Neo4j driver, py2neo and neo4jrestclient with some basic commands using the Panama Papers  ...

  3. python fastApi实战项目 - 爱投票管理系统(一)

    一.闲来无事,在工作之余自己研究了一下python的异步框架 - fastapi,并写包括 1.部门管理 2.角色管理 3.用户管理 4.菜单管理 5.登录日志 6.操作日志 六个基础功能模块,演示链 ...

  4. python FastAPI 初接触

    先吹一波: 原来写接口可以这么简单!!! 简单到没朋友 . 中文官网:https://fastapi.tiangolo.com/zh/tutorial/header-params/ 且天然支持异步处理 ...

  5. 如何免安装使用 Python?推荐 17 个在线的 Python 解释器!

    作者:Al Sweigart 译者:豌豆花下猫@Python猫 英文:https://inventwithpython.com/blog/2022/10/30/17-online-python-ide ...

  6. ubutn在线服务器python Package安装到离线服务器

    1.在线服务器导出requirement.txt pip freeze > requirement.txt 该文件生成完毕后,需要做些修改,去掉不需要的库,否则下载的时候会出错. 2.下载whl ...

  7. liunx下在线升级python到2.7版本

    因开发nodejs中间用到了node-gyp模块,此模块需2.X最新版本,所以升级服务器python版本 亲测成功 python 升级步骤#1.which python 查询python的位置/usr ...

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

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

  9. ubuntu中在线升级python

    sudo add-apt-repository ppa:fkrull/deadsnakes-python2.7 sudo apt-get update sudo apt-get upgrade 笔记

  10. 通过nbviwer在线分享python notebook

    在数据科学计算中,jupyter-notebook是一个很得力的助手,但是Notebook写完之后如何与他人分享呢?我们可以使用nbviwer. 具体思路: 具体的方法如下: 本地编写ipython ...

随机推荐

  1. 基于瑞芯微camera文章汇总pdf分享给大家

    前面一段时间基于瑞芯微3568平台编写了camera系列文章, 一共12篇,目前更新完毕. <瑞芯微文章合集> camera系列文章编写前后一共花费2个月时间, 期间查阅了很多资料,做了很 ...

  2. C++面试八股文:用过std::set/std::map吗?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第27面: 面试官:用过std::set/std::map吗? 二师兄:用过. 面试官:能介绍一下二者吗? 二师兄:std::set是一个有序的集合, ...

  3. Java中AQS的原理与实现

    目录 1:什么是AQS? 2:AQS都有那些用途? 3:我们如何使用AQS 4:AQS的实现原理 5:对AQS的设计与实现的一些思考 1:什么是AQS ​ 随着计算机的算力越来越强大,各种各样的并行编 ...

  4. 将SQL从phpmyadmin导入到自己的Navicat

    数据库名称太有指向性了 容易把自己给干没了 一码得码的一塌糊涂 就不放图了 进入你的phpmyadmin 注意一定要好好的进到数据库里面 点击导出 如果提示是 正在导出数据库"{你的数据库名 ...

  5. Blazor中CSS隔离无法用在子组件内部

    Blazor的CSS隔离是个很好的东西,如图,只需添加一个与Razor组件同名的CSS文件,这个文件中的CSS样式只会在同名的Razor组件中使用. 原理是通过在dom元素添加一个代表标识符的属性 在 ...

  6. 懒人的百宝箱「GitHub 热点速览」

    本周 GitHub Trending 除了 lazydocker 之外,还有多个 lazy 项目上线,比如大家熟悉的 lazyvim,可见,这个世界对懒人还是很友好的.除此之外,主打一个密码免输入,绕 ...

  7. shell 编程变量使用心得

    类型 示例 用途 大写的变量名 IP 表示常量,比如,用来记录输入和输出文件名 小写变量名 mac 一般变量 左边下划线 _mac 临时的中间变量,只引用一次的变量 右边下划线 tmpfile_ 临时 ...

  8. chrome pre 自动换行

    问题引出 当我想要使用chrome的打印功能生成一份关于md的pdf版本的时候发现有的代码块没有自动换行,生成的PDF没有自动换行,导致部分信息无法阅读 处理方式 把有自动换行的部分处理一下,在md文 ...

  9. 管理虚拟环境——virtualenvwrapper

    1.安装virtualenvwrapper 输入命令:pip install -i https://pypi.douban.com/simple/ virtualenv //下载virtualenvw ...

  10. Python | 函数、数据容器

    1.函数 函数:是组织好的,可重复使用的,用来实现特定功能的代码段. 1.1 简单案例 重复使用计算字符串的长度 str1 = "heystar" str2 = "pyt ...