《红楼梦》人物关系知识图谱

背景:红楼梦以人物众多,人物关系复杂著称,自己又是忠实的小红迷,于是趁着这个机会想把红楼梦的知识图谱尝试构建一下
,从人物关系数据如下:


image.png

获取里面的实体
代码如下:

#-*- conding:utf-8 -*-
import pandas as pd
import numpy as np
f = open("红楼梦_triples.csv",encoding='utf-8')
df = pd.read_csv(f)
print(df['node'].value_counts())
# print(df['node'].unique)
a = df['node'].value_counts()
# a.to_csv("node.csv")
print(type(a))
# print(df['head'].unique)

然后通过python构建图数据库,代码如下 :

import pandas as pd
import numpy as np
from py2neo import Node,Relationship,Graph

g = Graph("http://localhost:7474",
          username='neo4j',
          password='012464998')

g.run("MATCH (n) OPTIONAL MATCH (n)-[r]-()DELETE n,r")
n = open("./data/node.csv",encoding='utf-8')
r = open("./data/红楼梦_triples.csv",encoding='utf-8')
data01 = pd.read_csv(n)
data02 = pd.read_csv(r)
#建立节点
for i in range(len(data01)):
    temp= Node("person",name=data01["node"][i])
    # g.create(temp)
for i in range(len(data02)):
    temp = Relationship(g.find_one(label="person",property_key='name',property_value=data02["head"][i]),data02['label'][i],
                        g.find_one(label="person", property_key='name', property_value=data02["tail"][i]))
    # g.create(temp)

print(len(data))
tus

刷新neo4j页面,得到效果如下:


image.png

image.png

进行查询
例如查询,贾宝玉的丫鬟都是谁有多少:

match (p: person {name:"贾宝玉"})-[k:丫鬟]-(r) return r,k,p

查询结果如下:

有17个丫鬟

返回图如下:

image.png
  • 利用图数据库来查询两个实体的最短路径:
    例如:查询贾宝玉和香菱之间的关系:
    MATCH (p1:person {name:"贾宝玉"}),(p2:person{name:"香菱"}),p=shortestpath((p1)-[*..10]-(p2))RETURN p
    结果:


    image.png

推荐阅读更多精彩内容