解惑圖數據庫!你知道什麼是圖數據庫嗎?

簡介

爲什麼需要圖數據庫?

設想一個場景
在金融的反欺詐場景下,當一個用戶小李 請求訂單,我們可以設定一個規則:

  1. 獲取該用戶的身份證號、註冊手機號、銀行預留手機號、銀行卡號、緊急聯繫人等信息
  2. 通過這些信息去關聯包含這些信息的用戶集合小王、小張、小天
  3. 通過對關聯出的小王、小張、小天判斷黑名單用戶、逾期用戶、授信拒絕等信息綜合判定一個分數
  4. 然後根據這個分數對小李 判定是否授信通過;

爲了更加有效果我們可以小王、小張、小天作爲源用戶列表再獲取這些用戶的2度關聯用戶小小、小大,獲取一個綜合評分,和一度關聯的用戶綜合評分共同參考,來判定這個userA到底該不該授信通過,借錢給他,如下圖:
在這裏插入圖片描述

基於上述場景,我們首先先考慮使用關係型數據庫: 一個用戶表存儲用戶詳情,上述過程我們需要

  1. 從接口入參獲取小李的各種信息
  2. 通過小李的各種信息去表中查詢出對應數據
  3. 再根據查出的一度用戶去表中查詢二度用戶,那如果要查多度呢,如果想要獲取用戶的其他信息呢,就要join,多表join、多次join想想就刺激~

那麼,基於圖論圖數據庫就誕生了,詳細的我們下面再介紹,先基於將數據存儲到圖庫中,用戶做爲節點、用戶與用戶之間的關係作爲邊、用戶的其他屬性作爲節點的屬性,類似於下圖;
在這裏插入圖片描述

那麼用圖庫該怎麼查呢?
我們就以一種圖庫查詢語言gremlin來實現:

g.V().has('user_name',"小李").both("user_friend").both("user_friend").both("user_friend").bothV().has('sex','男')

一句話搞定,不用多次查詢、圖庫幫你搞定~ 多度查詢輕鬆拈來

ps : 具體圖庫底層數如何存儲、查詢邏輯、圖庫架構等 歡迎關注我~ 後續系列文章會出~

總結一下,圖庫在特定場景下的優點:

  1. 高性能:隨着數據量的增多和關聯深度的增加,傳統關係型數據庫受制於檢索時需要多個表之間連接操作,數據寫入時也需考慮外鍵約束,從而導致較大的額外開銷,產生嚴重的性能問題。而圖模型固有的數據索引結構,使得它的數據查詢與分析速度更快。
  2. 靈活:圖數據庫有非常靈活的數據模型,使用者可以根據業務變化隨時調整數據模型,比如任意添加或刪除頂點、邊,擴充或者縮小圖模型這些都可以輕鬆實現,這種頻繁的 Schema 更改在關係型數據庫上不能到很好的支持。
  3. 敏捷:圖數據庫的圖模型非常直觀,支持測試驅動開發模式,每次構建時可進行功能測試和性能測試,符合當今最流行的敏捷開發需求,對於提高生產和交付效率也有一定幫助。

圖數據庫

圖形數據庫是NoSQL數據庫的一種類型,起源於歐拉理論和圖理論,也可稱爲面向/基於圖的數據庫,對應的英文是Graph Database

它應用圖形理論存儲實體之間的關係信息;圖數據庫的基本含義是以“圖”這種數據結構做爲邏輯結構存儲和查詢數據。

我們知道一個圖包含節點和邊,如下圖:
在這裏插入圖片描述

在圖數據庫中實體表現爲節點實體與其他實體連接的方式表現爲聯繫(邊)。我們可以用這個通用的、富有表現力的結構來建模各種場景,從宇宙火箭的建造到道路系統,從食物的供應鏈及原產地追蹤到人們的病歷,甚至更多其他的場景。

例如實體:類似於用戶、用戶的親屬等作爲一個節點存在於圖中,:用戶和用戶親屬之間關聯的關係,小李—>小李的父親,這兩個節點之間的邊可以設定爲“用戶父母”的邊;

主流圖數據庫

目前主流的圖數據庫有:Neo4j,Janusgraph,Dgraph,Giraph,TigerGraph等。

ps : 這裏我們只看 database model專用支持graph類型的圖庫

受歡迎程度如下,時間是:2020-5月

在這裏插入圖片描述
簡單介紹一下Neo4j 和 Janusgraph區別:

Neo4j:

  1. Neo4J使用原生的圖存儲,以高度自由且規範的方式管理和存儲數據。對比非原生圖解決方案中,隨着信息量的增加,使用面向對象的數據庫存儲數據庫使數據操作變得越來越慢。
  2. Neo4J可以以每秒一百萬條的驚人速度提供結果,因爲數據中的鏈接部分或實體在物理上是已經相互連接的。
  3. Neo4J的另一個特點是ACID事務,它確保實時顯示數據的合法性和準確性,這是企業級應用的重要特性。
  4. 單擊不收費,集羣收費,所以對於不想要花大價錢買的話,這個不推薦;如果不差錢,強烈推薦使用,社羣活躍,服務穩定,功能強大

Janusgraph:

  1. 開源的分佈式圖數據庫,採用第三方存儲作爲底層存儲,如:HBase、Cassandra等
  2. 使用第三方框架支持全文匹配、範圍匹配等,如Es等
  3. 集羣節點可以線性擴展,以支持更大的圖和更多的併發訪問用戶。
  4. 數據分佈式存儲,並且每一份數據都有多個副本,因此,有更好的計算性能和容錯性。
  5. 原生集成Apache TinkerPop圖技術棧,包括Gremlin graph query language、Gremlin graph server、Gremin applications。
  6. 免費開源,我們現在正在使用的就是這個

下面就以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項目啓動的初衷是“通過爲其增加新功能、改善性能和擴展性、增加後端存儲系統來增強分佈式圖系統的功能,從而振興分佈式圖系統的開發

JanusGraphApahce TinkerPop中吸收了對屬性圖模型(Property Graph Model)的支持和對屬性圖模型進行遍歷的Gremlin遍歷語言。

基本概念

同大多數圖數據庫一樣,JanusGraph採用 屬性圖 進行建模。基於屬性圖的模型,JanusGraph有如下基本概念:

  1. Vertex Label:節點的類型,用於表示現實世界中的實體類型,比如"人”,“車”。在JanusGraph中,每一個節點有且只有一個Vertex Label。當不顯式指定Vertex Label時,採用默認的Vertex Label。
  2. Vertex:節點/頂點,用於表示現實世界中的實體對象。
  3. Edge Label:邊的類型,用於表示現實世界中的關係類型,比如“通話關係”,“轉賬關係”,“微博關注關係”等;
  4. Edge: 邊,用於表示一個個具體的聯繫。JanusGraph的邊都是單向邊。如果需要雙向邊,則通過兩條相反方向的單向邊組成。JanusGraph不存在無向邊。
  5. Property Key:屬性的類型,比如“姓名”,“年齡”,“時間”等。Property Key有Cardinality的概念。Cardinality有SINGLE、LIST和SET三種選項。這三種選項分別用於表示一個Property中,對於同一個Property Key是隻允許有一個值、允許多個可重複的值,還是多個不可重複的值。
  6. 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:

  1. 第一種方式:可以把JanusGraph嵌入到應用程序中去,JanusGraph和應用程序處在同一個JVM中。應用程序中的客戶代碼(相對JanusGraph來說是客戶)直接調用Gremlin去查詢JanusGraph中存儲的圖,這種情況下外部存儲系統可以是本地的,也可以處在遠程
  2. 第二種方式:應用程序和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=localhost

index.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圖數據庫來展開講解一下圖數據庫相關知識等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章