这边只是为了测试,演示效果和思路,实际应用中,可以通过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"]}]

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

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

在线问诊 Python、FastAPI、Neo4j — 生成 Cypher 语句的更多相关文章

  1. neo4j中cypher语句多个模糊查询

    总结一下经验: neo4j中,cypher语句的模糊查询,好像是个正则表达式结构. 对于一个属性的多个模糊查询,可以使用如下写法: 比如,查询N类型中,属性attr包含'a1'或者'a2'的所有节点. ...

  2. neo4j常用cypher语句

    阅读更多 1.删除带有关系的节点   a.先删除关系 match (n:Node)-[r:关系名称]-() where (n...条件) delete r   b.删除节点 match (n:Node ...

  3. neo4j 基本概念和Cypher语句总结

    下面是一个介绍基本概念的例子,参考链接Graph database concepts: (1) Nodes(节点) 图谱的基本单位主要是节点和关系,他们都可以包含属性,一个节点就是一行数据,一个关系也 ...

  4. CYPHER 语句(Neo4j)

    CYPHER 语句(Neo4j) 创建电影关系图 新增 查找 修改 删除 导入 格式转换 创建电影关系图 CREATE (TheMatrix:Movie {title:'The Matrix', re ...

  5. python批量生成SQL语句

    1,首先写一条能运行成功插入SQL的语句 INSERT INTO sign_guest(realname,phone,email,sign,event_id)VALUES("jack&quo ...

  6. Day2 Python的运算符及三大语句控制结构

    Python的运算符 Python语言支持以下类型的运算符: 算术运算符 比较(关系)运算符 赋值运算符 逻辑运算符 位运算符 成员运算符 身份运算符 运算符优先级 Python的三大语句控制结构: ...

  7. python脚本批量生成数据

    在平时的工作中,经常会遇到造数据,特别是性能测试的时候更是需要大量的数据.如果一条条的插入数据库或者一条条的创建数据,效率未免有点低.如何快速的造大量的测试数据呢?在不熟悉存储过程的情况下,今天给大家 ...

  8. Neo4j之Cypher学习总结

    Cypher 语句 Cypher是图形数据库Neo4j的声明式查询语言. Cypher语句规则和具备的能力: Cypher通过模式匹配图数据库中的节点和关系,来提取信息或者修改数据. Cypher语句 ...

  9. Python - 条件控制、循环语句 - 第十二天

    Python 条件控制.循环语句 end 关键字 关键字end可以用于将结果输出到同一行,或者在输出的末尾添加不同的字符,实例如下: Python 条件语句是通过一条或多条语句的执行结果(True 或 ...

  10. Cypher 语句实战

    Cypher 语句实战 下载和安装 Neo4j windows 桌面版- 环境设置 https://www.w3cschool.cn/neo4j/neo4j_exe_environment_setup ...

随机推荐

  1. 基于Spark的大规模日志分析

    摘要:本篇文章将从一个实际项目出发,分享如何使用 Spark 进行大规模日志分析,并通过代码演示加深读者的理解. 本文分享自华为云社区<[实战经验分享]基于Spark的大规模日志分析[上进小菜猪 ...

  2. 【技术积累】Linux中的基础知识【二】

    Linux的发行版本 Linux是一个开源操作系统,有许多发行版,每个发行版都有自己的特点和优势.以下是一些常见的Linux发行版: Ubuntu:Ubuntu是最受欢迎的Linux发行版之一,它拥有 ...

  3. JVM监控工具jstat使用介绍

    jstat 是 Java 自带的一个命令行工具,用于监控 JVM 运行时的状态信息.它可以通过以下格式的命令来调用: jstat [option] <vmid> [<interval ...

  4. 程序包xx不存在解决方案:java: 程序包org.aspectj.lang.annotation

    java: 程序包org.aspectj.lang.annotation不存在 #我自己已经配置好pom.xml文件,但是一直报错这个 aspectj 不存在 下面是我的pom.xml配置 可以看出来 ...

  5. 选择排序与冒泡排序(c语言+Java语言)

    选择排序 O(n2) 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置. 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾. 重复第二步,直到所有元素均排序完毕. 例 ...

  6. Java扩展Nginx之一:你好,nginx-clojure

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于Nginx扩展 以欣宸自己为例,对一个java程序 ...

  7. 一体化元数据管理平台——OpenMetadata入门宝典

    大家好,我是独孤风,一位曾经的港口煤炭工人,目前在某国企任大数据负责人,公众号大数据流动主理人.在最近的两年的时间里,因为公司的需求,还有大数据的发展趋势所在,我开始学习数据治理的相关知识.今天给大家 ...

  8. 【WebRtc】获取音视频数据

    首页截图 获取音视频 关键Code 获取摄像头数据 /** * 获取流数据 */ openUserMeida() { var that = this // 判断是否支持获取媒体数据 if (!navi ...

  9. TCP和UDP的应用场景

    传输层的两个协议,TCP(Transmission Control Protocol,传输控制协议)和UDP(User Datagram Protocol,用户数据报协议),有各自的应用场景. TCP ...

  10. log4j2---基于vulhub的log4j2漏洞复现---反弹shell

    基于vulhub的log4j2漏洞复现---反弹shell 1.方法一 环境准备: 和我上一篇fastjson1.2.24漏洞复现是一样的环境,方法也差别不大 声明:遵纪守法,仅作学习记录用处,部分描 ...