Neo4j 图数据库查询
2021-01-18 00:16
1051 查看
Cypher 介绍
- Cypher 介绍:作为Neo4j的查询语言,“Cypher”是一个描述性的图形查询语言,允许不必编写图形结构的遍历代码对图形存储有表现力和效率的查询。Cypher还在继续发展和成熟,这也就意味着有可能会出现语法的变化。同时也意味着作为组件没有经历严格的性能测试。
- 设计的目的:一个人类查询语言,适合于开发者和在数据库上做点对点模式(ad-hoc)查询的专业操作人员(我认为这个很重要)。它的构念是基于英语单词和灵巧的图解。
- 思路:Cyper通过一系列不同的方法和建立于确定的实践为表达查询而激发的。许多关键字如like和order by是受SQL的启发。模式匹配的表达式来自于SPARQL。正则表达式匹配实现实用Scala programming language语言。
- 与命令式语言的区别:Cypher是一个申明式的语言。对比命令式语言如Java和脚本语言如Gremlin和JRuby,它的焦点在于从图中如何找回(what to retrieve),而不是怎么去做。这使得在不对用户公布的实现细节里关心的是怎么优化查询。
基于知识图谱的问题系统 主体类 AnswerSearching 框架介绍
class AnswerSearching: def __init__(self): pass # 主要是根据不同的实体和意图构造cypher查询语句 def question_parser(self, data): """ 主要是根据不同的实体和意图构造cypher查询语句 :param data: {"Disease":[], "Alias":[], "Symptom":[], "Complication":[]} :return: """ pass # 将问题转变为cypher查询语句 def transfor_to_sql(self, label, entities, intent): """ 将问题转变为cypher查询语句 :param label:实体标签 :param entities:实体列表 :param intent:查询意图 :return:cypher查询语句 """ pass # 执行cypher查询,返回结果 def searching(self, sqls): """ 执行cypher查询,返回结果 :param sqls: :return:str """ pass # 根据不同意图,返回不同模板的答案 def answer_template(self, intent, answers): """ 根据不同意图,返回不同模板的答案 :param intent: 查询意图 :param answers: 知识图谱查询结果 :return: str """ pass 三、 代码分模块介绍 在Python中我们使用py2neo进行查询 首先安装py2neo,pip install py2neo 连接上neo4j数据库 from py2neo import Graph graph = Graph("http://localhost:7474", username="neo4j", password="neo4j") 根据不同的实体和意图构造cypher查询语句 def question_parser(data): """ 主要是根据不同的实体和意图构造cypher查询语句 :param data: {"Disease":[], "Alias":[], "Symptom":[], "Complication":[]} :return: """ sqls = [] if data: for intent in data["intentions"]: sql_ = {} sql_["intention"] = intent sql = [] if data.get("Disease"): sql = transfor_to_sql("Disease", data["Disease"], intent) elif data.get("Alias"): sql = transfor_to_sql("Alias", data["Alias"], intent) elif data.get("Symptom"): sql = transfor_to_sql("Symptom", data["Symptom"], intent) elif data.get("Complication"): sql = transfor_to_sql("Complication", data["Complication"], intent) if sql: sql_['sql'] = sql sqls.append(sql_) return sql 将问题转变为cypher查询语句 def transfor_to_sql(label, entities, intent): """ 将问题转变为cypher查询语句 :param label:实体标签 :param entities:实体列表 2b58 :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_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_period" and label == "Disease": sql = ["MATCH (d:Disease) WHERE d.name='{0}' return d.name,d.period".format(e) for e in entities ... 执行cypher查询,返回结果 def searching(sqls): """ 执行cypher查询,返回结果 :param sqls: :return:str """ final_answers = [] for sql_ in sqls: intent = sql_['intention'] queries = sql_['sql'] answers = [] for query in queries: ress = graph.run(query).data() answers += ress final_answer = answer_template(intent, answers) if final_answer: final_answers.append(final_answer) return final_answers 根据不同意图,返回不同模板的答案 def answer_template(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 = 0 for k, v in disease_dic.items(): if i >= 10: break final_answer += "疾病 {0} 的症状有:{1}\n".format(k, ','.join(list(set(v)))) i += 1 ...
相关文章推荐
- [bigdata-83] python3+图数据库neo4j 电话号码 身份证 黑名单 创建节点 标签 关系 增标记 增关系 查询pattern示例
- Spring-Boot集成Neo4j图谱数据库+案例之创建与查询节点
- SQL Server 查询数据库中被锁定的表
- 四种数据库(SqlServer/Oracle/Mysql/Sybase)查询前N条数据
- 查询整个数据库中的某些特定信息
- 当某个表中存在标志表格中记录不同状态的判断性字段的时候,采用两种不同的数据库组织形式,查询执行速度的实验。
- 数据库 查询 事务
- C#中,当从数据库中查询到数据,以DataTable类型返回后,如果需要对DataTable中的数据进行筛选,可以选择下面的方式
- 整理出的数据库中几个常用sql查询语句
- Mongo数据库的模糊查询
- 【SqlServer2005+ 查询优化】MSSQL优化SQL语句 提高数据库的访问性能
- [转]php查询数据库乱码问题
- Neo4j数据库基础(一)
- LINQ to SQL 查询数据库和使用存储过程
- Android数据库 — — —查询数据
- mysql查询数据库中各表的主键、自增标识
- MySql条件查询不到数据 → 更改数据库编码
- 以map接收数据库中查询到的多行结果
- 实验10-6 在产品销售数据库TestDB中完成查询
- 查询数据库所有(某个)表中字段名,数据类型,说明等