本文主要讲解知识图谱及Neo4j图数据库的用法,是作者学习《Neo4j基础入门》书籍的在线笔记,同时以高校网络安全方向教师的关系图谱为例,重点介绍了图数据库查询语句的基本用法。
非常基础的文章,希望大家喜欢,尤其是研究自然语言处理和知识图谱的同学。
作者 | 杨秀璋
来源 | CSDN博客专家Eastmount
责编 | 夕颜
知识图谱
构建的知识图谱效果如下图所示,涉及教师实体、高校实体、高校圈实体和Title实体。
1.创建图数据库
第一步:创建新Graph,点击“Create a Local Graph”,命名为“Graph0801”。
第二步:点击“Start”按钮开启图数据库服务器,点击“Manage”管理页面,接着点击“Open Browser”打开浏览器。
弹出如下所示界面,该界面中可以 输入CQL语句编辑图数据库。
第三步:导入本地CSV数据,创建实体数据。
点击“Open Folder”->“Import”打开图数据库本地文件夹,并放入相关的CSV文件。
C:\Users\yxz.Neo4jDesktop\neo4jDatabases\database-dffc101f-9a56-45bc-9d08-fd4079c10b60\installation-3.4.1\import
2.创建实体节点
第四步:导入教师实体(people.csv)、高校实体(school.csv)、高校群实体(china.csv)和级别实体(title.csv)。
其中教师实体CSV文件打开如下图所示,不包括教师编号、所在学校、所在学院、教师姓名、教师职称、教师级别、学位、毕业学校、研究方向、邮箱和电话等信息。
你可能会疑问,这些信息作者是如何获取的?
当然是人工百度高校计算机或网络安全学院,然后找到每个老师信息并抓取至本地表格中,是不是给跪了,哈哈。在做真实的知识图谱时,我们需要结合网络爬虫或者自身企业的数据库完成,这里仅仅是一个demo,用来展示高校网络安全方向教师的关系图谱。
PS:CSV文件需要设置编码方式为UTF-8,否则会出现中文乱码,本地TXT打开另存为设置即可。
(1) 教师实体 people.csv
-
1id,school,college,name,rank,title,degree,graduation,research,email
-
21,北京大学,计算机科学技术研究所,肖建国,教授,NULL,硕士,北京大学,图形与图像处理技术;网络与信息安全技术,xiaojianguo@pku.edu.cn
-
32,清华大学,网络科学与网络空间研究院,吴建平,教授,院士,NULL,NULL,NULL,NULL
-
43,清华大学,网络科学与网络空间研究院,李星,教授,NULL,NULL,NULL,NULL,NULL
-
54,清华大学,网络科学与网络空间研究院,毕军,教授,长江学者特聘教授,博士,清华大学,新型网络体系结构领域;IPv6源地址验证;软件定义网SDN和网络功能虚拟化NFV;互联网路由,junbi@tsinghua.edu.cn
-
65,清华大学,网络科学与网络空间研究院,段海新,教授,NULL,博士,清华大学,网络安全;网络测量;入侵检测;漏洞挖掘;物联网安全;互联网治理,duanhx@tsinghua.edu.cn
-
76,清华大学,网络科学与网络空间研究院,杨家海,教授,NULL,博士,清华大学,IPv6及新一代互联网体系结构;互联网络管理;网络测量与网络空间安全;云计算、虚拟化及资源管理调度,yang@cernet.edu.cn
-
87,清华大学,网络科学与网络空间研究院,王之梁,副教授,NULL,博士,清华大学,网络协议形式化验证与测试;新一代互联网体系结构;互联网路由体系结构及协议;软件定义网络SDN;网络测量与监测;网络安全,wzl@cernet.edu.cn
-
98,清华大学,网络科学与网络空间研究院,张超,副教授,国家“千人计划”青年项目,博士,北京大学,软件与系统安全;漏洞、攻防、恶意代码;AI与安全;物联网及区块链等应用安全;软件分析、虚拟化等技术,chaoz@tsinghua.edu.cn
-
109,清华大学,网络科学与网络空间研究院,李琦,副教授,NULL,博士,清华大学,互联网和云安全、移动安全;机器学习与安全、大数据安全;区块链与安全,qli01@tsinghua.edu.cn
-
1110,武汉大学,国家网络安全学院,吴黎兵,教授,NULL,博士,武汉大学,
"并行分布计算,大数据安全",wu@whu.edu.cn
-
1211,武汉大学,国家网络安全学院,窦贤康,教授,院士,博士,法国巴黎第七大学,高层大气理论、观测与实验综合研究,dou@ustc.edu.cn
-
1312,武汉大学,国家网络安全学院,杜瑞颖,教授,NULL,博士,武汉大学,网络安全、隐私保护,duraying@
126.com
-
1413,武汉大学,国家网络安全学院,崔晓晖,教授,湖北省“百人计划”,博士, 路易斯维尔大学,大数据分析、人工智能、区块链、高性能计算,xcui@whu.edu.cn
-
1514,武汉大学,国家网络安全学院,陈刚,教授,NULL,博士,武汉大学,网络安全、Web技术与应用、人工智能,chenzuolin@whu.edu.cn
-
1615,武汉大学,国家网络安全学院,董红斌,教授,NULL,博士,NULL,
"Web搜索与挖掘,安防应急,大数据安全",hbdong@whu.edu.cn
-
1716,武汉大学,国家网络安全学院,姬东鸿,教授,武汉大学“珞珈青年学者”,博士,武汉大学;牛津大学,自然语言处理、社会计算、深度学习、大数据平台和对话机器人。实验室既强调前沿研究,也强调应用研究。,dhji@whu.edu.cn
-
1817,武汉大学,国家网络安全学院,何德彪,教授,武汉大学“珞珈青年学者”,博士,武汉大学,应用密码学、区块链安全、云计算安全、物联网安全,hedebiao@whu.edu.cn
-
1918,武汉大学,国家网络安全学院,王骞,教授,国家“青年千人计划”,博士,伊利诺伊理工大学,人工智能安全、云计算安全与隐私、无线系统安全与移动感知、应用密码学,qianwang@whu.edu.cn
-
2019,武汉大学,国家网络安全学院,傅建明,教授,NULL,博士,武汉大学,逆向分析,恶意代码检测,漏洞分析与防御,软件评估和安全加固, 网络安全,jmfu@whu.edu.cn
-
2120,武汉大学,国家网络安全学院,王丽娜,教授,国务院政府特殊津贴获得者,博士,东北大学,网络安全,系统安全,人工智能安全,lnwang@whu.edu.cn
-
2221,武汉大学,国家网络安全学院,唐明,教授,NULL,博士,武汉大学,密码学,信息安全,密码芯片安全,密码系统安全,m.tang@
126.com
-
2322,武汉大学,国家网络安全学院,彭国军,教授,武汉大学“珞珈青年学者”。,博士,武汉大学,网络与信息系统安全、恶意软件分析与检测、软件漏洞、可信软件等,guojpeng@whu.edu.cn
-
2423,武汉大学,国家网络安全学院,叶登攀,教授,NULL,博士,南京理工大学,大数据多媒体安全,机器学习与隐私保护,网络安全感知与防御,网络空间隐匿对抗,yedp@whu.edu.cn
-
2524,武汉大学,国家网络安全学院,陈晶,教授,武汉市黄鹤英才,珞珈青年学者,博士,华中科技大学,大数据安全、云安全、移动安全、网络安全、身份认证与管理、区块链,chenjing@whu.edu.cn
-
2625,武汉大学,国家网络安全学院,李俊娥,教授,NULL,博士,武汉大学,计算机网络体系结构、网络与信息安全、网络性能与服务质量、电网信息物理系统,jeli@whu.edu.cn
-
2726,武汉大学,国家网络安全学院,王志波,教授,NULL,博士,浙江大学,物联网、移动感知与计算、大数据、网络安全与隐私保护、人工智能安全,zbwang@whu.edu.cn
-
2827,武汉大学,国家网络安全学院,赵波,教授,NULL,博士,武汉大学,密码学应用、信息系统安全、可信计算、嵌入式系统及云计算安全、网络安全技术,zhaobo@whu.edu.cn
-
2928,中国科学技术大学,网络空间安全学院,吴曼青,教授/博导,院士,NULL,NULL,网络信息安全;大数据安全,qcmr@ustc.edu.cn
-
3029,中国科学技术大学,网络空间安全学院,郭光灿,教授/博导,院士,NULL,NULL,量子信息;量子光学;信息安全,gcguo@ustc.edu.cn
接着执行如下语句导入29位教师信息,其中实体表为People,包括属性id、name、school、college等。
-
1LOAD CSV WITH HEADERS FROM
"file:///people.csv" AS line
-
2MERGE (p:People{id:line.id,name:line.name,school:line.school,
-
3 college:line.college,rank:line.rank,title:line.title,
-
4 degree:line.degree,graduation:line.graduation,
-
5 research:line.research,email:line.email})
接着通过 match(n) return n 查看节点,显示如下图所示,可以设置颜色及大小。
(2) 高校实体 people.csv
高校实体包括四个属性,序号、中文名称、英文名称和所属类别,读者可以结合实际情况自行增加。
-
1id,name,ename,
type
-
2s1,北京大学,Peking University,
985
-
3s2,清华大学,Tsinghua University,
985
-
4s3,武汉大学,Wuhan University,
985
-
5s4,中国科学技术大学,University of Science and Technology of China,
985
执行命令如下:
-
1LOAD CSV WITH HEADERS FROM
"file:///school.csv" AS line
-
2MERGE (p:School{id:line.id,name:line.name,ename:line.ename,
type:line.
type})
此时增加了两类实体,选中某个实体还能查看其属性及属性值 。
(3) 高校群实体 china.csv
高校群实体主要想把高校划分为不同组织或圈子,比如985院校、211工程、双一流大学、C9高校等。建议读者结合自身需要进行设计更为合理的实体类别。
-
1id,name
-
2c1,中国
985高校
-
3c2,中国
211高校
-
4c3,中国双一流高校
执行命令如下:
-
1LOAD CSV WITH HEADERS FROM
"file:///china.csv" AS line
-
2MERGE (p:China{id:line.id,name:line.name})
(4) 称呼级别实体 title.csv
称呼级别实体是作者想查看院士、长江学者他们的圈子。后续建议读者将论文合作关系、基金课题合作关系、组织合作关系等加入。
-
1id,name
-
2t1,院士
-
3t2,长江学者
执行命令如下:
-
1LOAD CSV WITH HEADERS FROM
"file:///title.csv" AS line
-
2MERGE (p:Title{id:line.id,name:line.name})
此时包含了四种类别的实体,如下图所示。
3.创建实体间关系
(1) 教师-高校关系 rel-ps.csv
-
1from_id,
type,to_id
-
21,属于,s1
-
32,属于,s2
-
43,属于,s2
-
54,属于,s2
-
65,属于,s2
-
76,属于,s2
-
87,属于,s2
-
98,属于,s2
-
109,属于,s2
-
1110,属于,s3
-
1211,属于,s3
-
1312,属于,s3
-
1413,属于,s3
-
1514,属于,s3
-
1615,属于,s3
-
1716,属于,s3
-
1817,属于,s3
-
1918,属于,s3
-
2019,属于,s3
-
2120,属于,s3
-
2221,属于,s3
-
2322,属于,s3
-
2423,属于,s3
-
2524,属于,s3
-
2625,属于,s3
-
2726,属于,s3
-
2827,属于,s3
-
2928,属于,s4
-
3029,属于,s4
CQL代码如下,需要注意 from_id(关系起始) 和 to_id(关系介绍),包含的属性需要和CSV表格一致。
-
1LOAD CSV WITH HEADERS FROM
"file:///rel-ps.csv" AS line
-
2match (from:People{id:line.from_id}),(to:School{id:line.to_id})
-
3merge (from)-[r:属于{
type:line.
type}]->(to)
(2) 学校-高校群关系 rel-sc.csv
-
1from_id,
type,to_id
-
2s1,隶属,c1
-
3s2,隶属,c1
-
4s3,隶属,c1
-
5s4,隶属,c1
CQL导入关系代码如下:
-
1LOAD CSV WITH HEADERS FROM
"file:///rel-sc.csv" AS line
-
2match (from:School{id:line.from_id}),(to:China{id:line.to_id})
-
3merge (from)-[r:隶属{
type:line.
type}]->(to)
(3) 教师-级别关系 rel-pt.csv
-
1from_id,
type,to_id
-
22,是,t1
-
311,是,t1
-
428,是,t1
-
529,是,t1
-
64,是,t2
CQL导入关系代码如下:
-
1LOAD CSV WITH HEADERS FROM
"file:///rel-sc.csv" AS line
-
2match (from:School{id:line.from_id}),(to:China{id:line.to_id})
-
3merge (from)-[r:隶属{
type:line.
type}]->(to)
此时的运行结果如下所示,包括:四所大学、院士、中国985高校、教师之间的关系。
4.获取实体关系的顶层概念关系
1call db.schema
显示结果如下图所示:
注意:如果在导入数据过程中出现错误,需要删除关系、节点,则使用下面代码。
-
1
// 删除节点及关系
-
2MATCH (n)-[r]-()
-
3DELETE n,r
-
4match(n)
return n
-
5
-
6
// 删除关系
-
7MATCH (n)-[r]-()
-
8DELETE r
-
9
-
10
// 单纯删除所以节点
-
11match (n)
-
12delete n
查询语句
1.节点信息查询
match指令查找匹配条件{name: “杨家海”}的节点信息,可以看到返回的节点及其属性。
1match (people {name: "杨家海"}) return people
查询10个教师的姓名属性
1match (p: People) return p.name limit 10
条件查询北京大学或清华大学教师的信息
-
1match (p: People)
-
2where p.school=
"清华大学" or p.school=
"北京大学"
-
3
return p.id, p.name, p.school
2.关系查询
查找清华大学隶属的级别
-
1match (s: School {name:
"清华大学"})-[:隶属]->(People)
-
2
return s, People
查找清华大学的所有教师。该指令匹配学校节点类型为“清华大学”的节点,然后匹配该节点属于关系,并且教师指向该大学的节点,返回结果如下所示。
-
1match (p)-[:属于]->(s: School {name:
"清华大学"})
-
2
return s, p
查找某个老师隶属于哪个大学,School或s仅表示一个变量。
-
1match (p {name:
"杨家海"})-[:属于]->(School)
-
2
return School.name
-
3
-
4match (p {name:
"杨家海"})-[:属于]->(s)
-
5
return s.name
查找与“杨家海”老师同一个学校的老师
该指令匹配节点类型为People,属性为{name: “杨家海”}的节点,接着通过 [:属于] 关系指向的节点m,并同时匹配某个节点coPeople也通过关系 [:属于] 指向节点m,然后返回匹配节点m的name和school属性,输出结果如下图所示。
-
1match (p: People {name:
"杨家海"})-[:属于]->(m)<-[:属于]-(coPeople)
-
2
return coPeople.name, coPeople.school
查找与中国科学技术大学相关的教师
匹配节点类型为People的节点,然后匹配节点类型为School、节点属性为 {name: “中国科学技术大学”} 的节点,最后匹配他们两者之间存在的关系,将教师、关系类型和关系同时返回。
-
1match(p:People)-[relateTo]-(s:School {name:
"中国科学技术大学"})
-
2
return p.name,
type(relateTo), relateTo, s.name
3.查询关系路径
查找与“杨家海”老师存在3条及以内关系的老师和学校
-
1match (p:People {name:
"杨家海"})-[*
1.
.3]-(s)
-
2
return distinct s
查找老师“杨家海”和“王骞”之间的最短关系路径
下图有效展示了“杨家海”老师属于清华大学,二“王骞”老师属于武汉大学,他们均是985高校关联在一起。
-
1match p=shortestPath(
-
2 (b:People {name:
"杨家海"})-[*]-(m:People {name:
"王骞"})
-
3)
-
4
return p
4.好友推荐
查找没有与“杨家海”老师合作过的老师
查找与“杨家海”老师没有合作,但是杨老师的合作伙伴曾经有或者或关系的老师,实现推荐。
寻找的是cocoPeople 其中coPeople是中间人,“院士”。该题目寻找“院士”人物推荐给“杨家海”老师,其中关联是“”老师,他是清华大学的院士,出现次数排序。
-
1match (p:People {name:
"杨家海"})-[:属于]->(m)<-[:属于]-(coPeople),
-
2 (coPeople)-[:是]->(m2)<-[:是]-(cocoPeople)
-
3where not (p)-[:属于]->(m2)
-
4
return cocoPeople.name as Recommended, count(*) as
len
-
5order by
len desc
找人介绍清华大学的“杨家海”老师给武汉大学的“窦贤康”院士认识
-
1match (p:People {name:
"杨家海"})-[:属于]->(m)<-[:属于]-(coPeople),
-
2 (coPeople)-[:是]->(m2)<-[:是]-(c: People {name:
"窦贤康"})
-
3
return p, m, coPeople, m2, c
由图可知:这个图是查找“杨家海”老师通过院士“吴建平”院士认识窦院士。
PS:后面如果做贵州旅游知识图谱,比如说去镇远,就能推荐黔东南景区或者贵州排名高的景区或全国古镇景区给游客。
原文链接:
https://blog.csdn.net/Eastmount/article/details/98208426
【End】
有奖调查 「中国远程办公调查问卷」来啦!长按图片参与???? 有奖调查,填完问卷,查看问卷末尾抽奖页面的进群规则,即可加入交流群‼️(注:进群后才产生中奖者)
???? 我们准备了 10 本 CSDN 精选的技术书籍等你来拿!每天第 6 名和第 8 名入群者即为中奖者(中奖后会有小助手私聊),快长按图片填写问卷吧!
推荐阅读
☞华为发布近2万元折叠屏手机Mate Xs;iPhone 12或支持WiFi新标;Electron 6.1.8发布 | 极客头条
☞面试还搞不懂Redis,快看看这40道面试题!| 博文精选
你点的每一个在看,我认真当成了喜欢
猛戳“阅读原文”,参与调查!
转载:https://blog.csdn.net/csdnnews/article/details/104509517