相關文章
neo4j 圖資料庫初步調研 三元組、屬性圖、圖模型、超圖、RDF
demo項目(python+vue)
本文目錄
- 相關文章
- 一、技術關鍵字
- 二、前言
- 三、圖資料庫與傳統資料庫
-
- 1.反規範化
- 2.深度查詢性能對比
- 3.實體
-
- 1)關系型資料庫實體
- 2)圖資料庫實體
- 4.屬性
-
- 1)關系型資料庫實體屬性
- 2)圖資料庫實體屬性
- 5.類型
-
- 1)關系型資料庫類型
- 2)圖資料庫類型
- 6.關系
-
- 1)關系型資料庫關系
- 2)圖資料庫關系
- 7.其他
-
- 1)域
- 2)值
一、技術關鍵字
neo4j
二、前言
因公司需要,本人對圖資料庫進行調研,最終決定使用python+neo4j進行初始項目簡單搭建。
本人為前端開發,因公司業務,進行技術調研,部分博文内容與後端實際不符,請見諒。
本博文主要介紹neo4j,文法與py2neo使用等将在後續逐漸完善并釋出。
三、圖資料庫與傳統資料庫
圖資料庫與傳統資料庫最大不同是,字段是“自由”的,每個字段(除id)都是可以随意增減的,以人為例:
1.反規範化
為了讓關系型資料庫在處理正常應用請求時表現良好,我們不得不抹去領域真正的樣子,而去接受我們修改使用者資料模型是為了适應資料庫引擎而不是使用者者現實,這種技術叫做反規範化。
人們為了獲得查詢性能,反規範化在某些情況下,會人為地制造重複資料。就拿使用者和他們的聯系方式來說:一個使用者可能擁有多個手機号或郵箱,在标準資料模型中,我們可能需要把聯系方式單獨建表來存儲單使用者多手機号的情況,亦或者標明一個手機号将其存入使用者庫的phoneNum字段,但在圖資料庫中,此類資料可以存為某個使用者節點的屬性亦或使用者節點的附屬節點
2.深度查詢性能對比
圖模型在處理權重路徑規劃(例如導航規劃),處理實體關系模型(例如社交網絡為主的FaceBook等)都較為優勢,對于圖模型來說,多條件查詢不再是對于資料庫全量資料的對比,而是每次篩選有效資料,如同過濾塞一樣,将資料塞出來
在關系型資料庫和neo4j中尋找擴充朋友的性能對比(查詢朋友的朋友,朋友的朋友的朋友等等)
深度 | 關系型資料庫的執行時間(s) | Neo4j的執行時間(s) | 傳回的記錄條數 |
---|---|---|---|
2 | 0.016 | 0.01 | ~2500 |
3 | 30.267 | 0.168 | ~110 000 |
4 | 1543.505 | 1.359 | ~600 000 |
5 | 未完成 | 2.132 | ~800 000 |
3.實體
實體是對客觀個體的抽象,一個人、一部電影、一句話都可以看作是一個實體。例如:張三與李四均有姓名,年齡,身份證号,住址等字段,根據業務配上車輛,房産字段(假如車、房 資料隻入庫一條)那麼:
1)關系型資料庫實體
傳統關系型資料庫中則其模型如下
身份證 | 姓名 | 年齡 | 住址 | 車 | 房 |
---|
但是當資料落庫時,并不一定是按照全量資料落庫的,即業務實際場景中資料為:
身份證 | 姓名 | 年齡 | 住址 | 車 | 房 |
---|---|---|---|---|---|
1 | 張三 | 20 | 公司 | null | null |
2 | 李四 | 50 | 家裡 | 京A00001 | 天安門 |
由此可見當資料為空時,也會有null占位資料
2)圖資料庫實體
李四 | 張三 |
---|---|
{“name”:“張三”,“id”:“1”,“住址”:“公司”} | {“name”:“李四”,“id”:“2”,“住址”:“家裡”,“車”:“京A00001”,“房”:“天安門”} |
![]() | |
圖資料庫資料屬性是可以根據字段進行落庫
4.屬性
1)關系型資料庫實體屬性
對于單個資料來說,每個字段都是一個屬性,與其他資料的屬性根據定義來落庫或關聯其他庫表
2)圖資料庫實體屬性
圖資料庫中不僅實體有屬性,實體與其他實體之間的關系也是有屬性的,如下圖:
(張三)-[借錢]->(李四)
其中不僅有來源(start),去向(end),關系(type),
也有對于這段關系的描述num,借的100
根據業務,也可以增加其他相關屬性,例如借出時間,付款方式等等等等,而無需與其他資料進行關聯
5.類型
類型是對具有相同特點或屬性的實體集合的抽象。
舉例:張三李四都屬于人類型,中國美國都屬于國家類型
1)關系型資料庫類型
根據類型落庫,即人落人庫,國落國庫
身份證 | 姓名 | 年齡 | 住址 | 車 | 房 |
---|---|---|---|---|---|
1 | 張三 | 20 | 公司 | null | null |
2 | 李四 | 50 | 家裡 | 京A00001 | 天安門 |
國家代碼 | 國家名 | 首都 | 人口 | 面積 |
---|---|---|---|---|
CHN | 中國 | 北京 | 14.13億 | 陸地面積約960萬平方公裡,水域面積約470多萬平方公裡 |
USA | 美國 | 華盛頓哥倫比亞特區 | 3.3億人 | 963萬平方公裡 |
2)圖資料庫類型
在落庫後可以對已有資料進行定義類型,或者建立資料時定義,并且一條資料可以有多個類型存在
例如
李四:人,張三:人
美國:國家,中國:國家
特例:
新加坡:國家,城市
李四 | 張三 | 美國 | 中國 | 新加坡 |
---|---|---|---|---|
| | | | |
新加坡在資料上既是國家又是城市,同時擁有兩種資料類型
6.關系
關系是實體與實體之間關系的抽象,例如: 張三→屬于→中國
1)關系型資料庫關系
一般業務就是留一個字段作為處理關聯(外鍵)
身份證 | 姓名 | 年齡 | 住址 | 車 | 房 | 國籍國家代碼 | 朋友ID |
---|---|---|---|---|---|---|---|
1 | 張三 | 20 | 公司 | null | null | CHN | 2 |
2 | 李四 | 50 | 家裡 | 京A00001 | 天安門 | CHN | 1 |
國家代碼 | 國家名 | 首都 | 人口 | 面積 |
---|---|---|---|---|
CHN | 中國 | 北京 | 14.13億 | 陸地面積約960萬平方公裡,水域面積約470多萬平方公裡 |
USA | 美國 | 華盛頓哥倫比亞特區 | 3.3億人 | 963萬平方公裡 |
當處理一對一資料、跨表資料時,是比較友善的,但是業務邏輯變更為一對多,或者多對一時,需要的工作量是比較大的
2)圖資料庫關系
圖資料庫則是定義每個資料與其他資料的關系,即可以與其他類型資料定義,也可以與本類型定義
例如
(張三)-[屬于]->(中國)
(張三)-[朋友]->(李四)
(李四)-[朋友]->(張三)
(張三)-[了解]->(張三)
(張三)-[喜歡]->(張三)
(張三)-[借錢]->(李四)
如上資料結構:張三屬于中國,張三和李四互為朋友,并且張三還借李四錢,張三喜歡自己,張三也了解自己(自戀,指向自己,實在沒想好用什麼詞)
7.其他
調研期間,對于以下概念認為對于入門可以暫時不考慮(就是 本人沒有想好怎麼處理,忘了)
1)域
域是類型的集合,淩駕于類型之上,是對某一領域所有類型的抽象,例如:國家是對中國、美國這樣實體的一種抽象,是一種類型,而一個地理位置除了國家類型之外,還包括其他類型:城市、區域、洲等等,而把這些所有類型:洲、國家、城市、區域等類型抽象起來,就形成了地理位置域。
2)值
屬性的具體值,屬性是key,值是value