Cypher 介绍:作为Neo4j的查询语言,“Cypher”是一个描述性的图形查询语言,允许不必编写图形结构的遍历代码对图形存储有表现力和效率的查询。Cypher还在继续发展和成熟,这也就意味着有可能会出现语法的变化。同时也意味着作为组件没有经历严格的性能测试。

  • 设计的目的:一个人类查询语言,适合于开发者和在数据库上做点对点模式(ad-hoc)查询的专
    业操作人员(我认为这个很重要)。它的构念是基于英语单词和灵巧的图解。
  • 思路:Cyper通过一系列不同的方法和建立于确定的实践为表达查询而激发的。许多关键字如like
    和order by是受SQL的启发。模式匹配的表达式来自于SPARQL。正则表达式匹配实现实用Scala
    programming language语言。
  • 与命令式语言的区别:Cypher是一个申明式的语言。对比命令式语言如Java和脚本语言如
    Gremlin和JRuby,它的焦点在于从图中如何找回(what to retrieve),而不是怎么去做。这使得
    在不对用户公布的实现细节里关心的是怎么优化查询。

AnswerSearching 框架介绍:

1.根据不同的实体和意图构造cypher查询语句

from py2neo import Graphclass AnswerSearching:def __init__(self):self.graph = Graph("http://localhost:7474", username="neo4j", password="123456789")self.top_num = 10    def question_parser(self, data):"""主要是根据不同的实体和意图构造cypher查询语句:param data: {"Disease":[], "Alias":[], "Symptom":[], "Complication":[]}:return:"""sqls = []if data:for intent in data["intentions"]:sql_ = {}sql_["intention"] = intentsql = []if data.get("Disease"):sql = self.transfor_to_sql("Disease", data["Disease"], intent)elif data.get("Alias"):sql = self.transfor_to_sql("Alias", data["Alias"], intent)elif data.get("Symptom"):sql = self.transfor_to_sql("Symptom", data["Symptom"], intent)elif data.get("Complication"):sql = self.transfor_to_sql("Complication", data["Complication"], intent)if sql:sql_['sql'] = sqlsqls.append(sql_)return sqls

2.将问题转变为cypher查询语句

    def transfor_to_sql(self, label, entities, intent):"""将问题转变为cypher查询语句:param label:实体标签:param entities:实体列表:param intent:查询意图:return:cypher查询语句"""if not entities:return []sql = []# 查询症状if intent == "query_symptom" and label == "Disease":sql = ["MATCH (d:Disease)-[:HAS_SYMPTOM]->(s) WHERE d.name='{0}' RETURN d.name,s.name".format(e)for e in entities]if intent == "query_symptom" and label == "Alias":sql = ["MATCH (a:Alias)<-[:ALIAS_IS]-(d:Disease)-[:HAS_SYMPTOM]->(s) WHERE a.name='{0}' return " \"d.name,s.name".format(e) for e in entities]# 查询治疗方法if intent == "query_cureway" and label == "Disease":sql = ["MATCH (d:Disease)-[:HAS_DRUG]->(n) WHERE d.name='{0}' return d.name,d.treatment," \"n.name".format(e) for e in entities]if intent == "query_cureway" and label == "Alias":sql = ["MATCH (n)<-[:HAS_DRUG]-(d:Disease)-[]->(a:Alias) WHERE a.name='{0}' " \"return d.name, d.treatment, n.name".format(e) for e in entities]if intent == "query_cureway" and label == "Symptom":sql = ["MATCH (n)<-[:HAS_DRUG]-(d:Disease)-[]->(s:Symptom) WHERE s.name='{0}' " \"return d.name,d.treatment, n.name".format(e) for e in entities]if intent == "query_cureway" and label == "Complication":sql = ["MATCH (n)<-[:HAS_DRUG]-(d:Disease)-[]->(c:Complication) WHERE c.name='{0}' " \"return d.name,d.treatment, n.name".format(e) for e in entities]# 查询治疗周期if intent == "query_period" and label == "Disease":sql = ["MATCH (d:Disease) WHERE d.name='{0}' return d.name,d.period".format(e) for e in entities]if intent == "query_period" and label == "Alias":sql = ["MATCH (d:Disease)-[]->(a:Alias) WHERE a.name='{0}' return d.name,d.period".format(e)for e in entities]if intent == "query_period" and label == "Symptom":sql = ["MATCH (d:Disease)-[]->(s:Symptom) WHERE s.name='{0}' return d.name,d.period".format(e)for e in entities]if intent == "query_period" and label == "Complication":sql = ["MATCH (d:Disease)-[]->(c:Complication) WHERE c.name='{0}' return d.name," \"d.period".format(e) for e in entities]# 查询治愈率if intent == "query_rate" and label == "Disease":sql = ["MATCH (d:Disease) WHERE d.name='{0}' return d.name,d.rate".format(e) for e in entities]if intent == "query_rate" and label == "Alias":sql = ["MATCH (d:Disease)-[]->(a:Alias) WHERE a.name='{0}' return d.name,d.rate".format(e)for e in entities]if intent == "query_rate" and label == "Symptom":sql = ["MATCH (d:Disease)-[]->(s:Symptom) WHERE s.name='{0}' return d.name,d.rate".format(e)for e in entities]if intent == "query_rate" and label == "Complication":sql = ["MATCH (d:Disease)-[]->(c:Complication) WHERE c.name='{0}' return d.name," \"d.rate".format(e) for e in entities]# 查询检查项目if intent == "query_checklist" and label == "Disease":sql = ["MATCH (d:Disease) WHERE d.name='{0}' return d.name,d.checklist".format(e) for e in entities]if intent == "query_checklist" and label == "Alias":sql = ["MATCH (d:Disease)-[]->(a:Alias) WHERE a.name='{0}' return d.name,d.checklist".format(e)for e in entities]if intent == "query_checklist" and label == "Symptom":sql = ["MATCH (d:Disease)-[]->(s:Symptom) WHERE s.name='{0}' return d.name," \"d.checklist".format(e) for e in entities]if intent == "query_checklist" and label == "Complication":sql = ["MATCH (d:Disease)-[]->(c:Complication) WHERE c.name='{0}' return d.name," \"d.checklist".format(e) for e in entities]# 查询科室if intent == "query_department" and label == "Disease":sql = ["MATCH (d:Disease)-[:DEPARTMENT_IS]->(n) WHERE d.name='{0}' return d.name," \"n.name".format(e) for e in entities]if intent == "query_department" and label == "Alias":sql = ["MATCH (n)<-[:DEPARTMENT_IS]-(d:Disease)-[:ALIAS_IS]->(a:Alias) WHERE a.name='{0}' " \"return d.name,n.name".format(e) for e in entities]if intent == "query_department" and label == "Symptom":sql = ["MATCH (n)<-[:DEPARTMENT_IS]-(d:Disease)-[:HAS_SYMPTOM]->(s:Symptom) WHERE s.name='{0}' " \"return d.name,n.name".format(e) for e in entities]if intent == "query_department" and label == "Complication":sql = ["MATCH (n)<-[:DEPARTMENT_IS]-(d:Disease)-[:HAS_COMPLICATION]->(c:Complication) WHERE " \"c.name='{0}' return d.name,n.name".format(e) for e in entities]# 查询疾病if intent == "query_disease" and label == "Alias":sql = ["MATCH (d:Disease)-[]->(s:Alias) WHERE s.name='{0}' return " \"d.name".format(e) for e in entities]if intent == "query_disease" and label == "Symptom":sql = ["MATCH (d:Disease)-[]->(s:Symptom) WHERE s.name='{0}' return " \"d.name".format(e) for e in entities]# 查询疾病描述if intent == "disease_describe" and label == "Alias":sql = ["MATCH (d:Disease)-[]->(a:Alias) WHERE a.name='{0}' return d.name,d.age," \"d.insurance,d.infection,d.checklist,d.period,d.rate,d.money".format(e) for e in entities]if intent == "disease_describe" and label == "Disease":sql = ["MATCH (d:Disease) WHERE d.name='{0}' return d.name,d.age,d.insurance,d.infection," \"d.checklist,d.period,d.rate,d.money".format(e) for e in entities]if intent == "disease_describe" and label == "Symptom":sql = ["MATCH (d:Disease)-[]->(s:Symptom) WHERE s.name='{0}' return d.name,d.age," \"d.insurance,d.infection,d.checklist,d.period,d.rate,d.money".format(e) for e in entities]if intent == "disease_describe" and label == "Complication":sql = ["MATCH (d:Disease)-[]->(c:Complication) WHERE c.name='{0}' return d.name," \"d.age,d.insurance,d.infection,d.checklist,d.period,d.rate,d.money".format(e) for e in entities]return sql

3.执行cypher查询,返回结果

    def searching(self, sqls):"""执行cypher查询,返回结果:param sqls::return:str"""final_answers = []for sql_ in sqls:intent = sql_['intention']queries = sql_['sql']answers = []for query in queries:ress = self.graph.run(query).data()answers += ressfinal_answer = self.answer_template(intent, answers)if final_answer:final_answers.append(final_answer)return final_answers

4.根据不同意图,返回不同模板的答案

    def answer_template(self, intent, answers):"""根据不同意图,返回不同模板的答案:param intent: 查询意图:param answers: 知识图谱查询结果:return: str"""final_answer = ""if not answers:return ""# 查询症状if intent == "query_symptom":disease_dic = {}for data in answers:d = data['d.name']s = data['s.name']if d not in disease_dic:disease_dic[d] = [s]else:disease_dic[d].append(s)i = 0for k, v in disease_dic.items():if i >= 10:breakfinal_answer += "疾病 {0} 的症状有:{1}\n".format(k, ','.join(list(set(v))))i += 1# 查询疾病if intent == "query_disease":disease_freq = {}for data in answers:d = data["d.name"]disease_freq[d] = disease_freq.get(d, 0) + 1n = len(disease_freq.keys())freq = sorted(disease_freq.items(), key=lambda x: x[1], reverse=True)for d, v in freq[:10]:final_answer += "疾病为 {0} 的概率为:{1}\n".format(d, v/10)# 查询治疗方法if intent == "query_cureway":disease_dic = {}for data in answers:disease = data['d.name']treat = data["d.treatment"]drug = data["n.name"]if disease not in disease_dic:disease_dic[disease] = [treat, drug]else:disease_dic[disease].append(drug)i = 0for d, v in disease_dic.items():if i >= 10:breakfinal_answer += "疾病 {0} 的治疗方法有:{1};可用药品包括:{2}\n".format(d, v[0], ','.join(v[1:]))i += 1# 查询治愈周期if intent == "query_period":disease_dic = {}for data in answers:d = data['d.name']p = data['d.period']if d not in disease_dic:disease_dic[d] = [p]else:disease_dic[d].append(p)i = 0for k, v in disease_dic.items():if i >= 10:breakfinal_answer += "疾病 {0} 的治愈周期为:{1}\n".format(k, ','.join(list(set(v))))i += 1# 查询治愈率if intent == "query_rate":disease_dic = {}for data in answers:d = data['d.name']r = data['d.rate']if d not in disease_dic:disease_dic[d] = [r]else:disease_dic[d].append(r)i = 0for k, v in disease_dic.items():if i >= 10:breakfinal_answer += "疾病 {0} 的治愈率为:{1}\n".format(k, ','.join(list(set(v))))i += 1# 查询检查项目if intent == "query_checklist":disease_dic = {}for data in answers:d = data['d.name']r = data['d.checklist']if d not in disease_dic:disease_dic[d] = [r]else:disease_dic[d].append(r)i = 0for k, v in disease_dic.items():if i >= 10:breakfinal_answer += "疾病 {0} 的检查项目有:{1}\n".format(k, ','.join(list(set(v))))i += 1# 查询科室if intent == "query_department":disease_dic = {}for data in answers:d = data['d.name']r = data['n.name']if d not in disease_dic:disease_dic[d] = [r]else:disease_dic[d].append(r)i = 0for k, v in disease_dic.items():if i >= 10:breakfinal_answer += "疾病 {0} 所属科室有:{1}\n".format(k, ','.join(list(set(v))))i += 1# 查询疾病描述if intent == "disease_describe":disease_infos = {}for data in answers:name = data['d.name']age = data['d.age']insurance = data['d.insurance']infection = data['d.infection']checklist = data['d.checklist']period = data['d.period']rate = data['d.rate']money = data['d.money']if name not in disease_infos:disease_infos[name] = [age, insurance, infection, checklist, period, rate, money]else:disease_infos[name].extend([age, insurance, infection, checklist, period, rate, money])i = 0for k, v in disease_infos.items():if i >= 10:breakmessage = "疾病 {0} 的描述信息如下:\n发病人群:{1}\n医保:{2}\n传染性:{3}\n检查项目:{4}\n" \"治愈周期:{5}\n治愈率:{6}\n费用:{7}\n"final_answer += message.format(k, v[0], v[1], v[2], v[3], v[4], v[5], v[6])i += 1return final_answer

知识图谱组队学习Task05——图数据库查询相关推荐

  1. 知识图谱组队学习Task03——图数据库导入数据

    这里写目录标题 一.知识图谱结构 1 知识图谱实体类型 2.知识图谱实体关系类型 3 知识图谱疾病属性 二.build_graph文件解析 1.总体介绍 2.关键代码解析 项目地址:QASystemO ...

  2. 知识图谱组队学习Task04——知识库的查询语句

    这里写目录标题 一.问答系统 1.Query理解 (1)意图识别 (2)槽值填充 2.任务实践 二.命名实体识别任务实践 1.构建 AC Tree和初始化参数 2.使用AC Tree进行问句过滤 3. ...

  3. Datawhale 知识图谱组队学习 之 Task 4 用户输入->知识库的查询语句

    文章编写人:王翔 特别鸣谢:QASystemOnMedicalGraph 目录 Datawhale 知识图谱组队学习 之 Task 4 用户输入->知识库的查询语句 目录 一.引言 二.什么是问 ...

  4. Datawhale 知识图谱组队学习之Task 4 用户输入->知识库的查询语句

    Datawhale 知识图谱组队学习 之 Task 4 用户输入->知识库的查询语句 文章编写人:王翔 github 地址: 特别鸣谢:QASystemOnMedicalGraph 目录 Dat ...

  5. Datawhale 知识图谱组队学习 之 Task 1 知识图谱介绍

    Datawhale 知识图谱组队学习 之 Task 1 知识图谱介绍 知识图谱理论: 相关理论 知识图谱背景 早在 2010 年微软就开始构建知识图谱,包括 Satori 和 Probase:2012 ...

  6. 知识图谱组队学习Task01——知识图谱介绍

    文章目录 一.知识图谱简介 二.Neo4J 1.Neo4J的安装方法 2.Neo4J的基本操作 3.通过 Python 操作 Neo4j (1)neo4j模块:执行CQL ( cypher ) 语句 ...

  7. [知识图谱构建] 一.Neo4j图数据库安装初识及药材供应图谱实例

    2012年5月,谷歌公司的知识图谱(Knowledge Graph)产品被正式提出,其旨在将人.地点.物等信息作为实体,将实体间的联系作为关系,并将实体和关系以图的形式进行存储.作为语义网的最新产物, ...

  8. 知识图谱组队学习Task02——项目介绍

    项目名称:基于医疗知识图谱的问答系统 项目地址:QASystemOnMedicalGraph 该项目主要分为两部分: 第一部分:搭建知识图谱.后续会介绍: 第二部分:启动问答测试.构建一个简单的基于 ...

  9. Task 5 Cypher 介绍及Neo4j 图数据库查询

    Datawhale 知识图谱组队学习 Task 5 Neo4j 图数据库查询 一. Neo4介绍 二. Neo4j 介绍 3.1 Cypher 介绍 3.2 Neo4j 图数据库 查询 四. 基于知识 ...

最新文章

  1. 给定一个n,输出从1到n的整数
  2. Linux安装—IP设置
  3. 【Java 虚拟机原理】JDK 体系结构 | Java 源码运行原理 | Java 虚拟机内存
  4. Qt Creator 快捷键
  5. VTK:几何对象之Polyhedron
  6. C#halcon点拟合圆形函数
  7. (97)序列检测器状态转移图,面试必问(二十一)(第20天)
  8. matlab画波特图加网格,matlab figure标题;plot坐标范围;添加加密网格
  9. mysql一对多查询合并多的一方的数据。
  10. Android事件分发机制(一)
  11. PDF to Word OCR for Mac(PDF文档转换成word格式)
  12. Vue:带参数函数在传递参数的同时传递事件对象
  13. scada系统集成_SCADA和DCS的区别以及PLC系统和它们的关系
  14. 3097-小鑫爱数学
  15. 如何用计算机绘函数图,用计算机绘制函数图像.
  16. 3DLC系列之:自动匹配颜色
  17. uniapp全端应用商城系统,应用市场APP,软件库APP,葫芦芥子博客
  18. python爬app西瓜视频_Python爬虫下载西瓜视频
  19. 【Bugfix系列】/usr/bin/ld: cannot find -lxxx 的解决办法
  20. CityMaker学习教程12 osg模型的创建

热门文章

  1. PHP 设计模式之工厂模式 (静态工厂模式)
  2. 6、raid、lvm、while、until 学习笔记
  3. 利用.htaccess绑定域名到子目录
  4. Netty端口被占用问题
  5. android中搭建NDK环境及使用JNI技术
  6. skywalking前端_skywalking实现分布式系统链路追踪
  7. jquery 跨域_springboot解决js前端跨域问题,javascript跨域问题解决
  8. 干货!!月薪过万行业,软件测试必懂的基本概念
  9. java转动的风扇课程设计,课程设计—智能风扇设计报告
  10. feign传递数组_feign中传递自定义MultipartFile