知识图谱——Neo4J的学习

知识图谱的学习,从Neo4J开始

前言

大三下学期开了《知识图谱》的课程,我寻思这东西正好能给我的Agent项目整个知识库,同时还能分担期末大作业的压力,一举多得啊。

安装

官网下载社区版安装包即可 https://neo4j.com/deployment-center/#community

当然,我选择用docker,Docker Hub搜索Neo4J直接pull即可。

img1

启动后在浏览器访问http://localhost:7474进入Neo4j Browser界面

默认账密为neo4j与neo4j

img2

语法

Neo4j自己的操作语句名为cql(对应sql),在控制台中有着对应的使用教程,以及第三方的教程https://www.w3cschool.cn/neo4j/

Neo4j的核心,又或是说它与其他数据库最不同的地方,在于节点标签与关系类型,即Node与Relationship,
在Neo4j中数据的主要存储形式为 (n:Label)-[:TYPE {name:value}]->(m:Label) 即 三元组
(n:Label)为第一个Node,(m:Label)为第二个node,[:TYPE {name:value}]表示二者之间的关系,->表示第一个指向第二个(而不是双向)。

例如 (小明:Person)-[喜欢{吃}]->(苹果:Item)

实例

初始化

就和正常的SQL一样,只不过不需要建库

graph即为操作的实例对象

1
2
3
4
5
6
7
8
9
10
11
12
13
from py2neo import Graph
from py2neo import Node, Relationship

# 连接到Neo4j数据库
graph = Graph("neo4j://localhost:7475", auth=("neo4j", "yourpassword"))

# 创建唯一性约束确保数据一致性
constraints = [
"CREATE CONSTRAINT person_name IF NOT EXISTS FOR (p:Person) REQUIRE p.name IS UNIQUE"
]

for constraint in constraints:
graph.run(constraint)

创建节点与关系

我这里做的情景是《红楼梦》的全部人物关系的三元组导入,txt的内容会放在文章最后

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def create_person(name):
person = Node("Person", name=name)
graph.merge(person, "Person", "name")
return person

def add_relationship(start_node, rel_type, end_node, **properties):
rel = Relationship(start_node, rel_type, end_node, **properties)
graph.create(rel)
return rel

with open("relation.txt", "r",encoding='utf-8') as f:
for line in f:
datas = line.split(',')
P1=create_person(datas[0])
P2=create_person(datas[1])
add_relationship(P1,datas[2],P2)

看看控制台

img3

其中将表示关系的MATCH p=()-[]->() RETURN p LIMIT 25; 的 “Limit 25” 删去即可查看完整的可视化关系图谱

img4

查询

这里仅列举两种,实际上还能有多种查询方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from py2neo import NodeMatcher
from py2neo import Graph

# 连接到Neo4j数据库
graph = Graph("neo4j://localhost:7475", auth=("neo4j", "yourpassword"))

query = """
MATCH (person1:Person)-[r]->(person2:Person)
WHERE person1.name = $name1 and person2.name = $name2
RETURN type(r)
"""
result = graph.run(query, name1="贾宝玉",name2="贾政")

print("贾宝玉->贾政的关系:"+str(result))

query = """
MATCH path = shortestPath(
(person1:Person)-[*]-(person2:Person)
)
WHERE person1.name = "贾宝玉" AND person2.name = "林黛玉"
RETURN path, nodes(path) AS nodes
"""
result = graph.run(query).to_data_frame()

print("\n贾宝玉到林黛玉的关联路径:")
print(result.iloc[0]['path'])
print(result.iloc[0]['nodes'])

输出:

1
2
3
4
5
6
7
8
9
10
11
12
贾宝玉->贾政的关系: type(r) 
---------
次子


贾宝玉到林黛玉的关联路径:
(贾宝玉)-[:次子
{}]->(贾政)-[:次子
{}]->(贾代善与贾母)<-[:幺女
{}]-(贾敏)-[:生母
{}]->(林黛玉)
[Node('Person', name='贾宝玉'), Node('Person', name='贾政'), Node('Person', name='贾代善与贾母'), Node('Person', name='贾敏'), Node('Person', name='林黛玉')]

红楼梦人物关系三元组txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
王嬷嬷,黛玉,奶娘
金文翔,鸳鸯,哥哥
金文翔,贾母,买办
金彩,鸳鸯,父
鲍二家的,鲍二,妻子
马尚,马魁,孙子
臻儿,香菱,丫鬟
陈瑞文,陈翼,孙子
李公子,长安府府太爷,小舅子
金哥,长安县大财主张姓,女儿
云儿,锦香院,妓女
金氏,金荣,姑妈
金氏,贾璜,妻
胡氏,金荣,母
贾璜,金氏,夫
王子腾,都太尉统制县伯,后
王子胜,都太尉统制县伯,后
王子胜,王子腾,弟
篆儿,邢岫烟,丫鬟
王善保家的,邢夫人,陪房
王善保家的,司棋,外祖母
邢岫烟,邢夫人,侄女
邢岫烟,薛蝌,妻
邢忠,邢夫人,兄
邢忠,邢岫烟,父
赵国基,赵姨娘,兄弟
小吉祥儿,赵姨娘,丫鬟
小鹊,赵姨娘,丫鬟
赖大的母亲,赖大,母亲
赖大的母亲,赖二,母亲
司棋,贾迎春,丫鬟
莲花儿,贾迎春,丫鬟
绣橘,贾迎春,丫鬟
翠云,贾赦,侍妾
贾琏,贾赦,子
贾琮,贾赦,子
邢夫人,贾赦,妻
贾迎春,贾赦,女
胡氏,贾蓉续娶,妻
许氏,贾蓉续娶,妻
许氏,贾蓉,续弦妻子
秦可卿,贾蓉,妻
娄氏,贾菌,母
周氏,贾芹,母
倪二,贾芸,邻居
卜世仁,贾芸,舅舅
卜世仁,香料铺,掌柜
王嫂子,贾芸,母
四姐,贾琼,妹妹
隆儿,贾琏,小厮
赵嬷嬷,贾琏,奶妈
赵嬷嬷,赵天梁,母
赵嬷嬷,赵天栋,母
王熙凤,贾琏,妻
昭儿,贾琏,小厮
昭儿,王熙凤,小厮
庆儿,贾琏,小厮
庆儿,王熙凤,小厮
王信,贾琏,小厮
王信,王熙凤,小厮
来旺,贾琏,仆人
来旺,王熙凤,仆人
贾巧姐,贾琏,女
贾巧姐,王熙凤,女
李纨,贾珠,妻
贾兰,贾珠与李纨,子
兴儿,贾珍,小厮
喜儿,贾珍,小厮
寿儿,贾珍,小厮
卐儿,贾珍和尤氏,丫鬟
贾蓉,贾珍,子
佩凤,贾珍,妾
偕鸾,贾珍,妾
文花,贾珍,妾
尤氏,贾珍,妻
钱槐,贾环,小厮
钱槐,赵姨娘,内侄
贾代善,贾源,长子
贾代善,贾宝玉,祖父
鸳鸯,贾母,丫鬟
琥珀,贾母,丫鬟
珍珠,贾母,丫鬟
玻璃,贾母,丫鬟
翡翠,贾母,丫鬟
鹦鹉,贾母,丫鬟
靛儿,贾母,丫鬟
傻大姐,贾母,丫头
贾珍,贾敬,子
贾惜春,贾敬,女
贾惜春,贾珍,胞妹
贾珠,贾政,长子
贾元春,皇宫中,贤德妃
傅试,贾政,门生
程日兴,贾政,清客相公
单聘仁,贾政,清客相公
卜固修,贾政,清客相公
胡斯来,贾政,清客相公
贾宝玉,贾政,次子
赵姨娘,贾政,妾
赵姨娘,探春,母
赵姨娘,贾环,母
周姨娘,贾政,妾
待书,贾探春,丫鬟
翠墨,贾探春,丫鬟
蝉姐,贾探春,丫鬟
入画,贾惜春,丫鬟
彩屏,贾惜春,丫鬟
贾敕,贾府,远房宗族
贾效,贾府,远房宗族
贾敦,贾府,远房宗族
贾珩,贾府,远房宗族
贾㻞,贾府,远房宗族
贾珖,贾府,远房宗族
贾琛,贾府,远房宗族
贾琼,贾府,远房宗族
贾璘,贾府,远房宗族
贾萍,贾府,远房宗族
贾菖,贾府,远房宗族
贾菱,贾府,远房宗族
贾蓁,贾府,远房宗族
贾藻,贾府,远房宗族
贾蘅,贾府,远房宗族
贾芬,贾府,远房宗族
贾芳,贾府,远房宗族
贾芝,贾府,远房宗族
贾荇,贾府,远房宗族
贾芷,贾府,远房宗族
小玄儿,贾府角门看门,小厮
钱华,贾府,买办
余信,贾府掌管寺庙月例银子,管家
柳家的,贾府做饭,佣人
柳家的,五儿,母
孙绍祖,贾府世交,后
孙绍祖,贾迎春,夫
贾代儒,贾瑞,祖父
茗烟,贾宝玉,小厮
锄药,贾宝玉,小厮
墨雨,贾宝玉,小厮
伴鹤,贾宝玉,小厮
扫花,贾宝玉,小厮
引泉,贾宝玉,小厮
挑芸,贾宝玉,小厮
双瑞,贾宝玉,小厮
双寿,贾宝玉,小厮
佳蕙,贾宝玉,小丫鬟
王荣,贾宝玉,仆人
钱启,贾宝玉,仆人
张若锦,贾宝玉,仆人
赵亦华,贾宝玉,仆人
茜雪,贾宝玉,丫鬟
晴雯,贾宝玉,丫鬟
四儿,贾宝玉,丫鬟
春燕,贾宝玉,丫鬟
媚人,贾宝玉,丫鬟
绮霰,贾宝玉,丫鬟
麝月,贾宝玉,丫鬟
檀云,贾宝玉,丫鬟
秋纹,贾宝玉,丫鬟
碧浪,贾宝玉,丫鬟
坠儿,贾宝玉,丫鬟
马道婆,贾宝玉寄名,干娘
抱琴,贾元春,丫鬟
史太君,贾代善,妻
贾敏,贾代善与贾母,幺女
贾敏,林黛玉,生母
贾敷,贾代化,长子
贾敷,贾敬,兄
贾敬,贾代化,次子
喜鸾,贾㻞,妹妹
蒋玉菡,贵顺亲王府,戏子
女先儿,说书,女艺人
山子野,设计大观园,园艺师
戚建辉,襄阳侯,孙
花母,袭人,母亲
花自芳,袭人,兄
夏金桂,薛蟠,妻
薛宝琴,薛蝌,妹
莺儿,薛宝钗,丫鬟
文杏,薛宝钗,丫鬟
小螺,薛宝琴,丫鬟
同喜,薛姨妈,丫头
同贵,薛姨妈,丫头
薛宝钗,薛姨妈,女
门子,葫芦庙,小和尚
多官,荣国府,酒头厨子
赖大,赖尚荣,父
赖尚荣,荣国府大管家赖大,子
林之孝,小红,父亲
贾源,贾宝玉,曾祖父
叶妈,茗烟,母亲
叶妈,大观园花草,佣人
叶妈,莺儿,干娘
石光珠,缮国公,孙子
戴良,管粮仓,头目
田妈,管理大观园谷物庄稼,佣人
祝妈,管理大观园竹林,佣人
秦业,秦可卿,养父
秦业,秦钟,父亲
瑞珠,秦可卿,丫鬟
宝珠,秦可卿,丫鬟
冯紫英,神武将军冯唐,子
神瑛侍者,贾宝玉,前身
绛珠仙子,受神瑛侍者甘露,恩
绛珠仙子,林黛玉,前身
张妈,看后门,佣人
张华,皇粮庄,庄头之后
吴贵妃,皇宫中,贵妃
薛蝌,皇商,子
薛蝌,薛姨妈,侄
小童,甄家,奴仆
严老爷,甄士隐,朋友
封肃,甄士隐,岳父
霍启,甄士隐家,奴仆
姣杏,甄士隐家,丫鬟
封氏,甄士隐,妻
香菱,甄士隐,女
香菱,后为薛蟠,妾
平儿,王熙凤,通房大丫鬟
丰儿,王熙凤,丫鬟
王仁,王熙凤,兄
王君效,王济仁,师祖
王夫人,王子腾,妹
王夫人,贾政,妻
周瑞,王夫人,陪房
周瑞,贾府掌管收取地租,管家
来喜家的,王夫人,陪房
玉钏,王夫人,丫鬟
玉钏,金钏,胞妹
金钏,王夫人,丫鬟
绣鸾,王夫人,丫鬟
绣凤,王夫人,丫鬟
彩云,王夫人,丫鬟
彩霞,王夫人,丫鬟
刘姥姥,王夫人父亲的连宗宗侄孙王成之子狗儿,岳母
薛姨妈,王夫人,妹
王成,狗儿,父
刘氏,狗儿,妻
刘氏,刘姥姥,女儿
板儿,狗儿,子
板儿,刘氏,子
青儿,狗儿,女
青儿,刘氏,女
牛继宗,牛清,孙子
净虚,水月庵,老尼姑
净虚,智能,师傅
净虚,智善,师傅
智能,水月庵,尼姑
杏奴,柳湘莲,小厮
柳芳,柳彪,孙子
柳五儿,柳嫂子,女
雪雁,林黛玉,小丫鬟
春纤,林黛玉,丫鬟
林黛玉,林如海与贾敏,女
林之孝家的,贾府中总领家事,媳妇
李婶娘,李纨,婶娘
素云,李纨,丫头
李绮,李纨娘,女
李守中,李纨,父
李纹,李婶娘,女
袭人,原为贾母,丫鬟
胡老爷,贾蓉,续妻胡氏之父
裘良,景田侯子,孙
拐子,拐卖英莲,人贩子
空空道人,抄录《石头记》,道人
张材家的,张材,妻
蒋子宁,平原侯,孙
尤老娘,尤氏,继母
尤老娘,尤二姐,母亲
尤老娘,尤三姐,母亲
尤二姐,尤氏,妹妹
银蝶,尤氏,丫鬟
炒豆儿,尤氏,丫鬟
尤三姐,尤二姐,妹妹
冯渊,小乡绅,子
渺渺真人,将顽石变成美玉,道人
渺渺真人,后回书中,跛足道人
茫茫大士,将顽石变成美玉,僧人
茫茫大士,后回书中,癞头僧人
李嬷嬷,宝玉,奶娘
李嬷嬷,李贵,母
李贵,宝玉,仆人
李贵,李嬷嬷,子
谢鲸,定城侯,孙
贾蔷,宁府,正派玄孙
焦大,宁国府里从小跟随宁国公,老仆人
俞禄,宁国府,小管家
秦钟,秦业,子
秦钟,秦可卿,弟
薛蟠,薛姨妈,子
贾赦,贾代善与贾母,长子
贾政,贾代善与贾母,次子
詹光,贾政,清客相公
贾瑞,贾代儒,孙
贾菌,娄氏,子
警幻仙子,太虚幻境,仙姑
痴梦仙姑,太虚幻境,仙姑
引愁金女,太虚幻境,仙姑
钟情大士,太虚幻境,仙姑
度恨菩提,太虚幻境,仙姑
王一贴,天齐庙,道士
宝蟾,夏金桂,陪房丫头
小舍儿,夏金桂,丫鬟
夏奶奶,夏金桂,母
冷子兴,周瑞,女婿
周瑞家的,周瑞,妻
周瑞家的,王夫人,陪房
周瑞家的,冷子兴,岳母
贾芹,周氏,子
贾芹,铁槛寺和尚道士,总管
吴天佑,吴贵妃,父
林如海,林黛玉,父
贾雨村,黛玉,老师
秦显家的,司棋,婶娘
秦显家的,荣国府上夜,佣人
潘又安,司棋,姑表弟
史湘云,史鼐,侄女
史湘云,史鼎,侄女
周奶娘,史湘云,奶妈
缕儿,史湘云,丫鬟
翠缕,史湘云,丫鬟
秋桐,贾赦,丫鬟
善姐,王熙凤,丫鬟
小红,贾宝玉,丫鬟
紫鹃,贾母,丫鬟
银姐,卜世仁,女
单大娘,单大良,妻
张友士,冯紫英,老师
傅秋芳,傅试,妹妹
史鼐,保龄侯尚书令史公,后
史鼎,保龄侯尚书令,后
史鼎,史鼐,弟
侯孝康,侯晓明,孙子
余信家的,余信,妻
小鸠儿,何婆,女儿
小鸠儿,春燕,妹妹
邢德全,邢夫人,胞弟
贾代化,贾演,长子
贾芸,五嫂子,儿子
多姑娘,多浑虫,妻
夏婆子,春燕,姨妈
夏婆子,藕官,干娘
何婆子,丫鬟春燕,母
何婆子,芳官,干娘
小霞,丫鬟彩霞,妹妹