Neo4j知识图谱搭建与使用方法——MeSH(A)为例

2023-06-1615:55:30数据库教程Comments3,494 views字数 5762阅读模式

一、知识图谱简介:  

知识图谱(Knowledge Graph)是人工智能的重要分支技术,用于以符号形式描述物理世界中的概念及其相互关系。本文记录以Neo4j工具进行知识图谱的搭建、展示和使用的全过程。

二、知识图谱的基本概念  

2.1知识图谱的基本单位:

       “实体”与“关系”构成的“实体-关系-实体”的三元组是知识图谱的基本单位。同时“实体”具有“属性”,通过“属性”呈现完整的“实体”。知识图谱是以多个“实体-属性”通过“关系”进行联结,构成网状的知识结构。
       以“猫-吃-老鼠”为例:
       “猫-吃-老鼠”是一个“实体-关系-实体”三元组。同时可以用“动物”、“宠物”等“属性”来描述“实体”“猫”;用“动物”、“害虫”等属性来描述“实体”“老鼠”。
         Neo4j知识图谱搭建与使用方法——MeSH(A)为例

2.2知识图谱的构建过程:

       知识图谱的搭建过程主要包括:
1、原始数据收集:原始数据收集,又称为语料库收集,是保证知识图谱构建质量最核心的步骤。
2、原始数据处理:不同结构的原始数据需要通过对应的方法进行数据处理,以获取所需的“实体”、“属性”和“关系”信息。这一步是难度最大的步骤,直接决定了相应语料库的收集是否能够构建知识图谱。
3、知识图谱构建:通过使用不同的软件将“实体-关系-实体”三元组构建成知识图谱。常用于构建知识图谱的软件包括:Protégé与Neo4j。
4、知识图谱应用:知识图谱可以通过图数据库查询语言如Cypher,对知识图谱进行搜索查询以实现包括:“搜索”、“问答”、“辅助大数据分析”等功能。
Neo4j知识图谱搭建与使用方法——MeSH(A)为例
         

三、知识图谱的搭建  

3.1语料库展示:  

Neo4j知识图谱搭建与使用方法——MeSH(A)为例文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/47278.html

        从NIH中获取的MeSH(A)具有以下字段内容:“level1_text”、“level2_text”…“level10_text”、“level11_text”;“level1_url”、“level2_url”…“level10_url”、“level11_url”。
Neo4j知识图谱搭建与使用方法——MeSH(A)为例
       其中包含的信息包括:
信息名称
分类
Level_text
实体类
Unique_ID
属性
Enlish_name
属性
Chinese_Translation
属性
Level_ID
属性
(level_url to level_url)
关系
         

3.2 Neo4j页面展示:

       Neo4j有可视化网页,可以直接在Neo4j网页进行知识图谱的搭建以及查询。网址如下:https://workspace-preview.neo4j.io/workspace/query
       在Neo4j可视化网页注册完成之后,可获得一个免费的实例(Instance)。
Neo4j知识图谱搭建与使用方法——MeSH(A)为例
登录之后,进入Neo4j的网页工作界面,可进行知识图谱的构建及查询。
Neo4j知识图谱搭建与使用方法——MeSH(A)为例

3.3 知识图谱搭建:  

3.3.1 使用Cypher语法在Neo4j页面搭建知识图谱:  

0、结点示例:
       通过以下的三元组信息为例在Neo4j界面搭建简单知识图谱。
所属部分
信息名称
信息类别
内容
结点1
Level_text
实体类
Anatomylevel2
Unique_ID
属性
D001829
Enlish_name
属性
Body Regions
Chinese_Translation
属性
身体部位
Level_ID
属性
A01
关系
(level_url to level_url)
关系
Link
结点2
Level_text
实体类
Anatomylevel3
Unique_ID
属性
D059925
Enlish_name
属性
Anatomic Landmarks
Chinese_Translation
属性
解剖学标志
Level_ID
属性
A01.111
1、搭建结点:
CREATE (n:Anatomylevel2) RETURN n;
Neo4j知识图谱搭建与使用方法——MeSH(A)为例
2、添加属性:
MATCH (n:Anatomylevel2) SET n.Unique_ID='D001829' RETURN n;
Neo4j知识图谱搭建与使用方法——MeSH(A)为例
MATCH (n:Anatomylevel2) SET n.Enlish_name='Body Regions', n.Chinese_Translation='身体部位' RETURN n;
Neo4j知识图谱搭建与使用方法——MeSH(A)为例
3、搭建结点+属性:
CREATE(n:Anatomylevel2{Unique_ID:'D001829',Enlish_name:'Body Regions',Chinese_Translation:'身体部位',Level_ID:'A01'}) RETURN n
Neo4j知识图谱搭建与使用方法——MeSH(A)为例
(tips:create命令不管结点是否已经存在,必定创建一个新结点。如果原有结点已经存在需要通过merge命令将结点进行合并)
4、合并结点:
MATCH (n:Anatomylevel2) WITH collect(n) AS nodes CALL apoc.refactor.mergeNodes(nodes) yield node RETURN *;
5、搭建关系:
Neo4j知识图谱搭建与使用方法——MeSH(A)为例
Neo4j知识图谱搭建与使用方法——MeSH(A)为例
Neo4j知识图谱搭建与使用方法——MeSH(A)为例
MATCH(a:Anatomylevel2),(b:Anatomylevel3) CREATE (a)-[r:link]->(b) RETURN r
Neo4j知识图谱搭建与使用方法——MeSH(A)为例
Neo4j知识图谱搭建与使用方法——MeSH(A)为例
6、删除关系:
Neo4j知识图谱搭建与使用方法——MeSH(A)为例
MATCH(a:Anatomylevel2)-[r:link]->(b:Anatomylevel3) DELETE r
Neo4j知识图谱搭建与使用方法——MeSH(A)为例
7、删除结点:
(删除结点前需要将该结点的所有关系删除)
Neo4j知识图谱搭建与使用方法——MeSH(A)为例
MATCH(b:Anatomylevel3) DELETE b
Neo4j知识图谱搭建与使用方法——MeSH(A)为例
8、删除图谱:
Neo4j知识图谱搭建与使用方法——MeSH(A)为例
MATCH(n) DETACH DELETE n
Neo4j知识图谱搭建与使用方法——MeSH(A)为例
Tips:可以通过MERGE的方式创建元素和边,详细见:
https://zhuanlan.zhihu.com/p/398323729

3.3.2 使用Python中py2neo包搭建知识图谱:  

       Python中py2neo能够批量、灵活、快速地将“实体”、“属性”和“关系”导入neo4j并搭建知识图谱。并且可以通过Re包使用正则表达式灵活提取所需内容。
1、导入所需程序包:
from py2neo import Node,Graph,NodeMatcher          import pandas as pd          import re
2、初始化登录neo4j:
def __init__(self,url,username,password,data_path,sheet_name):          # 打开数据库          self.url = url          self.username = username          self.password = password          self.graph = Graph(self.url,auth = (self.username,self.password))          # 导入数据          self.data = pd.read_excel(data_path,sheet_name=sheet_name)          # 使用level_one构成实体类              self.level_one = re.search(r'(.*) \[',self.data['level1_text'].tolist()[0], re.DOTALL).group(1)
3、创建实体:
# 创建实体          def Create_Node(self):# level_rest              Max_columns = int((len(self.data.columns.tolist())+1)/2 + 1)          for i in range(2, Max_columns):                  print(f'正在创建第{i}层的node')                  column_url = 'level' + str(i) + '_url'        column_text = 'level' + str(i) + '_text'        import_urls_list = list(set(self.data[column_url].tolist()))                  import_urls_list = [text_ for text_ in import_urls_list if text_ == text_]          for url in import_urls_list:                      Unique_ID = url                      English_text_list = []                      Chinese_text_list = []                      level_ID_list = []                      import_texts_list = list(set(self.data[self.data[column_url]==url][column_text].tolist()))          for text in import_texts_list:                          English_text = re.search(r'(.*)\(', text, re.DOTALL).group(1)                          English_text_list.append(English_text)                          Chinese_text = re.search(r'\((.*)\)', text, re.DOTALL).group(1)                          Chinese_text_list.append(Chinese_text)                          level_ID = re.search(r'\[(.*)]', text, re.DOTALL).group(1)                          level_ID_list.append(level_ID)          


            label = self.level_one + 'level' + str(i)                      node = Node(label,Unique_ID = Unique_ID, English_name = English_text_list, Chinese_Translation= Chinese_text_list,level_ID = level_ID_list)                      self.graph.create(node)
4、创建关系:
def Create_Relationship(self):              Max_columns = int((len(self.data.columns.tolist()) + 1) / 2 + 1)          for i in range(2, Max_columns -1):                  print(f'正在创建第{i}层的Relationship')                  current_column_url = 'level' + str(i) + '_url'        next_column_url = 'level' + str(i+1) + '_url'        import_urls_list = list(set(self.data[current_column_url].tolist()))                  import_urls_list = [text_ for text_ in import_urls_list if text_ == text_]          for url in import_urls_list:            print(url)          # NodeMatcher获取匹配的结点                      next_urls_list = list(set(self.data[self.data[current_column_url]==url][next_column_url].tolist()))                      next_urls_list = [text_ for text_ in next_urls_list if text_ == text_]          for next_url in next_urls_list:                print(next_url)                          current_label = self.level_one + 'level' + str(i)                          next_label = self.level_one + 'level' + str(i+1)                          Relation = "MATCH (from:"+current_label+"{Unique_ID:"+"\""+url+"\""+"}),(to:"+next_label +"{Unique_ID:"+"\""+next_url+"\""+"}) MERGE (from)-[r:link]->(to)"                self.graph.run(Relation)
Tips:在创建关系的过程中,“NodeMatcher”与“NodeMatch”方法在create(relation)的时候会报错且官方文档并没有给出可以解决的方案,因此在创建关系的过程中推荐使用Run方法结合Cypher语言创建关系。(Run方法同样可以用来创建Node实体)

3.3.3 使用py2neo快速搭建知识图谱:  

       Py2neo包还提供了批量导入实体与关系的方法,并且可以快速地搭建知识图谱。详细可以查看以下网站:
https://blog.csdn.net/qiang12qiang12/article/details/127692314

四、知识图谱的查询  

4.0 查询语法:  

  第四部分主要记录一些简单实用的查询,更多的有关“WITH”、“UNWIND”、“WHERE”、“ORDER BY”、“SKIP”、“MERGE”等语法,请查看网址:https://zhuanlan.zhihu.com/p/398323729

4.1 查询结点:

1、查询指定实体:
MATCH (a:Anatomylevel2)RETURN a
Neo4j知识图谱搭建与使用方法——MeSH(A)为例
2、根据属性查询实体:
MATCH (a:Anatomylevel2{Unique_ID:"D001829"})-->(b) RETURN a,b
Neo4j知识图谱搭建与使用方法——MeSH(A)为例
3、根据路径(无指定)查询实体类:
MATCH (a:Anatomylevel2{Unique_ID:"D001829"})-->(b)RETURN b
Neo4j知识图谱搭建与使用方法——MeSH(A)为例
4、根据路径(有指定)查询实体类:
MATCH (a:Anatomylevel2{Unique_ID:"D001829"})-[r:link]->(b)RETURN b
Neo4j知识图谱搭建与使用方法——MeSH(A)为例

4.2 查询属性:   

MATCH (a:Anatomylevel2)RETURN a.Chinese_Translation
Neo4j知识图谱搭建与使用方法——MeSH(A)为例

4.3 查询关系:   

MATCH (a:Anatomylevel2)-[r]->(b) RETURN type(r)
Neo4j知识图谱搭建与使用方法——MeSH(A)为例

4.4 查询路径:

1、查询最短路径:
MATCH p =shortestPath((a:Anatomylevel2{Unique_ID:"D001829"})-[*1..2]->(b:Anatomylevel3{Unique_ID:"D059925"})) RETURN p
Neo4j知识图谱搭建与使用方法——MeSH(A)为例
2、查询固定深度以内路径:
MATCH p =(a:Anatomylevel2{Unique_ID:"D001829"})-[*1..2]->(b) RETURN p
Neo4j知识图谱搭建与使用方法——MeSH(A)为例
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/47278.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/sjk/47278.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定