從零開始學Graph Database:什麼是圖

来源:https://www.cnblogs.com/huaweiyun/archive/2022/10/09/16771623.html
-Advertisement-
Play Games

摘要:本文從零開始引導與大家一起學習圖知識。希望大家可以通過本教程學習如何使用圖資料庫與圖計算引擎。本篇將以華為雲圖引擎服務來輔助大家學習如何使用圖資料庫與圖計算引擎。 本文分享自華為雲社區《從零開始學Graph Database(1)》,作者:弓乙 。 基礎概念 什麼是圖? 首先,我們需要明確圖 ...


摘要:本文從零開始引導與大家一起學習圖知識。希望大家可以通過本教程學習如何使用圖資料庫與圖計算引擎。本篇將以華為雲圖引擎服務來輔助大家學習如何使用圖資料庫與圖計算引擎。

本文分享自華為雲社區《從零開始學Graph Database(1)》,作者:弓乙 。

基礎概念

什麼是圖?

首先,我們需要明確圖 Graph的概念。

這裡的圖,是graph, 是graphical,而不是graphic。即圖處理的是關係問題,而不是圖片。我們解決是關係問題,而非視覺cv問題

在離散數據中,有專門研究圖的圖論。包含子圖相關,染色,路徑,網路流量等問題。

在電腦科學中,我們將圖抽象為一種數據結構,即由點,邊構成的集合。我們可以將現實世界的任意一種包含關係的實體用圖來抽象概括。

我們通常把圖的問題定義為G=(V,E,φ):

V:是節點的集合
E:是邊的集合
φ: E->{(x,y) | (x,y)∈ V^2 ∪ x≠y }是一個關聯函數,它每條邊映射到一個有頂點組成的有序對上。

下圖是一個使用圖來描述的社交網路。點代表了人,邊代表了人和人之間為朋友關係。在構建了這樣一個社交網路以後,我們可以通過使用圖查詢和演算法使得圖數據產生價值。如利用k跳查詢,共同鄰居,node2vec等來為社交網路中的用戶進行好友推薦。

// 好友推薦邏輯
試想我們為李雷推薦好友,思路是:向他推薦其好友的好友。但是需要過濾掉本身李雷的好友。
如上圖,小明即是李雷的好友,也是李雷好友的好友。所以在這種情況中,我們不需要再向李雷推薦小明瞭。
而是推薦 小霞和小剛。

這種稍微有點複雜的推薦思路,可以使用查詢語言進行。
以gremlin為例:
g.V("李雷").repeat(out("friend").simplePath().where(without('1hop')).store('1hop')).
times(2).path().by("name").limit(100)

可以使用圖做什麼?

傳統上我們使用圖來解決一些數學問題。比如圖論起源於著名的柯尼斯堡七橋問題, 該問題被歐拉推廣為:怎樣判斷是否存在著一個恰好包含了所有邊,且沒有重覆的路徑。即一筆畫問題。

歐拉證明瞭以下定理,並解決了一筆畫問題:

連通的無向圖G有歐拉路徑(一筆畫)的充要條件是:G中的奇點的數目等於0或2。

(奇點:連接邊數為奇數的頂點。)

我們可以用一筆畫問題來解決七橋問題,從模型可以看出來,七橋問題中的奇點數目為4個,顯然不滿足一筆畫的充要條件。故七橋無法在所有橋都只能走一遍的前提下,把這個地方所有的橋都走遍。

當然了,圖並非只能解決這類圖論經典問題(如 四色問題,馬的遍歷問題,郵遞員問題, 網路流問題 ),只要能夠將研究對象表示為圖結構,就能利用圖的特點來解決問題,甚至大部分情況下,並不需要使用到多麼高深的演算法。

查詢與演算法

圖查詢

這裡的查詢一般指代使用原生圖查詢語言進行的圖上對象的查詢操作。如neo4j的Cypher,tinkerpop的Gremlin等。Cypher與Gremlin也是業界使用較多的查詢語言,Cypher是側重於pattern matching的聲明式語言,而Gremlin則是基於groovy的函數式編程語言,強調graph traversal的重要性。

如:

1、gremlin

g.V("李雷").outE('friend').has('age',gt(30)).otherV().where(out('friend').(hasId('李雷'))).limit(100)

2、cypher

match (a)-[r1:friend]->(b)-[r2:friend]->(c) where a.mid='李雷' and r1.age>30 and a=c return id(b) limit 100

以上兩種寫法等價,只是使用的圖查詢語言有區別。

圖演算法

除了明確規則的查詢外,我們也可以利用圖演算法對圖進行分析。畢竟圖中蘊含的信息量遠比錶面看上去多,這個時候我們希望通過圖演算法揭示圖中更多的信息,如發現節點之間隱含關係,分析節點重要性,對業務場景進行行為預測等。

下表列出了目前不同類型具有代表性的圖演算法:

實際的場景中,我們需要同時兼顧演算法的效果和執行成本。這也是很多使用場景所面臨的trade-off問題。正如我們前面所說,大部分情況下不需要用到非常高深的圖演算法,特別是在線上任務中,我們更看重時延和效率。

亦或者說,線上場景中,重查詢輕演算法;而在離線場景中,重演算法而輕查詢。

事實上,圖查詢與圖演算法的邊界並沒有那麼涇渭分明。或者說,圖演算法算是某種程度上的特殊圖查詢。我們普遍認為演算法較查詢需要更多的計算資源,會占用更多的CPU與記憶體。

比如上圖的多跳查詢和BFS algorithm,本質上是同一個查詢。灰色模塊顯示的是gremlin與cypher的查詢方法,藍色模塊顯示的是不同圖資料庫中BFS演算法的執行方式。但他們的結果都是一致的,均為點Tom的三度鄰居。也就是在業界,N跳查詢即可以作為廣度/深度優先演算法/khop演算法單列出來,也可以作為圖遍歷/圖查詢中一種常用模式存在。

除此以外,subgraph matching也是一個圖查詢與圖演算法同時存在的研究課題。如上圖,我們輸入目標子圖q,在圖G中尋找其同構圖,這其實是一個NP-Hard問題。

當然了,即使子圖查詢是一個非常困難的問題,大部分圖查詢語言還是提供了相應的match語法用於基於模式匹配的搜索功能,如neo4j使用的Cypher,或者支持指令式和聲明式查詢的Gremlin。而在圖演算法領域,subgraph matching則是一個極重要,極複雜的研究課題。下表中列出來一部分具有代表性的子圖匹配演算法的分類。(來源於paper[In-Memory Subgraph Matching: An In-depth Study])。

圖的應用

下麵讓我們從一個具體的例子中體會一下圖在場景中的使用。

假設我們需要在社交關係中為用戶推薦好友,在不同的場景中,可以使用不同類別的查詢和演算法。如果用於線上推薦,我們可以將二度鄰居作為其推薦結果,即2跳查詢,這在大部分的圖資料庫中是一個代價非常小的查詢,大多可在100ms以內完成,甚至可以在10ms內返回;如果用於離線推薦,則會傾向於使用推薦效果更優秀的圖演算法。例如,利用社團演算法louvain, labelPropagation, Strongly Connected, k-Core獲得每個點的社團分類,並將分類結果作為點上embedding的vector參與後續downstream task計算;或者直接使用圖上Node embedding演算法(Node2vec, FastRP, Weisfeiler-Lehman等)得到一個完整的點上Embedding的結果用於後續訓練;當然,也可以直接使用圖相似性演算法(Cosine, Jaccard等)直接得到針對某個點的推薦結果。

gremlin: g.V('李雷').out().out()
cypher: match (n)--(m)--(l) where id(n)='李雷' return l


louvain:
[GES API]
POST /ges/v1.0/{project_id}/graphs/{graph_name}/action?action_id=execute-algorithm
{
    "algorithmName": "louvain",
    "parameters": {
        "max_iterations": "100",
        "convergence": "0.01",
        "weight":"score"
    }
}

大部分的工業使用場景中,圖更多地扮演著資料庫的角色,用來管理某個領域內的關係數據。用戶大多看中圖對於多跳關聯分析能力,以及數據間脈絡的整理歸集,分析和可視化。

特別的,在某些垂直領域,由於其天生的關係結構,圖資料庫/圖計算已經成為其不可或缺的工具了。如,在金融機構使用圖來進行風控管理,通過對用戶聯繫人交易等數據分析,識別欺詐借貸行為,規避惡意借貸風險,識別黑產群體等;或作為知識圖譜的底層,提供快速關聯查詢,路徑識別推薦,融合各種異構異質數據等。

為了更真實地體驗圖在各個行業的應用,也可以使用以下開箱即用的demo進行動手實踐:

 

以上案例提供了包括數據源,數據建模(schema),雲上創圖,查詢或分析演示等功能。

 

點擊關註,第一時間瞭解華為雲新鮮技術~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • keepalived實現haporxy負載均衡機高可用 環境說明 | 系統信息 | 主機名 | IP | 服務 | | | | | | | centos8 | master | 192.168.111.141 | haproxykeepalived | | centos8 | backup | 19 ...
  • 1. 索引數組 一、什麼是索引數組? 所謂索引數組就是普通數組,以整數作為數組元素的索引下標。 二、實例。 備註: (a)使用-a選項定義索引數組,使用一對小括弧()定義數組中的元素列表。 (b)索引數組使用整數作為數組元素下標。 備註: (a)使用@和*作為數組下標,表示獲取所有元素。 三、實例。 ...
  • keepalived高可用(nginx) keepalived簡介 keepalived官網 Keepalived 軟體起初是專為LVS負載均衡軟體設計的,用來管理並監控LVS集群系統中各個服務節點的狀態,後來又加入了可以實現高可用的VRRP功能。因此,Keepalived除了能夠管理LVS軟體外, ...
  • 在應用開發的早期,數據量少,開發人員開發功能時更重視功能上的實現,隨著生產數據的增長,很多SQL語句開始暴露出性能問題,對生產的影響也越來越大,有時可能這些有問題的SQL就是整個系統性能的瓶頸。 ...
  • 1)對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。 2)應儘量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。 3)應儘量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引 ...
  • 存儲引擎 1.基本介紹 基本介紹 MySQL的表類型由存儲引擎(Storage Engines)決定,主要包括MyISAM、innoDB、Memory等 MySQL數據表主要支持六種類型,分別是:CSV,Memory,ARCHIVE,MRG_MYISAM,MYISAM,InnoBDB。 這六種又分為 ...
  • 本期我們帶大家回顧一下無倦同學的直播分享《ChunJun類載入器隔離》,ChunJun類載入器隔離的方案是我們近期探索的一個新方案,這個方案目前還不是非常成熟,希望能藉由此次分享與大家一起探討下這方案,如果大家有一些新的想法歡迎大家在github上給我提issue或者pr。 一、Java 類載入器解 ...
  • 摘要:GaussDB(for Redis)推出了雙活解決方案,基於GaussDB NoSQL統一架構,通過兩個資料庫實例之間的數據同步,達成數據的一致性。 本文分享自華為雲社區《【雲圖說】一張圖瞭解GaussDB(for Redis)雙活解決方案》,作者: 高斯Redis官方博客。 網路異常、電力故 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...