使用Python構(gòu)建紅樓夢人物知識圖譜

一、python環(huán)境準備
可詳細參考使用Python操作nNeo4j中python環(huán)境的搭建。
主要python庫如下:
Package Version
py2neo 2021.2.4二、數(shù)據(jù)準備
數(shù)據(jù)一共有4列,381行,命名為triples.csv:

- source:實體起點。比如Alice指向Bob,Alice是起點,箭頭開始的位置。

- target:實體起點。比如Alice指向Bob,Bob是終點,箭頭終止的實體。
- relation:實體間的關(guān)系。實體A與實體B的關(guān)系,但是要注意,實體關(guān)系是有指向的。比如A是B的父親,A指向B;B是A的兒子,此時就是B指向A。
- label:標簽。會將target列的實體打標簽,一個實體可以有多種標簽,可以類別一個人是有多重身份的。
數(shù)據(jù)解釋示例:
“賈代善”是“賈源”的son,“賈代善”的標簽是“子”;
“賈母”是“賈代善”的wife,“賈母”的標簽是“妻”;
三、代碼編寫
3.1 基礎(chǔ)庫的導入
import csv
from py2neo import Graph,Node,Relationshipcsv庫用來讀取triples.csv文件;
py2neo用來連接neo4j圖數(shù)據(jù)庫。
3.2 連接neo4j數(shù)據(jù)庫
# 連接 Docker 內(nèi)的 Neo4j
g = Graph("bolt://localhost:7687", auth=("neo4j", "neo4j1234"))此行代碼連接了neo4j圖數(shù)據(jù)庫,連接方式為bolt,由Neo4j圖形數(shù)據(jù)庫團隊創(chuàng)作,主要用于執(zhí)行數(shù)據(jù)庫查詢。
當然,也可以通過http協(xié)議進行連接,連接代碼如下:
g = Graph("http://localhost:7474", auth=("neo4j", "neo4j1234"))3.3 讀取數(shù)據(jù)文件
with open(r"C:\Users\admin\Desktop\triples.csv",'r',encoding='utf-8') as f:
reader=csv.reader(f)
# 遍歷每一行數(shù)據(jù)
for item in reader:
# 首行為表頭,不計入關(guān)系
if reader.line_num==1:
continue讀取triples.csv文件,'r'表示read,讀取文件,'encoding'表示數(shù)據(jù)編碼為utf-8。
使用csv.reader形成基于文件的迭代器對象,簡單來說就是可以通過reader遍歷每一行數(shù)據(jù)。
for item in reader就是遍歷每一行數(shù)據(jù)。
由于數(shù)據(jù)有表頭,因此首行不計入實體關(guān)系的建立。
3.4 定義實體與關(guān)系
對于基礎(chǔ)語法,可參考:使用Python操作Neo4j
# 定義起始節(jié)點
start_node=Node("Person",name=item[0])
# 定義終止節(jié)點
end_node=Node("Person",name=item[1])
# 定義起始節(jié)點指向終止節(jié)點的關(guān)系
relation=Relationship(start_node,item[3],end_node)
# 添加起始節(jié)點、終止節(jié)點、兩者關(guān)系
g.merge(start_node,"Person","name")
g.merge(end_node,"Person","name")
g.merge(relation,"Person","name")item表示某行數(shù)據(jù),以首行數(shù)據(jù)為例:
item[0]表示賈代善,item[1]表示賈源,item[2]表示son,item[3]表示子。

start_node定義為起始實體,實體的標簽定義為Person,name定義為source列的數(shù)據(jù);
end_node定義為終止實體,實體的標簽定義為Person,name定義為target列的數(shù)據(jù);
relation定義為start_node與end_node的關(guān)系item[3]。
對于以下代碼,表示在標簽為 Person 的節(jié)點中,通過 name 屬性值匹配 start_node。
g.merge(start_node,"Person","name")3.5 完整代碼如下
import csv
from py2neo import Graph,Node,Relationship
# 連接 Docker 內(nèi)的 Neo4j
g = Graph("bolt://localhost:7687", auth=("neo4j", "neo4j1234"))
with open(r"C:\Users\admin\Desktop\triples.csv",'r',encoding='utf-8') as f:
reader=csv.reader(f)
# 遍歷每一行數(shù)據(jù)
for item in reader:
# 首行為表頭,不計入關(guān)系
if reader.line_num==1:
continue
# 定義起始節(jié)點
start_node = Node("Person", name=item[0])
end_node = Node("Person", name=item[1])
# 定義起始節(jié)點指向終止節(jié)點的關(guān)系
relation = Relationship(start_node, item[2], end_node)
# 添加起始節(jié)點、終止節(jié)點、兩者關(guān)系
g.merge(start_node, "Person", "name")
g.merge(end_node, "Person", "name")
g.merge(relation, "Person", "name")四、圖數(shù)據(jù)庫查看
打開neo4j圖數(shù)據(jù)庫:http://localhost:7474/browser/


可以看到一共形成了388個實體,多種實體關(guān)系;
以賈寶玉實體為例,可以看到其復雜的人物關(guān)系。

五、圖數(shù)據(jù)庫擴展使用方向
在我們形成知識圖譜后,如何來應用呢?
在當前大模型不斷發(fā)展的情況下,可以考慮將復雜的關(guān)系喂給大模型,讓大模型自動分析,給出我們想要的結(jié)論。

































