通過最新的 Memgraph 高級圖形擴(kuò)展( MAGE )版本,您現(xiàn)在可以在幾秒鐘內(nèi)從 Memgraph 運(yùn)行 GPU 支持的圖形分析,同時使用 Python 。由 NVIDIA cuGraph 提供支持,以下圖形算法現(xiàn)在將在 GPU 上執(zhí)行:
PageRank (圖形分析)
平衡切割(聚類)
光譜聚類(聚類)
點擊率(集線器與權(quán)威分析)
萊頓(社區(qū)檢測)
Katz Centrality
中間性和中心性
本教程將向您展示如何使用 PageRank 圖分析和 Louvain 社區(qū)檢測來分析包含 130 萬關(guān)系的 Facebook 數(shù)據(jù)集。
在本教程結(jié)束時,您將知道如何:
使用 Python 在 Memgraph 中導(dǎo)入數(shù)據(jù)
在大規(guī)模圖形上運(yùn)行分析并獲得快速結(jié)果
從 Memgraph 在 NVIDIA GPU 上運(yùn)行分析
教程先決條件
要學(xué)習(xí)本圖形分析教程,您需要一個 NVIDIA GPU 、驅(qū)動程序和容器工具包。成功安裝后 NVIDIA GPU 驅(qū)動程序 和容器工具包,您還必須安裝以下四個工具:
碼頭工人 用于運(yùn)行mage-cugraph映像
朱皮特 為了分析圖形數(shù)據(jù)
煉金術(shù) 將 Memgraph 與 Python 連接
Memgraph 實驗室 為了使圖形可視化
下一節(jié)將指導(dǎo)您為本教程安裝和設(shè)置這些工具。
碼頭工人
Docker 用于安裝和運(yùn)行mage-cugraph Docker 映像。設(shè)置和運(yùn)行 Docker 映像涉及三個步驟:
下載 Docker
下載教程數(shù)據(jù)
運(yùn)行 Docker 映像,使其能夠訪問教程數(shù)據(jù)
1.下載 Docker
您可以通過訪問安裝 Docker 網(wǎng)頁,并按照操作系統(tǒng)的說明操作。
2.下載教程數(shù)據(jù)
在運(yùn)行mage-cugraph Docker 映像之前,首先下載本教程中使用的數(shù)據(jù)。這允許您在運(yùn)行時為 Docker 映像提供對教程數(shù)據(jù)集的訪問權(quán)限。
要下載數(shù)據(jù),請使用以下命令克隆 jupyter memgraph 教程 GitHub repo ,并將其移動到j(luò)upyter-memgraph-tutorials/cugraph-analytics文件夾:
Git clone https://github.com/memgraph/jupyter-memgraph-tutorials.git
Cd jupyter-memgraph-tutorials/cugraph-analytics
3.運(yùn)行 Docker 鏡像
現(xiàn)在,您可以使用以下命令運(yùn)行 Docker 鏡像并將車間數(shù)據(jù)裝載到/samples
文件夾:
docker run -it -p 7687:7687 -p 7444:7444 --volume /data/facebook_clean_data/:/samples mage-cugraph
運(yùn)行 Docker 容器時,您應(yīng)該會看到以下消息:
You are running Memgraph vX.X.X
To get started with Memgraph, visit https://memgr.ph/start
執(zhí)行 mount 命令后,教程所需的CSV文件將位于 Docker 映像內(nèi)的/samples文件夾中, Memgraph 將在需要時找到它們。
Jupyter 筆記本
現(xiàn)在 Memgraph 已經(jīng)運(yùn)行,請安裝 Jupyter.本教程使用 JupyterLab,您可以使用以下命令安裝它:
pip install jupyterlab
安裝 JupyterLab 后,使用以下命令啟動它:
jupyter lab
煉金術(shù)
使用 煉金術(shù) ,一個對象圖映射器( OGM ),用于連接到 Memgraph 并在 Python 中執(zhí)行查詢。您可以將 Cypher 視為圖形數(shù)據(jù)庫的 SQL 。它包含許多相同的語言結(jié)構(gòu),如創(chuàng)建、更新和刪除。
下載 CMake 在您的系統(tǒng)上,然后您可以使用 pip 安裝 GQLAlchemy :
pip install gqlalchemy
Memgraph 實驗室
您需要安裝的最后一個先決條件是: Memgraph 實驗室 連接到 Memgraph 后,您將使用它創(chuàng)建數(shù)據(jù)可視化。學(xué) 如何安裝 Memgraph 實驗室 作為操作系統(tǒng)的桌面應(yīng)用程序。
安裝 Memgraph Lab 后,您現(xiàn)在應(yīng)該 連接到 Memgraph 數(shù)據(jù)庫 。
此時,您終于準(zhǔn)備好:
使用 GQLAlchemy 連接到 Memgraph
導(dǎo)入數(shù)據(jù)集
在 Python 中運(yùn)行圖形分析
使用 GQLAlchemy 連接到 Memgraph
首先,將自己定位在 Jupyter 筆記本 。前三行代碼將導(dǎo)入gqlalchemy,通過host:127.0.0.1和port:7687連接到 Memgraph 數(shù)據(jù)庫實例,并清除數(shù)據(jù)庫。一定要從頭開始。
from gqlalchemy import Memgraph
memgraph = Memgraph("127.0.0.1", 7687)
memgraph.drop_database()
從 CSV 文件導(dǎo)入數(shù)據(jù)集。
接下來,您將執(zhí)行以下操作: PageRank 以及使用 Python 的 Louvain 社區(qū)檢測。
導(dǎo)入數(shù)據(jù)
這個 Facebook 數(shù)據(jù)集 由八個 CSV 文件組成,每個文件具有以下結(jié)構(gòu):
node_1,node_2
0,1794
0,3102
0,16645
每條記錄表示連接兩個節(jié)點的邊。節(jié)點表示頁面,它們之間的關(guān)系是相互的。
有八種不同類型的頁面(例如,政府、運(yùn)動員和電視節(jié)目)。頁面已重新編制匿名索引,所有頁面均已通過 Facebook 驗證真實性。
由于 Memgraph 在數(shù)據(jù)具有索引時導(dǎo)入查詢速度更快,因此在id
屬性上使用標(biāo)簽Page
為所有節(jié)點創(chuàng)建查詢。
memgraph.execute(
"""
CREATE INDEX ON :Page(id);
"""
)
Docker 已經(jīng)擁有對本教程中使用的數(shù)據(jù)的容器訪問權(quán)限,因此您可以通過./data/facebook_clean_data/
文件夾中的本地文件進(jìn)行列表。通過連接文件名和/samples/
文件夾,可以確定它們的路徑。使用連接的文件路徑將數(shù)據(jù)加載到 Memgraph 中。
import os
from os import listdir
from os.path import isfile, join
csv_dir_path = os.path.abspath("./data/facebook_clean_data/")
csv_files = [f"/samples/{f}" for f in listdir(csv_dir_path) if isfile(join(csv_dir_path, f))]
使用以下查詢加載所有 CSV 文件:
for csv_file_path in csv_files:
memgraph.execute(
f"""
LOAD CSV FROM "{csv_file_path}" WITH HEADER AS row
MERGE (p1:Page {{id: row.node_1}})
MERGE (p2:Page {{id: row.node_2}})
MERGE (p1)-[:LIKES]->(p2);
"""
)
接下來,將 PageRank 和 Louvain 社區(qū)檢測算法與 Python 結(jié)合使用,以確定網(wǎng)絡(luò)中哪些頁面最重要,并找到網(wǎng)絡(luò)中的所有社區(qū)。
PageRank 重要性分析
要識別 Facebook 數(shù)據(jù)集中的重要頁面,您將執(zhí)行 PageRank 。了解不同的 算法設(shè)置 這可以在調(diào)用 PageRank 時設(shè)置。
請注意,您還會發(fā)現(xiàn)MAGE中集成了其他算法。 Memgraph 應(yīng)該有助于在大規(guī)模圖形上運(yùn)行圖形分析。找到其他 Memgraph 教程 關(guān)于如何運(yùn)行這些分析。
MAGE被集成以簡化 PageRank 的執(zhí)行。以下查詢將首先執(zhí)行算法,然后創(chuàng)建每個節(jié)點的rank屬性,并將其設(shè)置為cugraph.pagerank算法返回的值。
然后,該屬性的值將另存為變量rank。請注意,這項測試(以及本文介紹的所有測試)是在 NVIDIA GeForce GTX 1650 Ti 和 Intel Core i5-10300H CPU 上執(zhí)行的,頻率為 2.50GHz ,內(nèi)存為 16GB ,并在大約四秒鐘內(nèi)返回結(jié)果。
memgraph.execute(
"""
CALL cugraph.pagerank.get() YIELD node,rank
SET node.rank = rank;
"""
)
接下來,使用以下 Python 調(diào)用檢索列組:
results = memgraph.execute_and_fetch(
"""
MATCH (n)
RETURN n.id as node, n.rank as rank
ORDER BY rank DESC
LIMIT 10;
"""
)
for dict_result in results:
print(f"node id: {dict_result['node']}, rank: {dict_result['rank']}")
node id: 50493, rank: 0.0030278728385218327
node id: 31456, rank: 0.0027350282311318468
node id: 50150, rank: 0.0025153975342989345
node id: 48099, rank: 0.0023413620866201052
node id: 49956, rank: 0.0020696403564964
node id: 23866, rank: 0.001955167533390466
node id: 50442, rank: 0.0019417018181751462
node id: 49609, rank: 0.0018211204462452515
node id: 50272, rank: 0.0018123518843272954
node id: 49676, rank: 0.0014821440895415787
此代碼返回具有最高秩分?jǐn)?shù)的 10 個節(jié)點。結(jié)果以字典形式提供。
現(xiàn)在,是時候用可視化方法顯示結(jié)果了Memgraph 實驗室除了通過以下方式創(chuàng)建美麗的視覺效果外:D3.js和我們的圖形樣式腳本語言,您可以使用 Memgraph Lab 來:
- 查詢圖形數(shù)據(jù)庫并用 Python 或 C ++甚至 Rust 編寫圖形算法
- 檢查 Memgraph 數(shù)據(jù)庫日志
- 可視化圖形模式
Memgraph Lab 提供了各種預(yù)構(gòu)建的數(shù)據(jù)集,幫助您入門。在 Memgraph Lab 中打開執(zhí)行查詢視圖并運(yùn)行以下查詢:
MATCH (n)
WITH n
ORDER BY n.rank DESC
LIMIT 3
MATCH (n)<-[e]-(m)
RETURN *;
此查詢的第一部分將MATCH所有節(jié)點。查詢的第二部分將按rank的降序排列ORDER節(jié)點。
對于前三個節(jié)點,獲取連接到它們的所有頁面。我們需要WITH子句來連接查詢的兩個部分。
下一步是學(xué)習(xí)如何使用 Louvain 社區(qū)檢測來查找圖中存在的社區(qū)。
Louvain 的社區(qū)檢測
Louvain 算法測量社區(qū)內(nèi)節(jié)點的連接程度,與它們在隨機(jī)網(wǎng)絡(luò)中的連接程度進(jìn)行比較。
它還遞歸地將社區(qū)合并到單個節(jié)點中,并在壓縮圖上執(zhí)行模塊化聚類。這是最流行的社區(qū)檢測算法之一。
使用 Louvain ,您可以在圖中找到社區(qū)的數(shù)量。首先執(zhí)行 Louvain 并將 cluster_id保存為每個節(jié)點的屬性:
memgraph.execute(
"""
CALL cugraph.louvain.get() YIELD cluster_id, node
SET node.cluster_id = cluster_id;
"""
)
要查找社區(qū)的數(shù)量,請運(yùn)行以下代碼:
results = memgraph.execute_and_fetch(
"""
MATCH (n)
WITH DISTINCT n.cluster_id as cluster_id
RETURN count(cluster_id ) as num_of_clusters;
"""
)
# we will get only 1 result
result = list(results)[0]
#don't forget that results are saved in a dict
print(f"Number of clusters: {result['num_of_clusters']}")
Number of clusters: 2664
接下來,仔細(xì)看看其中的一些社區(qū)。例如,您可能會發(fā)現(xiàn)屬于一個社區(qū)的節(jié)點,但連接到另一個屬于相反社區(qū)的節(jié)點。 Louvain 試圖最小化此類節(jié)點的數(shù)量,因此您不應(yīng)該看到很多節(jié)點。在 Memgraph Lab 中,執(zhí)行以下查詢:
MATCH (n2)<-[e1]-(n1)-[e]->(m1)
WHERE n1.cluster_id != m1.cluster_id AND n1.cluster_id = n2.cluster_id
RETURN *
LIMIT 1000;
此查詢將顯示MATCH節(jié)點n1及其與其他兩個節(jié)點n2和m1的關(guān)系,分別包含以下部分:(n2)《-[e1]-(n1)和(n1)-[e]-》(m1)。然后,它將僅過濾出n1的那些節(jié)點WHERE、cluster_id,并且n2與節(jié)點cluster_id的m1不同。
為了簡化可視化,使用LIMIT 1000僅顯示 1000 個此類關(guān)系。
使用 圖形樣式腳本 在 Memgraph Lab 中,您可以設(shè)置圖形的樣式,例如,用不同的顏色表示不同的社區(qū)。
總結(jié)
現(xiàn)在,您可以使用 Memgraph 導(dǎo)入數(shù)百萬個節(jié)點和關(guān)系,并使用 cuGraph PageRank 和 Louvain graph 分析算法進(jìn)行分析。借助由 NVIDIA cuGraph 提供的 Memgraph 的 GPU 圖形分析功能,您可以探索海量圖形數(shù)據(jù)庫并進(jìn)行推理,而無需等待結(jié)果。
關(guān)于作者
Antonio Filipovi? 與 Memgraph 的解決方案團(tuán)隊合作。他擁有構(gòu)建基于云的解決方案和開發(fā)基于流的圖形分析算法的經(jīng)驗。作為一名學(xué)生,他幫助推出了 Memgraph Cloud 和 Memgraph 游樂場等產(chǎn)品。他還研究了基于流的圖機(jī)器學(xué)習(xí)算法。安東尼奧最近獲得了薩格勒布大學(xué)電氣工程與計算學(xué)院的計算機(jī)科學(xué)碩士學(xué)位。
審核編輯:郭婷
-
NVIDIA
+關(guān)注
關(guān)注
14文章
5076瀏覽量
103723 -
gpu
+關(guān)注
關(guān)注
28文章
4775瀏覽量
129357 -
python
+關(guān)注
關(guān)注
56文章
4807瀏覽量
85039
發(fā)布評論請先 登錄
相關(guān)推薦
評論