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

接上节生成的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,n.usage_dosage,n.generic_name,n.contraindications"]}] # 输入:
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"]}]

查出节点

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

拼接节点属性

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

测试结果

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

问答演示

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

源代码地址: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. Vue Router 源码分析💪

    专栏分享:vue2源码专栏,玩具项目专栏,硬核 推荐 欢迎各位 ITer 关注点赞收藏 本篇文章参考版本:vue-router v3.x 最终成果,实现了一个可运行的核心路由工程:柏成/vue-rou ...

  2. uniapp学习(一)

    [新课uniapp零基础入门到项目打包(微信小程序/H5/vue/安卓apk)全掌握] https://www.bilibili.com/video/BV1mT411K7nW/?p=24&sh ...

  3. Vue学习之认识ref

    ref相当于一个dom节点,值为string 通俗将类似于原生js的document.querySelector('xxx'):但是不同的是vue是操纵虚拟dom,在渲染初期并没有这个属性,而是在创建 ...

  4. MD文本编辑工具推荐-matktext

    最开始是用vscode编辑markdown文档,左边写右边看效果的实时渲染模式,对于markdown编辑来说是多余的,多是文字类的内容,配以插图,复杂表格和脑图则更少.之后接触到Typora,所打即所 ...

  5. 我真的想知道,AI编译器中的IR是什么?

    随着深度学习的不断发展,AI 模型结构在快速演化,底层计算硬件技术更是层出不穷,对于广大开发者来说不仅要考虑如何在复杂多变的场景下有效的将算力发挥出来,还要应对 AI 框架的持续迭代. AI 编译器就 ...

  6. (转)IBM Appscan9.0.3安全扫描简单安装、使用以及高危漏洞修复

    最近手上负责一个的项目要进行等保评测.请的第三方公司采用IBM Security AppScan Standard对项目进行安全测试.测试报告高危漏洞主要包含sql注入.sql盲注.跨站点脚本编制如下 ...

  7. OpenApi(Swagger)快速转换成 TypeScript 代码 - STC

    在现代的 Web 开发中,使用 OpenAPI(以前称为 Swagger)规范来描述和定义 API 已经成为一种常见的做法.OpenAPI 规范提供了一种统一的方式来描述API的结构.请求和响应,使得 ...

  8. 你知道ES6中的这些属性吗

    ES6,也称ESMAScript2015,这个版本增加了很多好用的特性 变量声明 ES6之前用var来定义变量,ES6增加了两个变量声明的方式,分别为const和let,const用来定义常量,let ...

  9. SpringBoot - 自定义starter

    目录 一.什么是SpringBoot starter机制 二.为什么要自定义starter 三.什么时候需要创建自定义starter 四.自动加载核心注解说明 五.自定义starter的开发流程 案例 ...

  10. 《Kali渗透基础》12. 无线渗透(二)

    @ 目录 1:无线协议栈 1.1:ifconfig 1.2:iwconfig 1.3:iw 1.4:iwlist 2:无线网卡配置 2.1:查看无线网卡 2.2:查看信道频率 2.3:扫描附近 AP ...