解惑图数据库!你知道什么是图数据库吗?
簡介
為什么需要圖數據庫?
設想一個場景:在金融的反欺詐場景下,當一個用戶小李 請求訂單,我們可以設定一個規則:
獲取該用戶的身份證號、注冊手機號、銀行預留手機號、銀行卡號、緊急聯系人等信息
通過這些信息去關聯包含這些信息的用戶集合小王、小張、小天
通過對關聯出的小王、小張、小天判斷黑名單用戶、逾期用戶、授信拒絕等信息綜合判定一個分數
然后根據這個分數對小李 判定是否授信通過;
為了更加有效果我們可以小王、小張、小天作為源用戶列表再獲取這些用戶的2度關聯用戶小小、小大,獲取一個綜合評分,和一度關聯的用戶綜合評分共同參考,來判定這個userA到底該不該授信通過,借錢給他,如下圖:
基于上述場景,我們首先先考慮使用關系型數據庫:一個用戶表存儲用戶詳情,上述過程我們需要
從接口入參獲取小李的各種信息
通過小李的各種信息去表中查詢出對應數據
再根據查出的一度用戶去表中查詢二度用戶,那如果要查多度呢,如果想要獲取用戶的其他信息呢,就要join,多表join、多次join想想就刺激~
那么,基于圖論的圖數據庫就誕生了,詳細的我們下面再介紹,先基于將數據存儲到圖庫中,用戶做為節點、用戶與用戶之間的關系作為邊、用戶的其他屬性作為節點的屬性,類似于下圖;
那么用圖庫該怎么查呢?我們就以一種圖庫查詢語言gremlin來實現:
g.V().has('user_name',"小李").both("user_friend").both("user_friend").both("user_friend").bothV().has('sex','男')一句話搞定,不用多次查詢、圖庫幫你搞定~ ?多度查詢輕松拈來
ps :具體圖庫底層數如何存儲、查詢邏輯、圖庫架構等 歡迎關注我~ 后續系列文章會出~
總結一下,圖庫在特定場景下的優點:
高性能:隨著數據量的增多和關聯深度的增加,傳統關系型數據庫受制于檢索時需要多個表之間連接操作,數據寫入時也需考慮外鍵約束,從而導致較大的額外開銷,產生嚴重的性能問題。而圖模型固有的數據索引結構,使得它的數據查詢與分析速度更快。
靈活:圖數據庫有非常靈活的數據模型,使用者可以根據業務變化隨時調整數據模型,比如任意添加或刪除頂點、邊,擴充或者縮小圖模型這些都可以輕松實現,這種頻繁的 Schema 更改在關系型數據庫上不能到很好的支持。
敏捷:圖數據庫的圖模型非常直觀,支持測試驅動開發模式,每次構建時可進行功能測試和性能測試,符合當今最流行的敏捷開發需求,對于提高生產和交付效率也有一定幫助。
圖數據庫
圖形數據庫是NoSQL數據庫的一種類型,起源于歐拉理論和圖理論,也可稱為面向/基于圖的數據庫,對應的英文是Graph Database。
它應用圖形理論存儲實體之間的關系信息;圖數據庫的基本含義是以“圖”這種數據結構做為邏輯結構存儲和查詢數據。
我們知道一個圖包含節點和邊,如下圖:
在圖數據庫中圖將實體表現為節點,實體與其他實體連接的方式表現為聯系(邊)。我們可以用這個通用的、富有表現力的結構來建模各種場景,從宇宙火箭的建造到道路系統,從食物的供應鏈及原產地追蹤到人們的病歷,甚至更多其他的場景。
例如,實體:類似于用戶、用戶的親屬等作為一個節點存在于圖中,邊:用戶和用戶親屬之間關聯的關系,小李--->小李的父親,這兩個節點之間的邊可以設定為“用戶父母”的邊;
主流圖數據庫
目前主流的圖數據庫有:Neo4j,Janusgraph,Dgraph,Giraph,TigerGraph等。
ps : 這里我們只看 database model專用支持graph類型的圖庫
受歡迎程度如下,時間是:2020-5月
簡單介紹一下Neo4j 和 Janusgraph區別:
Neo4j:
Neo4J使用原生的圖存儲,以高度自由且規范的方式管理和存儲數據。對比非原生圖解決方案中,隨著信息量的增加,使用面向對象的數據庫存儲數據庫使數據操作變得越來越慢。
Neo4J可以以每秒一百萬條的驚人速度提供結果,因為數據中的鏈接部分或實體在物理上是已經相互連接的。
Neo4J的另一個特點是ACID事務,它確保實時顯示數據的合法性和準確性,這是企業級應用的重要特性。
單擊不收費,集群收費,所以對于不想要花大價錢買的話,這個不推薦;如果不差錢,強烈推薦使用,社群活躍,服務穩定,功能強大
Janusgraph:
開源的分布式圖數據庫,采用第三方存儲作為底層存儲,如:HBase、Cassandra等
使用第三方框架支持全文匹配、范圍匹配等,如Es等
集群節點可以線性擴展,以支持更大的圖和更多的并發訪問用戶。
數據分布式存儲,并且每一份數據都有多個副本,因此,有更好的計算性能和容錯性。
原生集成Apache TinkerPop圖技術棧,包括Gremlin graph query language、Gremlin graph server、Gremin applications。
免費開源,我們現在正在使用的就是這個
下面就以JanusGraph為例來初探圖數據庫的設計
JanusGraph
可以看下官網上的解釋:
JanusGraph is a scalable graph database optimized for storing and querying graphs containing hundreds of billions of vertices and edges distributed across a multi-machine cluster. JanusGraph is a transactional database that can support thousands of concurrent users executing complex graph traversals in real time.
JanusGraph是一個可擴展的圖形數據庫,專門用于存儲和查詢分析分布在多機集群中的數千億個頂點和關系邊的圖形。
JanusGraph是一個事務數據庫,可以支持數千個并發用戶實時執行復雜的圖遍歷。
歷史
- JanusGraph是2016年12月27日從Titan fork出來的一個分支,之后TiTan的開發團隊在2017年陸續發了0.1.0rc1、0.1.0rc2、0.1.1、0.2.0等四個版本,最新的版本是2017年10月12日。 
- titan是從2012年開始開發,到2016年停止維護的一個分布式圖數據庫。最初在2012年啟動titan項目的公司是Aurelius,2015年此公司被 DataStax(DataStax是開發apache Cassandra 的公司)收購,DataStax公司吸收了TiTan的圖存儲能力,形成了自己的商業產品DataStax Enterprise Graph。 
- TiTan開發者們希望把TitTan放到Apache Software Foundation下,不過,DataStax不愿意這樣做,而且自從2015年9月DataStax收購了Titan的母公司后,TiTan一直處于停滯狀態,鑒于此,2016年6月,TiTan的開發者們fork了一個TiTan的分支,重命名為JanusGraph,并將其置于Linux Software Foundation下。 
- 2017年4月6日發布了第一個版本0.1.0-rc1,目前最新版本是2020年05月27日發布的0.6版 
JanusGraph項目啟動的初衷是“通過為其增加新功能、改善性能和擴展性、增加后端存儲系統來增強分布式圖系統的功能,從而振興分布式圖系統的開發”
JanusGraph從Apahce TinkerPop中吸收了對屬性圖模型(Property Graph Model)的支持和對屬性圖模型進行遍歷的Gremlin遍歷語言。
基本概念
同大多數圖數據庫一樣,JanusGraph采用 屬性圖 進行建模。基于屬性圖的模型,JanusGraph有如下基本概念:
Vertex Label:節點的類型,用于表示現實世界中的實體類型,比如"人”,“車”。在JanusGraph中,每一個節點有且只有一個Vertex Label。當不顯式指定Vertex Label時,采用默認的Vertex Label。
Vertex:節點/頂點,用于表示現實世界中的實體對象。
Edge Label:邊的類型,用于表示現實世界中的關系類型,比如“通話關系”,“轉賬關系”,“微博關注關系”等;
Edge: 邊,用于表示一個個具體的聯系。JanusGraph的邊都是單向邊。如果需要雙向邊,則通過兩條相反方向的單向邊組成。JanusGraph不存在無向邊。
Property Key:屬性的類型,比如“姓名”,“年齡”,“時間”等。Property Key有Cardinality的概念。Cardinality有SINGLE、LIST和SET三種選項。這三種選項分別用于表示一個Property中,對于同一個Property Key是只允許有一個值、允許多個可重復的值,還是多個不可重復的值。
Property:屬性,用于表示一個個具體的附加信息,采用Key-Value結構。Key就是Property Key,Value就是具體的值。
類似于下面這種圖,包含節點和邊,節點包含多個屬性:
關鍵點
- 彈性和線性可擴展性,適用于不斷增長的數據和用戶群。 
- 用于性能和容錯的數據分發和復制。 
- 多數據中心高可用性和熱備份。 
- 支持ACID和 最終的一致性。 
- 支持各種存儲后端:Apache Cassandra\Apache HBase \ Google Cloud Bigtable \ Oracle BerkeleyDB 
- 通過與大數據平臺集成,支持全局圖形數據分析,報告和ETL:Apache Spark\Apache Giraph\ApacheHadoop 
- 支持以下方式進行geo、數據范圍搜索和全文搜索:ElasticSearch \ Apache Solr \Apache Lucene 
- 與Apache TinkerPop圖形堆棧本機集成:Gremlin圖查詢語言 \ Gremlin圖服務器 \ Gremlin應用程序 
- Apache 2許可下的開源 
- 工具可視化存儲在JanusGraph中的圖形:Cytoscape \Apache TinkerPop 的 Gephi插件\ Graphexp \ Cambridge Intelligence 的 KeyLines\Linkurious 
整體架構
JanusGraph是一個圖形數據庫引擎,本身專注于緊湊圖形序列化,豐富的圖形數據建模和高效的查詢。利用Hadoop進行圖形分析和批處理圖處理。
JanusGraph為數據持久性、數據索引和客戶端訪問實現了強大的模塊化接口。其模塊化架構使其能夠與各種存儲、索引和客戶端技術進行互操作;模塊化架構還簡化了支持新的一個 模塊的流程。
架構圖如下:
ps:避免篇幅過大,架構相關的信息會在后續的博文詳細說明
如何使用
作為一個數據庫系統,它是要用來為應用程序存儲數據用的,那么應用程序應該如何使用JanusGraph來為自己存儲數據呢?
一般來說,應用程序可以通過兩種不同的方式來使用JanusGraph:
第一種方式:可以把JanusGraph嵌入到應用程序中去,JanusGraph和應用程序處在同一個JVM中。應用程序中的客戶代碼(相對JanusGraph來說是客戶)直接調用Gremlin去查詢JanusGraph中存儲的圖,這種情況下外部存儲系統可以是本地的,也可以處在遠程
第二種方式:應用程序和Janus Graph處在兩個不同JVM中,應用通過給JanusGraph提交Gremlin查詢給GremlinServer,來使用JanusGraph,因為JanusGraph原生是支持Gremlin Server的。
Gremlin Server是Apache Tinkerpop中的一個組件
JanusGraph集群包含一個、或者多個JanusGraph實例。每次啟動一個JanusGraph實例的時候,都必須指定JanusGraph的配置。
在配置中,可以指定JanusGraph要用的組件,可以控制JanusGraph運行的各個方面,還可以指定一些JanusGraph集群的調優選項:
- 最小的JanusGraph配置只需要指定一下JanusGraph的后端存儲系統,也就是它的持久化引擎。 
- 如果要JanusGraph支持高級的圖查詢,就需要為JanusGraph指定一個索引后端。 
- 若果要提升JanusGraph的查詢性能,就必須為JanusGraph指定緩存,指定性能調優的選項。 
以上提到的后端存儲系統、索引后端、緩存、調優選項等都可以在JanusGraph的配置文件中進行指定。默認情況下它的配置文件存放在JanusGraph_home/conf目錄下。
storage.backend=cassandra storage.hostname=localhostindex.search.backend=elasticsearch index.search.hostname= index.search.elasticsearch.client-only=true也可以在寫測試用例時代碼控制:
/** *?創建一個JanusGraph實例 *?@return?JanusGraph的一個實例 */ private?static?JanusGraph?create()?{try?{return?JanusGraphFactory.build().set("storage.backend",?"hbase").set("storage.hostname",?"").set("storage.port",?"").set("storage.hbase.table",?"").set("cache.db-cache",?"true").set("cache.db-cache-clean-wait",?"20").set("cache.db-cache-time",?"180000").set("cache.db-cache-size",?"0.5").set("index.relationalNetwork.backend",?"elasticsearch").set("index.relationalNetwork.hostname",?"").set("index.relationalNetwork.port",?9000).open();}?catch?(Exception?e)?{e.printStackTrace();return?null;} }通過上述代碼,就可以生成一個janusgraph圖實例,通過操作該圖實例來對圖數據庫進行操作
總結
本文介紹了,為什么需要圖數據庫,圖數據庫的基礎理論,市場上存在的流行的圖數據庫并依照janusgraph圖數據庫來展開講解一下圖數據庫相關知識等。
IT技術分享社區
個人博客網站:https://programmerblog.xyz
文章推薦程序員效率:畫流程圖常用的工具程序員效率:整理常用的在線筆記軟件遠程辦公:常用的遠程協助軟件,你都知道嗎?51單片機程序下載、ISP及串口基礎知識硬件:斷路器、接觸器、繼電器基礎知識
總結
以上是生活随笔為你收集整理的解惑图数据库!你知道什么是图数据库吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 【MySQL】如何最大程度防止人为误操作
- 下一篇: linux下vivado编译卡死,viv
