知识图谱的建立与查询(以党史人物查询为例)

article/2025/2/6 5:50:04

目录

0 前言

1.确定实体关系属性

2.通过EasyDL标注

3.抽取出实体和关系

4.查询

5.前端页面


0 前言

今天终于答完辩了,真的是舌战群儒,好在有惊无险。贴出唯一一张拍的答辩现场照片。(照片里没有我哈哈哈)

1.确定实体关系属性

先通读文章,确立好这篇文章里面有那些实体,对应有什么关系。只有先确立好实体和关系才能继续做数据标注工作。通过反复阅读和讨论,我们确定了如下的实体和关系。

# 实体
entity_dict = {'南昌起义': '事件', '解放战争时期': '事件', '全国政协第一届全体会议': '事件', '指挥辽沈、淮海、平津三大战役': '事件', '出席中共七届二中全会': '事件', '太平洋战争': '事件', '延安整风运动': '事件', '延安文艺座谈会': '事件', '中共中央政治局扩大会议': '事件', '出席中共六届五中全会': '事件', '中共七届一中全会': '事件', '1921年,经毛泽东、何叔衡介绍,夏明翰加入中国共产党': '事件', '1917年,他考入湖南省立第三甲种工业学校': '事件', '中共六届四中全会': '事件', '中共六大': '事件', '中共中央紧急会议': '事件', '中共五大': '事件', '1922年初加入中国共产党': '事件', '1920年8月加入中国社会主义青年团': '事件', '井冈山根据地的创建': '事件', '参加中国革命互济会': '事件', '组建“中国左翼作家联盟。”': '事件', '加入“民权保障同盟会”': '事件', '出席中国左翼作家联盟成立大会': '事件', '中国自由运动大同盟': '事件', '百团大战': '事件', '出席中共七大': '事件', '直罗镇和东征战役': '事件', '1947年3月加入中国共产党': '事件', '1945年7月参加八路军': '事件', '加入中国共产党旅莫支部': '事件', '1951年3月参加中国人民志愿军赴朝作战': '事件', '万隆会议': '事件', '1938年8月入党': '事件', '党的第四、五、六次全国代表大会上': '事件', '八七会议': '事件', '中共川东临时工作委员会成立': '事件', '忻口会战': '事件', '出席中共六届六中全会': '事件', '平型关战役': '事件', '中共八届十一中全会': '事件', '主持第三届全国人大第一次会议': '事件', '出席中央政治局扩大会议': '事件', '党的三大、四大': '事件', '组织马克思学说研究会': '事件', '旅欧中国少年共产党(翌年改名为中国社会主义青年团旅欧支部)': '事件', '1921年周恩来加入中国共产党八个发起组之一的巴黎共产主义小组': '事件', '1940年7月率部挺进苏北': '事件', '重新加入中国共产党': '事件', '成立工农革命军(不久改称红军)第四军': '事件', '中华苏维埃共和国临时政府': '事件', '红军第一方面军成立': '事件', '1934年10月,毛泽东参加红一方面军长征': '事件', '中共中央政治局在贵州召开扩大会议(即遵义会议)': '事件', '指导建立中国新民主主义青年团': '事件', '参加中共中央书记处工作': '事件', '1951年3月参加中国人民志愿军': '事件', '1952年7月加入中国新民主主义青年团': '事件', '1926年4月,陈铁军加入中国共产党。': '事件', '1924年秋,她考入广东大学文学院预科。求学期间,为追求进步,铁心跟共产党走,她改名铁军。': '事件', '1925年加入中国共产党': '事件', '出席庐山会议': '事件', '出席第二届全国人大第一次会议': '事件', '“五卅”运动': '事件', '192610月在北京汇文中学转党,成为中国共产党员': '事件', '北京南苑农民起义': '事件', '1925年6月加入中国共产主义青年团': '事件', '五四”爱国运动': '事件', '1922年8月加入中国共产党': '事件', '四川平民学社': '事件', '日内瓦会议': '事件', '朝鲜战争': '事件', '出席中央政治局会议': '事件', '出席第一届全国人大第一次会议': '事件', '出席中共八大': '事件', '辛亥革命': '事件', '1927年5月,在大革命遭受严重失败的白色恐怖中,徐特立毅然加入中国共产党': '事件', '1927年8月参加南昌起义': '事件', '创办长沙女子师范学校': '事件', '创办长沙师范学校': '事件', '莫斯科中山大学特别班学习': '事件', '井冈山会师': '事件', '组成工农革命军第四军(后称红四军)': '事件', '成立中国工农红军第一路军(后改称红一军团)': '事件', '湘南起义': '事件', '取得了五斗江、新老七溪岭、龙源口等战斗的胜利': '事件', '1926年11月加入中国共产主义青年团': '事件', '1927年6月转入中国共产党': '事件', '井冈山斗争': '事件', '鲁迅任绍兴中学堂教员兼监学': '事件', '鲁迅参加《新青年》改组': '事件', '组建西北反帝同盟军': '事件', '1924年冬加入中国社会主义青年团': '事件', '1925年春转入中国共产党': '事件', '入黄埔军校第四期学习': '事件', '渭华起义': '事件', '1927年9月,致信台静农,拒绝作为诺贝尔文学奖候选人 ': '事件', '1927年29日,营救进步学生无果愤然辞职': '事件', '“四一二-政变”': '事件', '主持召开中共第七次全国代表大会': '事件', '中共七届三中全会': '事件', '第一届全国人民代表大会第一次会议': '事件', '中华人民共和国建立': '事件', '创办利群书社': '事件', '1921年加入中国共产党': '事件', '创办和主编《中国青年》': '事件', '中共“三大”': '事件', '国民党第一、第二次全国代表大会': '事件', '创建共产主义组织': '事件', '中国共产党第一次全国代表大会': '事件', '1913年,37岁的何叔衡考入湖南省立第一师范讲习班': '事件', '共产党早期组织': '事件', '组织成立了新民学会': '事件', '马日事变': '事件', '组建中共湖南支部': '事件', '海出席中国共产党第一次全国代表大会': '事件', '早年加入同盟会、中华革命党,追随孙中山先生参加革命活动,在革命实践中逐步接受马克思主义': '事件', '1921年1月经李大钊、陈独秀介绍加入上海的中国共产党早期组织': '事件', '中共第五次全国代表大会': '事件', '中共五届一中全会': '事件', '南昌领导武装起义': '事件', '中共中央改组': '事件', '中共六届一中全会': '事件', '领导上海工人第三次武装起义': '事件', '离开上海到中央革命根据地': '事件', '“五卅运动”': '事件', '主持第四届全国人大第一次会议': '事件', '出席中共九届二中全会(庐山会议)': '事件', '出席中共九大': '事件', '出席中共十大': '事件', '十届一中全会': '事件', '九届一中全会': '事件', '加入孙中山领导的革命团体中国同盟会': '事件', '重九起义': '事件', '反对北洋军阀段祺瑞的护法战争': '事件', '反对袁世凯复辟帝制的战争': '事件', '共产国际第七次代表大会': '事件', '成立了共产主义小组': '事件', '出席党的一大': '事件', '党的七大': '事件', '中华苏维埃共和国第二次代表大会': '事件', '五四运动': '事件', '1930年参加鄂豫皖红军': '事件', '1929年参加革命,同年加入中国共产党': '事件', '1934年10月参加长征': '事件', '1933年进入中央革命根据地': '事件', '1931年11月,何叔衡进入中央革命根据地': '事件', '1919年,叶挺投身孙中山领导的三民主主义革命,参加了粤军,同年参加了中国国民党': '事件', '1912年,叶挺考入广州黄埔陆军小学,后进入保定军官学校': '事件', '反抗英军屠杀中国民众的运动': '事件', '创办国民革命军第三军军官教育团': '事件', '北伐革命': '事件', '1922年11月,经张申府、周恩来介绍,加入中国共产党': '事件', '1928年加入中国共产主义青年团': '事件', '1930年5月转入中国共产党': '事件', '1929年参加长汀县农民暴动,加入中国工农红军': '事件', '1945年11月加入中国共产党': '事件', '1944年2月参加新四军': '事件', '1950年10月参加中国人民志愿军': '事件', '950年10月,参加中国人民志愿军赴朝作战': '事件', '东征战役': '事件', '主持中央军事政治学校工作': '事件', '广州起义': '事件', '中共六届二中全会': '事件', '赵世炎': '人物', '彭德怀': '人物', '毛泽东': '人物', '鲁迅': '人物', '左权': '人物', '周恩来': '人物', '夏明翰': '人物', '任弼时': '人物', '郑振铎': '人物', '黄继光': '人物', '董存瑞': '人物', '邱少云': '人物', '许建业': '人物', '徐特立': '人物', '陈铁军': '人物', '周文雍': '人物', '彭雪枫 ': '人物', '肖楚女': '人物', '粟裕': '人物', '谢子长': '人物', '蔡和森': '人物', '陈潭秋': '人物', '董必武': '人物', '彭雪枫': '人物', '叶成焕': '人物', '林伯渠': '人物', '何叔衡': '人物', '瞿秋白': '人物', '叶挺': '人物', '李大钊': '人物', '朱德': '人物', '陈毅': '人物', '杨成武': '人物', '杨根思': '人物', '刘志丹': '人物', '恽代英': '人物', '军垦屯田政策': '政策', '黄埔军校': '毕业学校', '邻水县立中学': '毕业学校', '陆军第十六混成旅军官子弟学校': '毕业学校', '东京早稻田大学': '毕业学校', '云南陆军讲武堂': '毕业学校'}
# 关系
rel_dict = {'参与':'关系','好友':'关系'}
# 属性
prop_dict = {'出生时间':'属性','出生地点':'属性','原名':'属性','号':'属性','官职':'属性','官职任命时间':'属性','思想内容':'属性','思想时间':'属性','政策提出时间':'属性','政策背景':'属性','毕业时间':'属性','民族':'属性','笔名':'属性','著作内容':'属性','著作地点':'属性','著作时间':'属性','评价':'属性','逝世地点':'属性','逝世年龄':'属性','逝世时间':'属性','发生时间':'属性','毕业学校':'属性','担任':'属性','任':'属性'}

2.通过EasyDL标注

标注工具地址:EasyDL

 点击上图的“立即使用”,进入标注类型选项,选择“文本实体关系标注”。

 点击”数据总览“,点击之后选择”创建数据集“,就可以将自己的文本文档导入到标注文档中。

 ”数据集名称“这一栏中填上数据集名称,完成之后点击”创建并导入“。

 进入导入数据步骤,选择”本地导入“,再根据你要打入的类型选择是上传TXT还是EXCEL。设置分隔符,这里选择换行符,表示每遇到一个换行符就阶段成下一条数据。选择数据不去重,重复的定义见EasyDL重复定义)

 创建成功后会返回到之前的页面,可以查看此时导入状态已完成。这样便可以选择标注和多人标注,多人标注可以将数据分发给各个队员,减轻工作量。

 点击“标注”

 该过程中既要确定实体还要确定实体之间的关系,如下图。

 标注完毕的数据可以导出。到处是一个zip压缩包,解压是一个excel表,我们的标注结果

3.抽取出实体和关系

先要将标注好的文件读取进来。用到的工具包为pandas.

import osimport  pandas  as pd
#df=pd.read_excel('1.xlsx',sheet_name='student')#可以通过sheet_name来指定读取的表单
df=pd.read_excel('data/2.xlsx',engine='openpyxl')#这个会直接默认读取到这个Excel的第一个表单
# data=df.iloc[0].values#0表示第一行 这里读
# print(data)#格式化输出

对一条语句进行处理。这里用到了字符串的处理方法,也可以用正则表达式。抽取出实体和关系后,就要创建实体和关系。但是在创建实体的时候会遇到实体重复创建的问题。我们的解决方案是:在找到实体之后先在知识图谱里面查询是否存在该实体,如果存在,就直接创建关系,如果没有重复的实体结点,则说明在知识图谱中不存在该实体,则需要新建实体。代码如下:

from py2neo import Graph, Node, Relationship,NodeMatcher
# 连接到数据库
g = Graph(host='127.0.0.1',auth=("neo4j", "your_password"))
# 对实体进行处理,
person = []
event = []
introduction = []
matcher = NodeMatcher(g)
def get_Node(data):result = {}for i in range(1,len(data)):if type(data[i]) is str:# print(type(data[i]) is str)row_content = data[i].split('},')# print(row_content)entity1,entity2,relation = row_content# 节点1信息B = entity1.split(',')[0][2:]E = entity1.split(',')[1][0:-1]label1 = entity1.split(',')[-1]entity1 = data[0][int(B):int(E)+1]result[label1] = entity1if label1 == '人物' and entity1 not in person:person.append(entity1)#节点2信息B = entity2.split(',')[0][2:]E = entity2.split(',')[1][0:-1]label2 = entity2.split(',')[-1]entity2 = data[0][int(B):int(E)+1]result[label2] = entity2if label2 == '人物':person.append(entity2)# 创建节点nodelist=list(matcher.match(label1,name=entity1))# print(len(nodelist))if len(nodelist) > 0:entity1 = nodelist[0]else:entity1 = Node(label1, name=entity1)g.create(entity1)nodelist=list(matcher.match(label2,name=entity2))# print(len(nodelist))if len(nodelist) > 0:entity2 = nodelist[0]else:entity2 = Node(label2, name=entity2)g.create(entity2)relation = Relationship(entity1,relation,entity2)g.create(relation)introduction.append(result)# print({label1:entity1,'relation':relation,label2:entity2})# result.append((entity1,relation,entity2))# return result

上面代码是一条数据的处理代码,利用python自动化处理,遍历每一条数据,对每一条数据进行上述操作,就能够创建完整个数据库。代码如下:
 

from tqdm import tqdmprint('正在为你导入%d条数据...'%len(df))
for i in tqdm(range(len(df))):data = df.iloc[i].values# print('第%d条数据已入库!'%i)get_Node(data)
print('导入成功!')
print(person)

结果如下:其中person里面是所有的三元组。

 创建的知识图谱效果:

4.查询

查询模块的目的是能够将自然语言转化为cypher语句进行查询。这时候就需要从自然语言中抽取出实体和关系了,这时候利用传统的自然语言处理方法最大正相匹配方法从词库中抽取。

建立词库和近义查询。所谓近义查询就是把一些意思相近的词语替换成我们在知识图谱中确定的关系词语,比如”破壳日“、”啥时候出生“、”何年生人“等特征词替换成”出生时间“。把”出生地“、"在哪儿生的"、”祖籍“等词替换成”出生地点“。

import re
sample = False
#实体词典、关系词典、属性词典entity_dict = {'南昌起义': '事件', '解放战争时期': '事件', '全国政协第一届全体会议': '事件', '指挥辽沈、淮海、平津三大战役': '事件', '出席中共七届二中全会': '事件', '太平洋战争': '事件', '延安整风运动': '事件', '延安文艺座谈会': '事件', '中共中央政治局扩大会议': '事件', '出席中共六届五中全会': '事件', '中共七届一中全会': '事件', '1921年,经毛泽东、何叔衡介绍,夏明翰加入中国共产党': '事件', '1917年,他考入湖南省立第三甲种工业学校': '事件', '中共六届四中全会': '事件', '中共六大': '事件', '中共中央紧急会议': '事件', '中共五大': '事件', '1922年初加入中国共产党': '事件', '1920年8月加入中国社会主义青年团': '事件', '井冈山根据地的创建': '事件', '参加中国革命互济会': '事件', '组建“中国左翼作家联盟。”': '事件', '加入“民权保障同盟会”': '事件', '出席中国左翼作家联盟成立大会': '事件', '中国自由运动大同盟': '事件', '百团大战': '事件', '出席中共七大': '事件', '直罗镇和东征战役': '事件', '1947年3月加入中国共产党': '事件', '1945年7月参加八路军': '事件', '加入中国共产党旅莫支部': '事件', '1951年3月参加中国人民志愿军赴朝作战': '事件', '万隆会议': '事件', '1938年8月入党': '事件', '党的第四、五、六次全国代表大会上': '事件', '八七会议': '事件', '中共川东临时工作委员会成立': '事件', '忻口会战': '事件', '出席中共六届六中全会': '事件', '平型关战役': '事件', '中共八届十一中全会': '事件', '主持第三届全国人大第一次会议': '事件', '出席中央政治局扩大会议': '事件', '党的三大、四大': '事件', '组织马克思学说研究会': '事件', '旅欧中国少年共产党(翌年改名为中国社会主义青年团旅欧支部)': '事件', '1921年周恩来加入中国共产党八个发起组之一的巴黎共产主义小组': '事件', '1940年7月率部挺进苏北': '事件', '重新加入中国共产党': '事件', '成立工农革命军(不久改称红军)第四军': '事件', '中华苏维埃共和国临时政府': '事件', '红军第一方面军成立': '事件', '1934年10月,毛泽东参加红一方面军长征': '事件', '中共中央政治局在贵州召开扩大会议(即遵义会议)': '事件', '指导建立中国新民主主义青年团': '事件', '参加中共中央书记处工作': '事件', '1951年3月参加中国人民志愿军': '事件', '1952年7月加入中国新民主主义青年团': '事件', '1926年4月,陈铁军加入中国共产党。': '事件', '1924年秋,她考入广东大学文学院预科。求学期间,为追求进步,铁心跟共产党走,她改名铁军。': '事件', '1925年加入中国共产党': '事件', '出席庐山会议': '事件', '出席第二届全国人大第一次会议': '事件', '“五卅”运动': '事件', '192610月在北京汇文中学转党,成为中国共产党员': '事件', '北京南苑农民起义': '事件', '1925年6月加入中国共产主义青年团': '事件', '五四”爱国运动': '事件', '1922年8月加入中国共产党': '事件', '四川平民学社': '事件', '日内瓦会议': '事件', '朝鲜战争': '事件', '出席中央政治局会议': '事件', '出席第一届全国人大第一次会议': '事件', '出席中共八大': '事件', '辛亥革命': '事件', '1927年5月,在大革命遭受严重失败的白色恐怖中,徐特立毅然加入中国共产党': '事件', '1927年8月参加南昌起义': '事件', '创办长沙女子师范学校': '事件', '创办长沙师范学校': '事件', '莫斯科中山大学特别班学习': '事件', '井冈山会师': '事件', '组成工农革命军第四军(后称红四军)': '事件', '成立中国工农红军第一路军(后改称红一军团)': '事件', '湘南起义': '事件', '取得了五斗江、新老七溪岭、龙源口等战斗的胜利': '事件', '1926年11月加入中国共产主义青年团': '事件', '1927年6月转入中国共产党': '事件', '井冈山斗争': '事件', '鲁迅任绍兴中学堂教员兼监学': '事件', '鲁迅参加《新青年》改组': '事件', '组建西北反帝同盟军': '事件', '1924年冬加入中国社会主义青年团': '事件', '1925年春转入中国共产党': '事件', '入黄埔军校第四期学习': '事件', '渭华起义': '事件', '1927年9月,致信台静农,拒绝作为诺贝尔文学奖候选人 ': '事件', '1927年29日,营救进步学生无果愤然辞职': '事件', '“四一二-政变”': '事件', '主持召开中共第七次全国代表大会': '事件', '中共七届三中全会': '事件', '第一届全国人民代表大会第一次会议': '事件', '中华人民共和国建立': '事件', '创办利群书社': '事件', '1921年加入中国共产党': '事件', '创办和主编《中国青年》': '事件', '中共“三大”': '事件', '国民党第一、第二次全国代表大会': '事件', '创建共产主义组织': '事件', '中国共产党第一次全国代表大会': '事件', '1913年,37岁的何叔衡考入湖南省立第一师范讲习班': '事件', '共产党早期组织': '事件', '组织成立了新民学会': '事件', '马日事变': '事件', '组建中共湖南支部': '事件', '海出席中国共产党第一次全国代表大会': '事件', '早年加入同盟会、中华革命党,追随孙中山先生参加革命活动,在革命实践中逐步接受马克思主义': '事件', '1921年1月经李大钊、陈独秀介绍加入上海的中国共产党早期组织': '事件', '中共第五次全国代表大会': '事件', '中共五届一中全会': '事件', '南昌领导武装起义': '事件', '中共中央改组': '事件', '中共六届一中全会': '事件', '领导上海工人第三次武装起义': '事件', '离开上海到中央革命根据地': '事件', '“五卅运动”': '事件', '主持第四届全国人大第一次会议': '事件', '出席中共九届二中全会(庐山会议)': '事件', '出席中共九大': '事件', '出席中共十大': '事件', '十届一中全会': '事件', '九届一中全会': '事件', '加入孙中山领导的革命团体中国同盟会': '事件', '重九起义': '事件', '反对北洋军阀段祺瑞的护法战争': '事件', '反对袁世凯复辟帝制的战争': '事件', '共产国际第七次代表大会': '事件', '成立了共产主义小组': '事件', '出席党的一大': '事件', '党的七大': '事件', '中华苏维埃共和国第二次代表大会': '事件', '五四运动': '事件', '1930年参加鄂豫皖红军': '事件', '1929年参加革命,同年加入中国共产党': '事件', '1934年10月参加长征': '事件', '1933年进入中央革命根据地': '事件', '1931年11月,何叔衡进入中央革命根据地': '事件', '1919年,叶挺投身孙中山领导的三民主主义革命,参加了粤军,同年参加了中国国民党': '事件', '1912年,叶挺考入广州黄埔陆军小学,后进入保定军官学校': '事件', '反抗英军屠杀中国民众的运动': '事件', '创办国民革命军第三军军官教育团': '事件', '北伐革命': '事件', '1922年11月,经张申府、周恩来介绍,加入中国共产党': '事件', '1928年加入中国共产主义青年团': '事件', '1930年5月转入中国共产党': '事件', '1929年参加长汀县农民暴动,加入中国工农红军': '事件', '1945年11月加入中国共产党': '事件', '1944年2月参加新四军': '事件', '1950年10月参加中国人民志愿军': '事件', '950年10月,参加中国人民志愿军赴朝作战': '事件', '东征战役': '事件', '主持中央军事政治学校工作': '事件', '广州起义': '事件', '中共六届二中全会': '事件', '赵世炎': '人物', '彭德怀': '人物', '毛泽东': '人物', '鲁迅': '人物', '左权': '人物', '周恩来': '人物', '夏明翰': '人物', '任弼时': '人物', '郑振铎': '人物', '黄继光': '人物', '董存瑞': '人物', '邱少云': '人物', '许建业': '人物', '徐特立': '人物', '陈铁军': '人物', '周文雍': '人物', '彭雪枫 ': '人物', '肖楚女': '人物', '粟裕': '人物', '谢子长': '人物', '蔡和森': '人物', '陈潭秋': '人物', '董必武': '人物', '彭雪枫': '人物', '叶成焕': '人物', '林伯渠': '人物', '何叔衡': '人物', '瞿秋白': '人物', '叶挺': '人物', '李大钊': '人物', '朱德': '人物', '陈毅': '人物', '杨成武': '人物', '杨根思': '人物', '刘志丹': '人物', '恽代英': '人物', '军垦屯田政策': '政策', '黄埔军校': '毕业学校', '邻水县立中学': '毕业学校', '陆军第十六混成旅军官子弟学校': '毕业学校', '东京早稻田大学': '毕业学校', '云南陆军讲武堂': '毕业学校'}
rel_dict = {'参与':'关系','好友':'关系'}
prop_dict = {'出生时间':'属性','出生地点':'属性','原名':'属性','号':'属性','官职':'属性','官职任命时间':'属性','思想内容':'属性','思想时间':'属性','政策提出时间':'属性','政策背景':'属性','毕业时间':'属性','民族':'属性','笔名':'属性','著作内容':'属性','著作地点':'属性','著作时间':'属性','评价':'属性','逝世地点':'属性','逝世年龄':'属性','逝世时间':'属性','发生时间':'属性','毕业学校':'属性','担任':'属性',' 任':'属性'}# q = '从出生时间、出生地点、参与事件,评价介绍一下毛泽东'# 近义查询
q='从出生时间、参与战役、官职、著作来介绍一下朱德?'
time = ['出生时间','出生日期','啥时候出生','破壳日','出生日期','生日']
for i in time:if i in q:print(i)q = q.replace(i,'出生时间')
place = ['出生地点','哪儿出生','出生在哪','什么地方出生','出生在什么地方','啥地方出生','出生在啥地方','那个地方出生','出生在哪地方','在哪儿出生']
for i in place:if i in q:print(i)q = q.replace(i,'出生地点')
participate = ['参与','参加','干了','做什么','干啥']
for i in participate:if i in q:print(i)q = q.replace(i,'参与')
takeplace = ['发生时间','事件时间','啥时候发生的']
for i in takeplace:if i in q:print(i)q = q.replace(i,'发生时间')
graduate = ['毕业学校','毕业院校','从哪儿毕业','毕业于','学成于']
for i in graduate:if i in q:print(i)q = q.replace(i,'毕业学校')
position = ['任','官职','担任']
for i in position:if i in q:print(i)q = q.replace(i,'任')

运行结果:

 上面步骤结束后就到了最后一步,定义模板,判断所问的问题属于那一条模板,并把实体和关系对应进去。

from py2neo import Graph,Node,Relationship
# Graph()中第一个为local host链接,auth为认证,包含 username 和 password
g = Graph('http://localhost:7474', auth = ('neo4j', 'your_password'))
rules={'1':'人物的属性是什么?',      # (距离为1) eg:李大钊的毕业院校   ---------2个实体'2':'人物的属性的属性是什么',  # (距离为2) eg:朱德加入南昌起义的事件时间?--------3个实体'3':'人物和人物的关系是什么?',# (推理得来) eg:毛泽东和朱德有什么关系 -----2个实体,1个关系'4':'人物的关系的属性的属性是什么',  # (距离为3)eg:何叔衡好友参加的事件及事件时间 -------4个实体'5':'从属性和属性和属性方面介绍一下人物' # 综合查询, eg:从出生时间、参与战役、官职、著作来介绍一下朱德?-------关键词介绍
}# cypher_strs =  ["match (n:`人物` {name:'%s'})-[r:`%s`]->(n1) return n1.name",
#                 "MATCH (n1:`人物` {name:'%s'})-[r1:`参与`]->(n2:`事件` {name:'%s'})-[r2:%s]->(n3) return n3.name",
#                 "match (n:`人物` {name:'%s'})-[r:`参与`]->(n1) return n1.name",
#                 "match (n1:`人物` {name:'%s'})-[r1:`%s`]->(n2) match (n2)-[r2:`%s`]->(n3)-[r3:`%s`]->(n4) return n3.name+'发生于'+n4.name",
#                 "MATCH (n:`人物` {name:'%s'})-[r:%s]->(n1) RETURN n1.name"
#
#
#
# ]
def one(name,prop):cypher=  "match (n:`人物` {name:'%s'})-[r:`%s`]->(n1) return n1.name"%(name,prop)answer = g.run(cypher)return answer.data()[0]['n1.name']def two(name,event,prop2):cypher = "MATCH (n1:`人物` {name:'%s'})-[r1:`参与`]->(n2:`事件` {name:'%s'})-[r2:%s]->(n3) return n3.name"%(name,event,prop2)answer = g.run(cypher)return answer.data()[0]['n3.name']def three(name1,name2):def infer(person):cypher = "match (n:`人物` {name:'%s'})-[r:`参与`]->(n1) return n1.name" % person# 交集result = g.run(cypher)# 将查询结果转换为列表a = [record[0] for record in result]return aa = infer(name1)b = infer(name2)inter = list(set(a).intersection(set(b)))result = ''for i in inter:result += i+'、'if inter:answer = '好友。他们共同参与了%s'%resultelse:answer = '不好意思,在所给文本中未查询到二人的关系'return answerdef four(name,relation,prop1,prop2):cypher = "match (n1:`人物` {name:'%s'})-[r1:`%s`]->(n2) match (n2)-[r2:`%s`]->(n3)-[r3:`%s`]->(n4) return n3.name+'发生于'+n4.name"%(name,relation,prop1,prop2)answer = ''for i in g.run(cypher).data():answer += i["n3.name+'发生于'+n4.name"]+'\n'return answerdef five(prop_list,entity_list):props = [i[0] for i in prop_list]print(props)answers = []for i in props:cypher = "MATCH (n:`人物` {name:'%s'})-[r:%s]->(n1) RETURN n1.name"%(entity_list[0][0],i)answers += [{'n1.name':i}] + g.run(cypher).data()answer = ''for i in answers:answer += i['n1.name']+'、'return entity_list[0][0]+answerprint('entity_list',entity_list)
print("rel_list:",rel_list)
print("prop_list:",prop_list)
print('obj_list',obj_list)
print(len(obj_list))
result = ''
if '介绍' in q:result = five(prop_list+rel_list,entity_list)
elif len(entity_list) == 1 and len(prop_list) == 1 and len(obj_list)==2:result = one(obj_list[0][0],obj_list[1][0])
elif len(obj_list) == 3:result = two(entity_list[0][0],entity_list[1][0],'发生时间')
elif '关系' in q:result = three(entity_list[0][0],entity_list[1][0])
elif len(obj_list) == 4:result = four(obj_list[0][0],obj_list[1][0],obj_list[2][0],obj_list[3][0])
if result:print(result)
else:print('对不起,党宝查询了大量资料发现所给文本中无相关信息')

运行结果:

5.前端页面

为了问答更加美观,我们设计了问答系统和搜索引擎系统。下面是项目的展示。

源码已经上传到我的Github上面,有兴趣的大佬们可以查看,如果觉得小弟我写的还行的话,还烦请各位大佬给我点个star。文中有什么不正确或者有什么问题请随时在评论区交流哦。

我是一个特别固执的人,我从来不会听别人要我怎么写代码,写什么样的代码,我不管,如果你们也能和我一样的话,那么我觉得这件事


http://chatgpt.dhexx.cn/article/T088You9.shtml

相关文章

[译]理解PG如何执行一个查询-1

理解PG如何执行一个查询 PG服务器收到客户端发来的查询后,查询的文本交给解析器。解析器扫描查询并检查它的语法。若语法正确,解析器会将查询文本转换成解析树。解析树是一种以正式、明确的形式表示查询含义的数据结构。给定查询: SELECT cus…

【*一篇足以*Java并发编程实践】《Java并发编程实践》学习Note - Part3

目录: 1.避免活跃度危险 1.1 死锁 1.2 避免和诊断死锁 1.3.其他活跃度危险 2.性能和可伸缩性 2.1 内存同步 2.2 阻塞 2.3 减少锁的竞争 3.Lock、ReentrantLock和Synchronized 3.1 可轮询和可定时的锁请求 3.1 可中断的锁获取操作 4.原子变量与非阻塞同步…

阿朱说:咨询的历史(万字深度长文)

(1)知识成为资产:瓦特蒸汽机 13世纪的英国,首先产生了人类历史上的第一部专利保护法。不过最初是很粗糙的,授予专利的权力完全掌握在国王手中,发放专利特许证,将某种独占经营权授予工匠、商人&a…

SpringBoot + Thymeleaf 练手小项目 --------- 豆瓣网站模拟

目录 一、项目介绍二、资源准备1. 准备数据库表2. 准备image、css、js等静态资源文件3. 项目结构 三、开发步骤1. 新建项目2. pom.xml3. 实体类 model4. Mapper 类5. service 类6. 首页 index.html 开发① MovieController② index.html 7. 电影详情页 movie_info.html 开发① …

Jmeter - webSocket 压力测试笔记

概述 编程的内核是数学,而测试的本质是计算,专业名词叫容量预估,而测试的大体就是用程序模拟程序,检测程序的正确性,有两个点需要注意,QPS最佳值和系统接收最大值,根据测试数据的反馈&#xff…

应用密码学(张仕斌)第五章

序列密码体制 引言Vernam(弗纳姆)密码技术 1917年美国电话电报公司的GilbertVernam为电报通信设计了一种十分方便的密码技术。后来称之为Vernam密码技术. 它是一种代数密码技术:其加密方法是,将明文和密钥分别表示成二进制序列&am…

SQL调优指南笔记8:Optimizer Access Paths

本文为SQL Tuning Guide第8章“优化访问路径”的笔记。 重要基本概念 access path The means by which the database retrieves data from a database. For example, a query using an index and a query using a full table scan use different access paths. 数据库从数据库…

2023年还在问前端怎么学?一份前端学习指南

🍭 Hello,我是爱吃糖的范同学 因为疫情摆烂了许久,学校里又有许多大大小小的烦心事要处理(特别是作业和期末考试😫),所以在博客文章的更新上很长一段时间都没有输出很正经的文章了,…

【前端圭臬】一:写给入坑前端的你

专栏目录 导论 【前端圭臬】一:写给入坑前端的你 HTML 篇 【前端圭臬】二:你知道的和不知道的 HTML CSS 篇 【前端圭臬】三:详解 CSS 选择器 【前端圭臬】四:CSS 核心机制——如何确定一个属性的值? 【前端圭臬】…

【前端是什么】

前端是什么? 文章目录 前端是什么?1.前端的概念2. 前端的分类3. 前端的工作流程4. 互联网企业的典型组织结构图 1.前端的概念 1.1 前端的定义 对于网站来说,通常是指网站的前台部分,包括网站的表现层和结构层(通俗点就…

前端什么知识点最难学?

这个最就很难判断,每个人的理解程度不一致,但有两种人,觉得难的他还没学会,会的不觉得难,但是前端不一样了,会了也难,因为谁都对前端提点建议(啥也不懂的老板、产品经理、项目经理、…

【前端】一个好看的前端页面

序言 突发奇想,看到这个特效还不错,就加工了一下,如果也能帮到你,很开心 先上效果图 部分代码讲解 前端生成uuid function getUUID(len, radix) {var chars 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.s…

从零学前端第一讲:前端开发是什么?给初学者有什么建议?

这里是修真院前端小课堂,本篇分析的主题是 【从零学前端第一讲:前端开发是什么?给初学者有什么建议?】 初识前端 1、前端开发是什么? 2、前端开发有前途吗? 3、前端开发哪里学? 4、前端发展…

前端是什么

此为小白浅显整合: 一直以来,对前端一直是一个笼统的概念,于是,专门花时间整合了网上各种说法,给自己一个较正确的定位。 前端是什么?? 前端,也称web前端。对于网站来说&#xff0…

怎么才能学好前端?

你如果知道简单的问题要百度,已经强过一部分人了。 至于学习方法,有些经验分享给你: 1.在学习的过程中,最好不是仅仅停留在前端与移动开发表层,不是抄书上的例子运行出结果就可以。要注意,即便对一个简单的…

web 前端入坑第一篇:web前端到底是什么?有前途吗

web前端到底是什么? 某货: “前几年前端开发人员鱼目混杂,技术参差不齐,相对学习起来不规范,导致> 前端开发人员聚集,所以现在前端工种和工资还是没得到普遍重视,但近2年来,> …

前端工程化详解——理解与实践前端工程化

前言: 前端工程化一直是一个老生常谈的问题,不管是面试还是我们在公司做基建都会经常提到前端工程化,那么为什么经常会说到前端工程化,并没有听过后端工程化、Java工程化或者Python工程化呢?我们理解的前端工程化是不是…

适合我的前端学习路线(学习前端不迷路)

适合我的前端学习路线(学习前端不迷路) 小伙伴们想学习前端,但是却不知如何入手,上网查前端学习路线,第一页往往充斥着各种培训公司的广告,又或者是搜前端学习路线图时,出现大量的路线图导致你还…

前端工程师行业现状怎么样?前景如何?

前端工程师行业现状怎么样?前景如何?前端即网站前台部分,运行在PC端移动端等浏览器上展现给用户浏览的网页。前端市场远没有饱和,现在的市场状况需求量非常多薪资可观。小编将通过官方数据宏观的给大家分析一下前端这个行业。 一…

快毕业了,很多人都不推荐做前端,前端业内最真实情况是什么样的?

偶尔出现这样一种说法,前端热度已经降低了,前端市场已经饱和了,前端工作没有那么好找了。 部分事实确实如此,大概是在2014-2018年,那时候前端技术刚刚崛起,相对来讲工作较现在更容易找到。 随着前端技术的发展及人才需求结构的成熟,现在已经不是会做动态网页就能找到工…