自己動手寫NBA自動問答系統——數據存儲
公司舊電腦到期,換了一臺電腦的原因之前爬取的數據全部忘了備份,全部弄丟了。所以這個項目好久沒開工了。
本文需要進一步研究知識圖譜的數據存儲。由于知識圖譜的圖結構特點,使用傳統的關系型數據庫存儲大量的關系表,在做查詢的時候需要大量的表連接,速度非常慢,所以往往知識圖譜采用的是圖數據庫。
一、圖數據庫和關系型數據庫的差別
還是以NBA里的數據為例,為了表示球員和球隊的效力關系,關系型數據庫需要增加一張球員和球隊關系表來存儲這個關系。如下圖:
而圖數據庫通過引入“效力于”關系邊的概念來加以解決。不需要建表,關系邊上可以存儲屬性,比如效力時間這一字段。
工作中我們團隊的知識圖譜是存儲在阿里自研的圖數據庫上,鑒于數據安全問題,在這個項目里我采用了比較流行的neo4j圖數據庫。
二、Neo4J的使用
neo4j的使用,主要參考了官方文檔https://neo4j.com/docs/developer-manual/current/drivers/client-applications/。Neo4J設計了一種叫做Cypher的查詢語言,語法非常奇怪。官方提供的一個二跳的查詢例子,查詢John的朋友的朋友:
Query:
- MATCH(john{name:'John'})-[:friend]->()-[:friend]->(fof)RETURNjohn.name,fof.name
Result:
- +----------------------+
- | john.name | fof.name |
- +----------------------+
- | "John" | "Maria" |
- | "John" | "Steve" |
- +----------------------+
- 2 rows
我嘗試創建了一個NBA的DB,用create語句創建了NBA火箭隊、保羅和哈登三個實體。創建語句如下
創建了2個球員實體,包括了身高/體重/生日/合同情況,創建了一個球隊實體,包括了球館、城市等信息,創建了兩條球員和球隊的關系邊,每條邊上定義球員在該球隊效力時間。可視化結果如下圖:
OK,至此一個小的知識圖譜就在圖數據庫里被創建完畢了,后續要做的是把大規模數據導入圖數據庫