獨孤信“第一岳父”之稱很形象,他有三個女兒做了三個朝代皇后,以及楊堅、楊廣、李淵等人關系,本文試著使用圖資料庫(neo4j)表達這段南北朝隋唐歷史北朝主要人物知識圖譜,

1. Neo4j與py2neo
neo4j目前是圖資料庫的主流,neo4j的Cypher語法簡單直觀,但是不便于流程化,如果習慣在python環境下處理資料,那么還是要用到python的neo4j庫,即py2neo.
py2neo本身并不復雜,但要先適應它的思考模式,另一個問題是py2neo檔案的示例較少,而且不同版本的py2neo挺不相同,容易弄混,本文基于Neo4j3.5.x及py2neo 2021.2.3,
創建neo4j圖資料庫有常用資料庫介面(py2neo )和資料庫語言(Cypher)兩種方法,本文重點采用python程式py2neo 方法,
安裝Pyhton操作Neo4j圖資料庫驅動介面
pip install py2neo
第一步:連接圖資料庫,
from py2neo import Graph,Node,Relationship
##連接neo4j資料庫,輸入地址、用戶名、密碼
graph = Graph('http://192.168.19.229:7474/',auth=('neo4j','1526') ) #username='neo4j',password='1526')
graph
Graph('http://192.168.19.229:7474')
2. 創建物體與關系
2.1. 創建節點Node
##創建結點
# 如果使用lable='',則是表示Property Keys
#person_node_1 = Node(label='person',name='李淵',dynasty=['隋朝','唐朝'],post=['唐高祖'])
person_node_1 = Node('person',name='李淵',dynasty=['隋朝','唐朝'],post='唐高祖')
person_node_2 = Node('person',name='李世民',dynasty=['隋朝','唐朝'],post='唐太宗')
person_node_3 = Node('person',name='獨孤曼陀',dynasty=['隋朝','北周'],post='元貞皇后')
person_node_4 = Node('person',name='楊廣',dynasty='隋朝',post='隋煬帝')
person_node_5 = Node('person',name='楊堅',dynasty=['隋朝','北周'],post='隋文帝')
person_node_6 = Node('person',name='獨孤伽羅',dynasty=['隋朝','北周'],post='文獻皇后')
person_node_7 = Node('person',name='獨孤信',dynasty=['西魏','北周'],post='柱國大將軍')
person_node_8 = Node('person',name='蕭皇后',dynasty=['梁朝','隋朝','唐朝'],post='皇后')
person_node_9 = Node('person',name='獨孤皇后',dynasty='北周',post='獨孤皇后')
person_node_10 = Node('person',name='宇文毓',dynasty='北周',post='周明帝')
2.2. 創建關系Relationship
R_12 = Relationship(person_node_1, '父子', person_node_2)
R_31 = Relationship(person_node_3, '母子', person_node_1)
R_36 = Relationship(person_node_3, '姊妹', person_node_6)
R_64 = Relationship(person_node_6, '母子', person_node_4)
R_56 = Relationship(person_node_5, '夫妻', person_node_6)
R_76 = Relationship(person_node_7, '父女', person_node_6)
R_73 = Relationship(person_node_7, '父女', person_node_3)
R_54 = Relationship(person_node_5, '父子', person_node_4)
R_48 = Relationship(person_node_4, '夫妻', person_node_8)
R_79 = Relationship(person_node_7, '父女', person_node_9)
R_90 = Relationship(person_node_10, '夫妻', person_node_9)
注,有新的寫法,源代碼中給出:
The positional arguments passed to the constructor identify the nodes to
relate and the type of the relationship. Keyword arguments describe the
properties of the relationship::>>> from py2neo import Node, Relationship >>> a = Node("Person", name="Alice") >>> b = Node("Person", name="Bob") >>> a_knows_b = Relationship(a, "KNOWS", b, since=1999)This class may be extended to allow relationship types names to be
derived from the class name. For example::>>> WORKS_WITH = Relationship.type("WORKS_WITH") >>> a_works_with_b = WORKS_WITH(a, b) >>> a_works_with_b (Alice)-[:WORKS_WITH {}]->(Bob)
2.3. 按事務管理,寫入/洗掉資料
2.3.1. 寫入/創建
# 事務開始
tx = graph.begin()
# 創建節點
tx.create(person_node_1)
tx.create(person_node_2)
tx.create(person_node_4)
tx.create(person_node_5)
tx.create(person_node_6)
tx.create(person_node_3)
tx.create(person_node_7)
tx.create(person_node_8)
tx.create(person_node_9)
tx.create(person_node_10)
# 創建關系
tx.create(R_12)
tx.create(R_31)
tx.create(R_36)
tx.create(R_64)
tx.create(R_56)
tx.create(R_76)
tx.create(R_73)
tx.create(R_54)
tx.create(R_48)
tx.create(R_79)
tx.create(R_90)
# (事務)提交資料
graph.commit(tx)
2.3.2. 洗掉
# 洗掉節點
#graph.delete(person_node_1)
#graph.delete(person_node_2)
如果使用delete洗掉關系,則將相關的節點也洗掉,
3. 增刪節點與關系
對于增刪操作,與傳統資料庫一樣,最好先判斷節點、關系是否存在,本文暫時不具體展開介紹,
3.1. 查詢節點補充建立關系
# 增補節點和關系
person_node_18 = Node('person',name='宇文闡',dynasty='北周',post='周靜帝')
# nodes = NodeMatcher(graph)
# 增補關系,先把節點查詢出來
node_p1 = graph.nodes.match('person',name='宇文泰').first()
node_p2 = graph.nodes.match('person',name='宇文毓').first()
node_p3 = graph.nodes.match('person',name='宇文赟').first()
node_p3
Node(‘person’, dynasty=‘北周’, name=‘宇文赟’, post=‘北周宣帝’)
node_d = graph.nodes.match('dynasty',name='北周').first()
node_d
Node(‘dynasty’, name=‘北周’, region=‘北朝’)
R_1 = Relationship(node_p1, '父子', node_p2)
R_2 = Relationship(node_p3, '父子', person_node_18)
RDP_1 = Relationship(person_node_18, '亡國',node_d )
tx = graph.begin()
tx.create(person_node_18)
tx.create(R_1)
tx.create(R_2)
tx.create(RDP_1)
graph.commit(tx)
打開瀏覽器,http://localhost:7474/browser/,將給出如下的圖,

這張圖有點問題,宇文泰是西魏權臣掌控者,在其去世后,由其侄子宇文護扶持其子宇文覺建立了北周,修改一下,
3.2. 洗掉錯誤的關系并修改
洗掉宇文泰與北周的關系,新建立與西魏的關系,其中,洗掉關系是指解除分離的含義,使用separate()斷開關系,
#查找北周的臣民
node_d = graph.nodes.match('dynasty',name='北周').first()
node_p1 = graph.nodes.match('person',name='宇文泰').first()
relation_1 = graph.match_one((node_d,node_p1),r_type='國人')
print(relation_1)
#graph.delete(relation_1) #將洗掉關系及相關的節點(node)
graph.separate(relation_1)
(北周)-[:國人 {}]->(宇文泰)
#補充關系
node_p1 = graph.nodes.match('person',name='宇文泰').first()
node_d1 = graph.nodes.match('dynasty',name='西魏').first()
node_p2 = graph.nodes.match('person',name='獨孤信').first()
RDP_1 = Relationship(node_d1, '國人', node_p1)
RDP_2 = Relationship(node_d1, '國人', node_p2)
tx = graph.begin()
tx.create(RDP_1)
tx.create(RDP_2)
graph.commit(tx)
修改后的效果圖如下所示,還是有些問題,歡迎讀者補充完善,

4. 關于基本常用查詢
4.1. 節點node查詢
node_d = graph.nodes.match('dynasty')
for rel in node_d:
print(rel['name'],rel['region'])
西魏 北朝
梁朝 南朝
隋朝 中國
唐朝 中國
北周 北朝
陳朝 南朝
node_d = graph.nodes.match('dynasty').where("_.region='北朝'")
for rel in node_d:
print(rel['name'],rel['region'])
西魏 北朝
北周 北朝
4.2. 關系Relationship查詢
#查詢關系是’國人‘的所有關系(relationship)
relation_1 = graph.match_one(r_type='國人')
relation_1
國人(Node('person', dynasty='陳朝', name='廣德公主', post='隋煬帝嬪妃'), Node('dynasty', name='陳朝', region='南朝'))
#查找北周的臣民,match(nodes=None,r_type,**properties)
#node順序為:開始節點,結束節點(可省略結束節點)
node_d = graph.nodes.match('dynasty',name='北周').first()
relation_1 = graph.match((node_d,),r_type='國人')
for rel in relation_1:
print(rel)
print(rel.start_node['name'], rel.end_node['name'], rel.end_node['post'])
relation_3 = graph.match_one((node_d,),r_type='國人')
print(relation_3)
node_p1
(北周)-[:國人 {}]->(宇文邕)
北周 宇文邕 北周武帝
(北周)-[:國人 {}]->(宇文泰)
北周 宇文泰 太師
(北周)-[:國人 {}]->(宇文赟)
北周 宇文赟 北周宣帝
(北周)-[:國人 {}]->(宇文毓)
北周 宇文毓 周明帝
(北周)-[:國人 {}]->(獨孤皇后)
北周 獨孤皇后 獨孤皇后
(北周)-[:國人 {}]->(獨孤伽羅)
北周 獨孤伽羅 文獻皇后
(北周)-[:國人 {}]->(獨孤曼陀)
北周 獨孤曼陀 元貞皇后
(北周)-[:國人 {}]->(獨孤信)
北周 獨孤信 柱國大將軍
(北周)-[:國人 {}]->(宇文邕)
Node('person', dynasty='西魏', name='宇文泰', post='太師')
5. 補充資料庫語言(Cypher)常用陳述句
- 洗掉所有內容,清空資料庫:
MATCH (n)
DETACH DELETE n
- 洗掉所有person節點,自動洗掉關系:
MATCH (n:person)
DETACH DELETE n
- 洗掉person和dynasty多種節點:
MATCH (n:person),(m:dynasty)
DETACH DELETE n,m
- 查詢多節點:
MATCH (n:dynasty),(m:person) RETURN n,m
- 提高查詢速度,創建索引:
CREATE INDEX ON :person(name)
6. 小結
在中國的歷史長河之中,歷史人物及其典故眾多,基于圖資料庫的知識圖譜將為我們學習、掌握歷史提供新思維,便于整理掌握,
關于知識圖譜的使用,后續將逐步展開學習,歡迎一起研究,
參考:
肖永威. Neo4j圖資料庫入門實踐. CSDN博客, 2021.10
The Py2neo Handbook, 2021.1
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/323375.html
標籤:其他
上一篇:數倉采集之環境搭建hadoop,zookeeper,kafka,flume
下一篇:spark安裝
