数据库
首页 > 数据库> > Datawhale知识图谱 Task05 Neo4j 图数据库查询

Datawhale知识图谱 Task05 Neo4j 图数据库查询

作者:互联网

一、 Neo4介绍

1.1 Neo4介绍

  1. Neo4j是一个世界领先的开源图形数据库,由Java编写。图形数据库也就意味着它的数据并非保存在表或集合中,而是保存为节点以及节点之间的关系;
  2. Neo4j的数据由下面3部分构成:节点边和属性;
  3. Neo4j除了顶点(Node)和边(Relationship),还有一种重要的部分——属性。无论是顶点还是边,都可以有任意多的属性。属性的存放类似于一个HashMap,Key为一个字符串,而Value必须是基本类型或者是基本类型数组。

在Neo4j中,节点以及边都能够包含保存值的属性,此外:可以为节点设置零或多个标签(例如Author或Book)每个关系都对应一种类型(例如WROTE或FRIEND_OF)关系总是从一个节点指向另一个节点(但可以在不考虑指向性的情况下进行查询)

1.2 Cypher 介绍

1.3 Neo4j 图数据库 查询

  1. 连接neo4j数据库之后,在浏览器中使用http://localhost:7474/browser/网址查看数据库,初始账户跟密码都是neo4j
  2. 首先查看图数据库
    在这里插入图片描述
    在这里插入图片描述
  3. 导入的数据的知识图谱
    在这里插入图片描述
    我们首先查询症状:输入语句:
MATCH (d:Disease)-[:HAS_SYMPTOM]->(s) WHERE d.name='糖尿病' RETURN d.name,s.name

返回可以是Table,Text,跟code
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、 基于知识图谱的问题系统 主体类 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

三、 代码分模块介绍

  1. 在Python中我们使用py2neo进行查询
  2. 首先安装py2neo,pip install py2neo
  3. 连接上neo4j数据库
from py2neo import Graph 
graph = Graph("http://localhost:7474", username="neo4j", password="neo4j")
  1. 根据不同的实体和意图构造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
  1. 将问题转变为cypher查询语句
 def transfor_to_sql(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_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
     ...
  1. 执行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
  1. 根据不同意图,返回不同模板的答案
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
        ...

标签:cypher,return,data,Datawhale,查询,intent,sql,Neo4j,Task05
来源: https://blog.csdn.net/weixin_46121449/article/details/112755386