[知识图谱构建] 三.Neo4j创建高校教师关系图谱及查询语句入门详解

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Eastmount/article/details/98208426

该系列文章主要讲解知识图谱及Neo4j图数据库的用法,本篇文章是作者学习《Neo4j基础入门》书籍的在线笔记,同时以高校网络安全方向教师的关系图谱为例,重点介绍了图数据库查询语句的基本用法。
非常基础的文章,希望大家喜欢,尤其是研究自然语言处理和知识图谱的同学。同时,从今天起,博客的代码尽量上传到Github和CSDN下载,可惜现在CSDN不能设置免费下载了。

Neo4j图数据库系列:
[知识图谱构建] 一.Neo4j图数据库安装初识及药材供应图谱实例
[知识图谱构建] 二.《Neo4j基础入门》基础学习之创建图数据库节点及关系

Python知识图谱构建系列:
[Python知识图谱] 一.哈工大pyltp安装及中文分句、中文分词、导入词典基本用法
[Python知识图谱] 二.哈工大pyltp词性标注、命名实体识别、依存句法分析和语义角色标注
[Python知识图谱] 三.Jieba工具中文分词、添加自定义词典及词性标注详解

知识图谱实例系列:
[知识图谱实战篇] 一.数据抓取之Python3抓取JSON格式的电影实体
[知识图谱实战篇] 二.Json+Seaborn可视化展示电影实体
[知识图谱实战篇] 三.Python提取JSON数据、HTML+D3构建基本可视化布局
[知识图谱实战篇] 四.HTML+D3+CSS绘制关系图谱
[知识图谱实战篇] 五.HTML+D3添加鼠标响应事件显示相关节点及边
[知识图谱实战篇] 六.HTML+D3实现点击节点显示相关属性及属性值
[知识图谱实战篇] 七.HTML+D3实现关系图谱搜索功能
[知识图谱实战篇] 八.HTML+D3绘制时间轴线及显示实体


一.知识图谱

构建的知识图谱效果如下图所示,涉及教师实体、高校实体、高校圈实体和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

id,school,college,name,rank,title,degree,graduation,research,email
1,北京大学,计算机科学技术研究所,肖建国,教授,NULL,硕士,北京大学,图形与图像处理技术;网络与信息安全技术,xiaojianguo@pku.edu.cn 
2,清华大学,网络科学与网络空间研究院,吴建平,教授,院士,NULL,NULL,NULL,NULL
3,清华大学,网络科学与网络空间研究院,李星,教授,NULL,NULL,NULL,NULL,NULL
4,清华大学,网络科学与网络空间研究院,毕军,教授,长江学者特聘教授,博士,清华大学,新型网络体系结构领域;IPv6源地址验证;软件定义网SDN和网络功能虚拟化NFV;互联网路由,junbi@tsinghua.edu.cn
5,清华大学,网络科学与网络空间研究院,段海新,教授,NULL,博士,清华大学,网络安全;网络测量;入侵检测;漏洞挖掘;物联网安全;互联网治理,duanhx@tsinghua.edu.cn
6,清华大学,网络科学与网络空间研究院,杨家海,教授,NULL,博士,清华大学,IPv6及新一代互联网体系结构;互联网络管理;网络测量与网络空间安全;云计算、虚拟化及资源管理调度,yang@cernet.edu.cn
7,清华大学,网络科学与网络空间研究院,王之梁,副教授,NULL,博士,清华大学,网络协议形式化验证与测试;新一代互联网体系结构;互联网路由体系结构及协议;软件定义网络SDN;网络测量与监测;网络安全,wzl@cernet.edu.cn
8,清华大学,网络科学与网络空间研究院,张超,副教授,国家“千人计划”青年项目,博士,北京大学,软件与系统安全;漏洞、攻防、恶意代码;AI与安全;物联网及区块链等应用安全;软件分析、虚拟化等技术,chaoz@tsinghua.edu.cn
9,清华大学,网络科学与网络空间研究院,李琦,副教授,NULL,博士,清华大学,互联网和云安全、移动安全;机器学习与安全、大数据安全;区块链与安全,qli01@tsinghua.edu.cn
10,武汉大学,国家网络安全学院,吴黎兵,教授,NULL,博士,武汉大学,"并行分布计算,大数据安全",wu@whu.edu.cn
11,武汉大学,国家网络安全学院,窦贤康,教授,院士,博士,法国巴黎第七大学,高层大气理论、观测与实验综合研究,dou@ustc.edu.cn
12,武汉大学,国家网络安全学院,杜瑞颖,教授,NULL,博士,武汉大学,网络安全、隐私保护,duraying@126.com
13,武汉大学,国家网络安全学院,崔晓晖,教授,湖北省“百人计划”,博士, 路易斯维尔大学,大数据分析、人工智能、区块链、高性能计算,xcui@whu.edu.cn
14,武汉大学,国家网络安全学院,陈刚,教授,NULL,博士,武汉大学,网络安全、Web技术与应用、人工智能,chenzuolin@whu.edu.cn
15,武汉大学,国家网络安全学院,董红斌,教授,NULL,博士,NULL,"Web搜索与挖掘,安防应急,大数据安全",hbdong@whu.edu.cn
16,武汉大学,国家网络安全学院,姬东鸿,教授,武汉大学“珞珈青年学者”,博士,武汉大学;牛津大学,自然语言处理、社会计算、深度学习、大数据平台和对话机器人。实验室既强调前沿研究,也强调应用研究。,dhji@whu.edu.cn
17,武汉大学,国家网络安全学院,何德彪,教授,武汉大学“珞珈青年学者”,博士,武汉大学,应用密码学、区块链安全、云计算安全、物联网安全,hedebiao@whu.edu.cn
18,武汉大学,国家网络安全学院,王骞,教授,国家“青年千人计划”,博士,伊利诺伊理工大学,人工智能安全、云计算安全与隐私、无线系统安全与移动感知、应用密码学,qianwang@whu.edu.cn
19,武汉大学,国家网络安全学院,傅建明,教授,NULL,博士,武汉大学,逆向分析,恶意代码检测,漏洞分析与防御,软件评估和安全加固, 网络安全,jmfu@whu.edu.cn
20,武汉大学,国家网络安全学院,王丽娜,教授,国务院政府特殊津贴获得者,博士,东北大学,网络安全,系统安全,人工智能安全,lnwang@whu.edu.cn
21,武汉大学,国家网络安全学院,唐明,教授,NULL,博士,武汉大学,密码学,信息安全,密码芯片安全,密码系统安全,m.tang@126.com
22,武汉大学,国家网络安全学院,彭国军,教授,武汉大学“珞珈青年学者”。,博士,武汉大学,网络与信息系统安全、恶意软件分析与检测、软件漏洞、可信软件等,guojpeng@whu.edu.cn
23,武汉大学,国家网络安全学院,叶登攀,教授,NULL,博士,南京理工大学,大数据多媒体安全,机器学习与隐私保护,网络安全感知与防御,网络空间隐匿对抗,yedp@whu.edu.cn
24,武汉大学,国家网络安全学院,陈晶,教授,武汉市黄鹤英才,珞珈青年学者,博士,华中科技大学,大数据安全、云安全、移动安全、网络安全、身份认证与管理、区块链,chenjing@whu.edu.cn
25,武汉大学,国家网络安全学院,李俊娥,教授,NULL,博士,武汉大学,计算机网络体系结构、网络与信息安全、网络性能与服务质量、电网信息物理系统,jeli@whu.edu.cn
26,武汉大学,国家网络安全学院,王志波,教授,NULL,博士,浙江大学,物联网、移动感知与计算、大数据、网络安全与隐私保护、人工智能安全,zbwang@whu.edu.cn
27,武汉大学,国家网络安全学院,赵波,教授,NULL,博士,武汉大学,密码学应用、信息系统安全、可信计算、嵌入式系统及云计算安全、网络安全技术,zhaobo@whu.edu.cn
28,中国科学技术大学,网络空间安全学院,吴曼青,教授/博导,院士,NULL,NULL,网络信息安全;大数据安全,qcmr@ustc.edu.cn
29,中国科学技术大学,网络空间安全学院,郭光灿,教授/博导,院士,NULL,NULL,量子信息;量子光学;信息安全,gcguo@ustc.edu.cn

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

LOAD CSV WITH HEADERS  FROM "file:///people.csv" AS line
MERGE (p:People{id:line.id,name:line.name,school:line.school,
	college:line.college,rank:line.rank,title:line.title,
	degree:line.degree,graduation:line.graduation,
	research:line.research,email:line.email})

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

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

id,name,ename,type
s1,北京大学,Peking University,985
s2,清华大学,Tsinghua University,985
s3,武汉大学,Wuhan University,985
s4,中国科学技术大学,University of Science and Technology of China,985

执行命令如下:

LOAD CSV WITH HEADERS  FROM "file:///school.csv" AS line
MERGE (p:School{id:line.id,name:line.name,ename:line.ename,type:line.type})

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

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

id,name
c1,中国985高校
c2,中国211高校
c3,中国双一流高校

执行命令如下:

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

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

id,name
t1,院士
t2,长江学者

执行命令如下:

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

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


3.创建实体间关系

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

from_id,type,to_id
1,属于,s1
2,属于,s2
3,属于,s2
4,属于,s2
5,属于,s2
6,属于,s2
7,属于,s2
8,属于,s2
9,属于,s2
10,属于,s3
11,属于,s3
12,属于,s3
13,属于,s3
14,属于,s3
15,属于,s3
16,属于,s3
17,属于,s3
18,属于,s3
19,属于,s3
20,属于,s3
21,属于,s3
22,属于,s3
23,属于,s3
24,属于,s3
25,属于,s3
26,属于,s3
27,属于,s3
28,属于,s4
29,属于,s4

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

LOAD CSV WITH HEADERS FROM "file:///rel-ps.csv" AS line
match (from:People{id:line.from_id}),(to:School{id:line.to_id})
merge (from)-[r:属于{type:line.type}]->(to)

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

from_id,type,to_id
s1,隶属,c1
s2,隶属,c1
s3,隶属,c1
s4,隶属,c1

CQL导入关系代码如下:

LOAD CSV WITH HEADERS FROM "file:///rel-sc.csv" AS line
match (from:School{id:line.from_id}),(to:China{id:line.to_id})
merge (from)-[r:隶属{type:line.type}]->(to)

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

from_id,type,to_id
2,是,t1
11,是,t1
28,是,t1
29,是,t1
4,是,t2

CQL导入关系代码如下:

LOAD CSV WITH HEADERS FROM "file:///rel-sc.csv" AS line
match (from:School{id:line.from_id}),(to:China{id:line.to_id})
merge (from)-[r:隶属{type:line.type}]->(to)

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


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

call db.schema

显示结果如下图所示:

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

// 删除节点及关系
MATCH (n)-[r]-()
DELETE n,r
match(n) return n

// 删除关系
MATCH (n)-[r]-()
DELETE r

// 单纯删除所以节点
match (n)
delete n

二.查询语句

1.节点信息查询

  • match指令查找匹配条件{name: “杨家海”}的节点信息,可以看到返回的节点及其属性。
match (people {name: "杨家海"}) return people
  • 查询10个教师的姓名属性
match (p: People) return p.name limit 10
  • 条件查询北京大学或清华大学教师的信息
match (p: People)
where p.school="清华大学" or p.school="北京大学"
return p.id, p.name, p.school

2.关系查询

  • 查找清华大学隶属的级别
match (s: School {name: "清华大学"})-[:隶属]->(People)
return s, People
  • 查找清华大学的所有教师。该指令匹配学校节点类型为“清华大学”的节点,然后匹配该节点属于关系,并且教师指向该大学的节点,返回结果如下所示。
match (p)-[:属于]->(s: School {name: "清华大学"})
return s, p
  • 查找某个老师隶属于哪个大学,School或s仅表示一个变量。
match (p {name:"杨家海"})-[:属于]->(School)
return School.name

match (p {name:"杨家海"})-[:属于]->(s)
return s.name
  • 查找与“杨家海”老师同一个学校的老师
    该指令匹配节点类型为People,属性为{name: “杨家海”}的节点,接着通过 [:属于] 关系指向的节点m,并同时匹配某个节点coPeople也通过关系 [:属于] 指向节点m,然后返回匹配节点m的name和school属性,输出结果如下图所示。
match (p: People {name: "杨家海"})-[:属于]->(m)<-[:属于]-(coPeople)
return coPeople.name, coPeople.school
  • 查找与中国科学技术大学相关的教师
    匹配节点类型为People的节点,然后匹配节点类型为School、节点属性为 {name: “中国科学技术大学”} 的节点,最后匹配他们两者之间存在的关系,将教师、关系类型和关系同时返回。
match(p:People)-[relateTo]-(s:School {name: "中国科学技术大学"})
return p.name, type(relateTo), relateTo, s.name

3.查询关系路径

  • 查找与“杨家海”老师存在3条及以内关系的老师和学校
match (p:People {name:"杨家海"})-[*1..3]-(s)
return distinct s
  • 查找老师“杨家海”和“王骞”之间的最短关系路径
    下图有效展示了“杨家海”老师属于清华大学,二“王骞”老师属于武汉大学,他们均是985高校关联在一起。
match p=shortestPath(
	(b:People {name:"杨家海"})-[*]-(m:People {name:"王骞"})
)
return p

4.好友推荐

  • 查找没有与“杨家海”老师合作过的老师
    查找与“杨家海”老师没有合作,但是杨老师的合作伙伴曾经有或者或关系的老师,实现推荐。
  • 寻找的是cocoPeople 其中coPeople是中间人,“院士”。该题目寻找“院士”人物推荐给“杨家海”老师,其中关联是“”老师,他是清华大学的院士,出现次数排序。
match (p:People {name:"杨家海"})-[:属于]->(m)<-[:属于]-(coPeople),
	(coPeople)-[:是]->(m2)<-[:是]-(cocoPeople)
where not (p)-[:属于]->(m2)
return cocoPeople.name as Recommended, count(*) as len
order by len desc
  • 找人介绍清华大学的“杨家海”老师给武汉大学的“窦贤康”院士认识
match (p:People {name:"杨家海"})-[:属于]->(m)<-[:属于]-(coPeople), 
	(coPeople)-[:是]->(m2)<-[:是]-(c: People {name:"窦贤康"})
return p, m, coPeople, m2, c

由图可知:这个图是查找“杨家海”老师通过院士“吴建平”院士认识窦院士。
PS:后面如果做贵州旅游知识图谱,比如说去镇远,就能推荐黔东南景区或者贵州排名高的景区或全国古镇景区给游客。


三.总结

希望这篇基础性文章对你有所帮助,如果有错误或不足之处,还请海涵。后续将分享更多网络安全方面的文章了,从零开始很难,但秀璋会一路走下去的,加油。

故人应在千里外,
不寄梅花远信来。
武汉第一周学习结束,寄了第一封家书给女神,接下来这几年,应该会写上200来封吧,很期待,也很漫长,但我俩的故事将继续书写。

未来的路还很长,优秀的人真的太多,我们只有做好自己,不忘初心,享受生活,砥砺前行。明天周末继续奋斗,晚安娜,记得收信。

(By:杨秀璋 2019-08-02 周五晚8点写于武大 https://blog.csdn.net/Eastmount )

展开阅读全文

没有更多推荐了,返回首页