清华、北大、985 高校教师之间有啥关系?Neo4j 创建知识图谱一查便知

本文主要讲解知识图谱及Neo4j图数据库的用法,是作者学习《Neo4j基础入门》书籍的在线笔记,同时以高校网络安全方向教师的关系图谱为例,重点介绍了图数据库查询语句的基本用法。

非常基础的文章,希望大家喜欢,尤其是研究自然语言处理和知识图谱的同学。

清华、北大、985 高校教师之间有啥关系?Neo4j 创建知识图谱一查便知

作者 | 杨秀璋

来源 | CSDN博客专家Eastmount

清华、北大、985 高校教师之间有啥关系?Neo4j 创建知识图谱一查便知

知识图谱

构建的知识图谱效果如下图所示,涉及教师实体、高校实体、高校圈实体和Title实体。

清华、北大、985 高校教师之间有啥关系?Neo4j 创建知识图谱一查便知

1.创建图数据库

第一步:创建新Graph,点击“Create a Local Graph”,命名为“Graph0801”。

清华、北大、985 高校教师之间有啥关系?Neo4j 创建知识图谱一查便知

第二步:点击“Start”按钮开启图数据库服务器,点击“Manage”管理页面,接着点击“Open Browser”打开浏览器。

清华、北大、985 高校教师之间有啥关系?Neo4j 创建知识图谱一查便知清华、北大、985 高校教师之间有啥关系?Neo4j 创建知识图谱一查便知

弹出如下所示界面,该界面中可以 输入CQL语句编辑图数据库。

清华、北大、985 高校教师之间有啥关系?Neo4j 创建知识图谱一查便知

第三步:导入本地CSV数据,创建实体数据。

点击“Open Folder”->“Import”打开图数据库本地文件夹,并放入相关的CSV文件。

清华、北大、985 高校教师之间有啥关系?Neo4j 创建知识图谱一查便知

C:\\Users\\yxz.Neo4jDesktop\\neo4jDatabases\\database-dffc101f-9a56-45bc-9d08-fd4079c10b60\\installation-3.4.1\\import

清华、北大、985 高校教师之间有啥关系?Neo4j 创建知识图谱一查便知

2.创建实体节点

第四步:导入教师实体(people.csv)、高校实体(school.csv)、高校群实体(china.csv)和级别实体(title.csv)。

其中教师实体CSV文件打开如下图所示,不包括教师编号、所在学校、所在学院、教师姓名、教师职称、教师级别、学位、毕业学校、研究方向、邮箱和电话等信息。

你可能会疑问,这些信息作者是如何获取的?

当然是人工百度高校计算机或网络安全学院,然后找到每个老师信息并抓取至本地表格中,是不是给跪了,哈哈。在做真实的知识图谱时,我们需要结合网络爬虫或者自身企业的数据库完成,这里仅仅是一个demo,用来展示高校网络安全方向教师的关系图谱。

清华、北大、985 高校教师之间有啥关系?Neo4j 创建知识图谱一查便知

PS:CSV文件需要设置编码方式为UTF-8,否则会出现中文乱码,本地TXT打开另存为设置即可。

清华、北大、985 高校教师之间有啥关系?Neo4j 创建知识图谱一查便知

(1) 教师实体 people.csv

<code> 1id,school,college,name,rank,title,degree,graduation,research,email
21,北京大学,计算机科学技术研究所,肖建国,教授,,硕士,北京大学,图形与图像处理技术;网络与信息安全技术,[email protected]
32,清华大学,网络科学与网络空间研究院,吴建平,教授,院士,,,,
43,清华大学,网络科学与网络空间研究院,李星,教授,,,,,
54,清华大学,网络科学与网络空间研究院,毕军,教授,长江学者特聘教授,博士,清华大学,新型网络体系结构领域;IPv6源地址验证;软件定义网SDN和网络功能虚拟化NFV;互联网路由,[email protected]
65,清华大学,网络科学与网络空间研究院,段海新,教授,,博士,清华大学,网络安全;网络测量;入侵检测;漏洞挖掘;物联网安全;互联网治理,[email protected]
76,清华大学,网络科学与网络空间研究院,杨家海,教授,,博士,清华大学,IPv6及新一代互联网体系结构;互联网络管理;网络测量与网络空间安全;云计算、虚拟化及资源管理调度,[email protected]
87,清华大学,网络科学与网络空间研究院,王之梁,副教授,,博士,清华大学,网络协议形式化验证与测试;新一代互联网体系结构;互联网路由体系结构及协议;软件定义网络SDN;网络测量与监测;网络安全,[email protected]
98,清华大学,网络科学与网络空间研究院,张超,副教授,国家“千人计划”青年项目,博士,北京大学,软件与系统安全;漏洞、攻防、恶意代码;AI与安全;物联网及区块链等应用安全;软件分析、虚拟化等技术,[email protected]

109,清华大学,网络科学与网络空间研究院,李琦,副教授,,博士,清华大学,互联网和云安全、移动安全;机器学习与安全、大数据安全;区块链与安全,[email protected]
1110,武汉大学,国家网络安全学院,吴黎兵,教授,,博士,武汉大学,"并行分布计算,大数据安全",[email protected]
1211,武汉大学,国家网络安全学院,窦贤康,教授,院士,博士,法国巴黎第七大学,高层大气理论、观测与实验综合研究,[email protected]
1312,武汉大学,国家网络安全学院,杜瑞颖,教授,,博士,武汉大学,网络安全、隐私保护,[email protected]
1413,武汉大学,国家网络安全学院,崔晓晖,教授,湖北省“百人计划”,博士, 路易斯维尔大学,大数据分析、人工智能、区块链、高性能计算,[email protected]
1514,武汉大学,国家网络安全学院,陈刚,教授,,博士,武汉大学,网络安全、Web技术与应用、人工智能,[email protected]
1615,武汉大学,国家网络安全学院,董红斌,教授,,博士,,"Web搜索与挖掘,安防应急,大数据安全",[email protected]
1716,武汉大学,国家网络安全学院,姬东鸿,教授,武汉大学“珞珈青年学者”,博士,武汉大学;牛津大学,自然语言处理、社会计算、深度学习、大数据平台和对话机器人。实验室既强调前沿研究,也强调应用研究。,[email protected]
1817,武汉大学,国家网络安全学院,何德彪,教授,武汉大学“珞珈青年学者”,博士,武汉大学,应用密码学、区块链安全、云计算安全、物联网安全,[email protected]

1918,武汉大学,国家网络安全学院,王骞,教授,国家“青年千人计划”,博士,伊利诺伊理工大学,人工智能安全、云计算安全与隐私、无线系统安全与移动感知、应用密码学,[email protected]
2019,武汉大学,国家网络安全学院,傅建明,教授,,博士,武汉大学,逆向分析,恶意代码检测,漏洞分析与防御,软件评估和安全加固, 网络安全,[email protected]
2120,武汉大学,国家网络安全学院,王丽娜,教授,国务院政府特殊津贴获得者,博士,东北大学,网络安全,系统安全,人工智能安全,[email protected]
2221,武汉大学,国家网络安全学院,唐明,教授,,博士,武汉大学,密码学,信息安全,密码芯片安全,密码系统安全,[email protected]
2322,武汉大学,国家网络安全学院,彭国军,教授,武汉大学“珞珈青年学者”。,博士,武汉大学,网络与信息系统安全、恶意软件分析与检测、软件漏洞、可信软件等,[email protected]
2423,武汉大学,国家网络安全学院,叶登攀,教授,,博士,南京理工大学,大数据多媒体安全,机器学习与隐私保护,网络安全感知与防御,网络空间隐匿对抗,[email protected]
2524,武汉大学,国家网络安全学院,陈晶,教授,武汉市黄鹤英才,珞珈青年学者,博士,华中科技大学,大数据安全、云安全、移动安全、网络安全、身份认证与管理、区块链,[email protected]
2625,武汉大学,国家网络安全学院,李俊娥,教授,,博士,武汉大学,计算机网络体系结构、网络与信息安全、网络性能与服务质量、电网信息物理系统,[email protected]

2726,武汉大学,国家网络安全学院,王志波,教授,,博士,浙江大学,物联网、移动感知与计算、大数据、网络安全与隐私保护、人工智能安全,[email protected]
2827,武汉大学,国家网络安全学院,赵波,教授,,博士,武汉大学,密码学应用、信息系统安全、可信计算、嵌入式系统及云计算安全、网络安全技术,[email protected]
2928,中国科学技术大学,网络空间安全学院,吴曼青,教授/博导,院士,,,网络信息安全;大数据安全,[email protected]
3029,中国科学技术大学,网络空间安全学院,郭光灿,教授/博导,院士,,,量子信息;量子光学;信息安全,[email protected]
/<code>

接着执行如下语句导入29位教师信息,其中实体表为People,包括属性id、name、school、college等。

<code>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})
/<code>
清华、北大、985 高校教师之间有啥关系?Neo4j 创建知识图谱一查便知

接着通过 match(n) return n 查看节点,显示如下图所示,可以设置颜色及大小。

清华、北大、985 高校教师之间有啥关系?Neo4j 创建知识图谱一查便知

(2) 高校实体 people.csv

高校实体包括四个属性,序号、中文名称、英文名称和所属类别,读者可以结合实际情况自行增加。

<code>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
/<code>

执行命令如下:

<code>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})
/<code>

此时增加了两类实体,选中某个实体还能查看其属性及属性值 。

清华、北大、985 高校教师之间有啥关系?Neo4j 创建知识图谱一查便知

(3) 高校群实体 china.csv

高校群实体主要想把高校划分为不同组织或圈子,比如985院校、211工程、双一流大学、C9高校等。建议读者结合自身需要进行设计更为合理的实体类别。

<code>1id,name
2c1,中国985高校
3c2,中国211高校

4c3,中国双一流高校
/<code>

执行命令如下:

<code>1LOAD CSV WITH HEADERS FROM "file:///china.csv" AS line
2MERGE (p:China{id:line.id,name:line.name})
/<code>

(4) 称呼级别实体 title.csv

称呼级别实体是作者想查看院士、长江学者他们的圈子。后续建议读者将论文合作关系、基金课题合作关系、组织合作关系等加入。

<code>1id,name
2t1,院士
3t2,长江学者
/<code>

执行命令如下:

<code>1LOAD CSV WITH HEADERS FROM "file:///title.csv" AS line
2MERGE (p:Title{id:line.id,name:line.name})
/<code>

此时包含了四种类别的实体,如下图所示。

清华、北大、985 高校教师之间有啥关系?Neo4j 创建知识图谱一查便知

3.创建实体间关系

(1) 教师-高校关系 rel-ps.csv

<code> 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
/<code>

CQL代码如下,需要注意 from_id(关系起始) 和 to_id(关系介绍),包含的属性需要和CSV表格一致。

<code>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)
/<code>

(2) 学校-高校群关系 rel-sc.csv

<code>1from_id,type,to_id
2s1,隶属,c1
3s2,隶属,c1
4s3,隶属,c1
5s4,隶属,c1
/<code>

CQL导入关系代码如下:

<code>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)
/<code>

(3) 教师-级别关系 rel-pt.csv

<code>1from_id,type,to_id
22,是,t1
311,是,t1
428,是,t1
529,是,t1
64,是,t2
/<code>

CQL导入关系代码如下:

<code>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)
/<code>

此时的运行结果如下所示,包括:四所大学、院士、中国985高校、教师之间的关系。

清华、北大、985 高校教师之间有啥关系?Neo4j 创建知识图谱一查便知

4.获取实体关系的顶层概念关系

<code>1call db.schema
/<code>

显示结果如下图所示:

清华、北大、985 高校教师之间有啥关系?Neo4j 创建知识图谱一查便知

注意:如果在导入数据过程中出现错误,需要删除关系、节点,则使用下面代码。

<code> 1// 删除节点及关系
2MATCH (n)-[r]-
3DELETE n,r
4match(n) return n
5
6// 删除关系

7MATCH (n)-[r]-
8DELETE r
9
10// 单纯删除所以节点
11match (n)
12delete n
/<code>
清华、北大、985 高校教师之间有啥关系?Neo4j 创建知识图谱一查便知

查询语句

1.节点信息查询

  • match指令查找匹配条件{name: “杨家海”}的节点信息,可以看到返回的节点及其属性。

<code>1match (people {name: "杨家海"}) return people
/<code>
清华、北大、985 高校教师之间有啥关系?Neo4j 创建知识图谱一查便知
  • 查询10个教师的姓名属性

<code>1match (p: People) return p.name limit 10
/<code>
清华、北大、985 高校教师之间有啥关系?Neo4j 创建知识图谱一查便知
  • 条件查询北京大学或清华大学教师的信息

<code>1match (p: People)
2where p.school="清华大学" or p.school="北京大学"
3return p.id, p.name, p.school
/<code>

2.关系查询

  • 查找清华大学隶属的级别

<code>1match (s: School {name: "清华大学"})-[:隶属]->(People)
2return s, People
/<code>
清华、北大、985 高校教师之间有啥关系?Neo4j 创建知识图谱一查便知
  • 查找清华大学的所有教师。该指令匹配学校节点类型为“清华大学”的节点,然后匹配该节点属于关系,并且教师指向该大学的节点,返回结果如下所示。

<code>1match (p)-[:属于]->(s: School {name: "清华大学"})
2return s, p
/<code>
清华、北大、985 高校教师之间有啥关系?Neo4j 创建知识图谱一查便知
  • 查找某个老师隶属于哪个大学,School或s仅表示一个变量。

<code>1match (p {name:"杨家海"})-[:属于]->(School)
2return School.name
3
4match (p {name:"杨家海"})-[:属于]->(s)
5return s.name
/<code>
清华、北大、985 高校教师之间有啥关系?Neo4j 创建知识图谱一查便知
  • 查找与“杨家海”老师同一个学校的老师

该指令匹配节点类型为People,属性为{name: “杨家海”}的节点,接着通过 [:属于] 关系指向的节点m,并同时匹配某个节点coPeople也通过关系 [:属于] 指向节点m,然后返回匹配节点m的name和school属性,输出结果如下图所示。

<code>1match (p: People {name: "杨家海"})-[:属于]->(m)2return coPeople.name, coPeople.school
/<code>
清华、北大、985 高校教师之间有啥关系?Neo4j 创建知识图谱一查便知
  • 查找与中国科学技术大学相关的教师

匹配节点类型为People的节点,然后匹配节点类型为School、节点属性为 {name: “中国科学技术大学”} 的节点,最后匹配他们两者之间存在的关系,将教师、关系类型和关系同时返回。

<code>1match(p:People)-[relateTo]-(s:School {name: "中国科学技术大学"})
2return p.name, type(relateTo), relateTo, s.name

/<code>
清华、北大、985 高校教师之间有啥关系?Neo4j 创建知识图谱一查便知

3.查询关系路径

  • 查找与“杨家海”老师存在3条及以内关系的老师和学校

<code>1match (p:People {name:"杨家海"})-[*1..3]-(s)
2return distinct s
/<code>
清华、北大、985 高校教师之间有啥关系?Neo4j 创建知识图谱一查便知
  • 查找老师“杨家海”和“王骞”之间的最短关系路径

下图有效展示了“杨家海”老师属于清华大学,二“王骞”老师属于武汉大学,他们均是985高校关联在一起。

<code>1match p=shortestPath(
2 (b:People {name:"杨家海"})-[*]-(m:People {name:"王骞"})
3)
4return p
/<code>
清华、北大、985 高校教师之间有啥关系?Neo4j 创建知识图谱一查便知

4.好友推荐

  • 查找没有与“杨家海”老师合作过的老师

    查找与“杨家海”老师没有合作,但是杨老师的合作伙伴曾经有或者或关系的老师,实现推荐。

  • 寻找的是cocoPeople 其中coPeople是中间人,“院士”。该题目寻找“院士”人物推荐给“杨家海”老师,其中关联是“”老师,他是清华大学的院士,出现次数排序。

<code>1match (p:People {name:"杨家海"})-[:属于]->(m)2 (coPeople)-[:是]->(m2)3where not (p)-[:属于]->(m2)
4return cocoPeople.name as Recommended, count(*) as len
5order by len desc
/<code>
清华、北大、985 高校教师之间有啥关系?Neo4j 创建知识图谱一查便知
  • 找人介绍清华大学的“杨家海”老师给武汉大学的“窦贤康”院士认识

<code>1match (p:People {name:"杨家海"})-[:属于]->(m)2 (coPeople)-[:是]->(m2)3return p, m, coPeople, m2, c
/<code>

由图可知:这个图是查找“杨家海”老师通过院士“吴建平”院士认识窦院士。

PS:后面如果做贵州旅游知识图谱,比如说去镇远,就能推荐黔东南景区或者贵州排名高的景区或全国古镇景区给游客。

清华、北大、985 高校教师之间有啥关系?Neo4j 创建知识图谱一查便知

原文链接:

https://blog.csdn.net/Eastmount/article/details/98208426


分享到:


相關文章: