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

一、 Neo4介绍

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

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

二、 Neo4j 介绍

3.1 Cypher 介绍

  • Cypher 介绍:作为Neo4j的查询语言“Cypher”是一个描述性的图形查询语言,允许不必编写图形结构的遍历代码对图形存储有表现力和效率的查询。Cypher还在继续发展和成熟,这也就意味着有可能会出现语法的变化。同时也意味着作为组件没有经历严格的性能测试。
  • 设计的目的:一个人类查询语言,适合于开发者和在数据库上做点对点模式(ad-hoc)查询的专业操作人员(我认为这个很重要)。它的构念是基于英语单词和灵巧的图解。
  • 思路:Cyper通过一系列不同的方法和建立于确定的实践为表达查询而激发的。许多关键字如like和order by是受SQL的启发。模式匹配的表达式来自于SPARQL。正则表达式匹配实现实用Scala programming language语言。
  • 与命令式语言的区别:Cypher是一个申明式的语言。对比命令式语言如Java和脚本语言如Gremlin和JRuby,它的焦点在于从图中如何找回(what to retrieve),而不是怎么去做。这使得在不对用户公布的实现细节里关心的是怎么优化查询。

3.2 Neo4j 图数据库 查询

  1. 连接neo4j数据库之后,在浏览器中使用http://localhost:7474/browser/网址查看数据库,初始账户跟密码都是neo4j
  2. 首先查看图数据库

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZzbW46hP-1610371911333)(./assets/展示图2.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MzjmPdq9-1610371911335)(task05.assets/image-20210111205743988.png)]

图 1 展示图 1

在这里插入图片描述
在这里插入图片描述

图 2 展示图 2

  1. 导入的数据的知识图谱

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AsRM4NPc-1610371911340)(./assets/种类.png)]

图 3 图谱类型

  1. 我们首先查询症状:输入语句:
    MATCH (d:Disease)-[:HAS_SYMPTOM]->(s) WHERE d.name='糖尿病' RETURN d.name,s.name

返回可以是Table,Text,跟code

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w7TnCFlo-1610371911341)(./assets/table.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7JuJ6R5H-1610371911342)(task05.assets/image-20210111205852074.png)]

图 4 查询结果 表格展示

在这里插入图片描述

> [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WK7nAeCV-1610371911342)(./assets/Text.png)]

图 5 查询结果 文本展示

> [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NwbyZcu4-1610371911343)(./assets/code.jpg)]
在这里插入图片描述

图 6 查询结果 代码展示

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

    注意:在运行下面代码的时候会提示需要安装ahocorasick包,此时不能直接

    pip install ahocorasick
    

    应该将ahocorasick变成pyahocorasick,

    应该将ahocorasick变成pyahocorasick,

    pip install pyahocorasick
    
  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
            ...

运行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Kclzp1oc-1610371911345)(task05.assets/image-20210111213108675.png)]

数据量还是太少了呀!

参考资料

  1. QASystemOnMedicalGraph
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Neo4j中,创建数据库的步骤如下: 1. 首先,你需要安装Neo4j数据库。你可以从官方网站下载适合你操作系统的安装包并按照指示进行安装。 2. 安装完成后,打开Neo4j的安装目录,并找到配置文件"neo4j.conf"。在Windows上,它通常位于`C:\Program Files\Neo4j\conf`目录下。 3. 打开"neo4j.conf"文件,找到并取消注释`dbms.active_database`这一行。将它的值改为你想要的数据库名称,例如"medicine.db"。保存文件。 4. 现在你可以启动Neo4j数据库。根据你的操作系统,可以通过命令行或形用户界面来启动。 5. 一旦数据库启动,你可以使用Cypher语句来创建节点和关系。例如,你可以使用以下Cypher语句创建四个学院节点: ``` create(Dept1:Department{ name:'自动化学院', No:'001'}) create(Dept2:Department{ name:'计算机学院', No:'002'}) create(Dept3:Department{ name:'英语学院', No:'003'}) create(Dept4:Department{ name:'数学学院', No:'004'}) ``` 这将创建四个名为"自动化学院"、"计算机学院"、"英语学院"和"数学学院"的学院节点,每个节点都有一个姓名和编号的属性。 请注意,以上步骤是基于Neo4j的安装和基本使用,具体操作可能会因版本和环境而有所不同。建议在使用之前,先阅读官方文档或相关教程以获取更详细的信息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [[知识图谱构建] 二.《Neo4j基础入门》基础学习之创建数据库节点及关系](https://blog.csdn.net/Eastmount/article/details/85093828)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [如何在neo4j中创建新的数据库](https://blog.csdn.net/m0_51544947/article/details/122361891)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值