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