Tuesday, May 10, 2022

[RedisGraph] 初探 RedisGraph

前陣子因為交接別人的應用程式,有幸(被迫)接觸到RedisGraph這個東西,為了能讓自己快速上手這玩意,便做了一些小研究。

甚麼是RedisGraph?

RedisGraph 在 Redis 上實現了一種高效能記憶體圖資料庫。該專案作為 Redis 模組開源提供,支援 openCyper 查詢語言,可完成圖的建立、查詢、條件匹配等操作。為支援高效的圖搜尋操作,RedisGraph 底層實現了一種稱為 Hexastore 的三元組儲存結構。

RedisGraph 的核心觀念

不同的圖資料庫,可能採用了不同的結構表示圖。有的使用了鄰接列表,也有的使用了鄰接矩陣。對於 RedisGraph 而言,關鍵在於給出一種支援對圖做快速搜尋的資料結構,其使用了一種稱為“Hexastore”的結構儲存圖中的所有關係。

Hexastore 對圖的表示:

Hexastore 的結構由一系列三元組組成。其中,每個三元組包括如下三部分:

主語(Subject);

謂詞(Predicate);

目標(Object)。

主語表示源節點,謂詞表示關係,目標表示目的節點。對於圖中的每條關係,Hexastore 將儲存源節點、關係邊和目的節點間。以下面這條關係為例:

(NodeA)-[Connect]->(NodeB) 

其中, NodeA是源節點,Connect是關係,NodeB是目標節點。

一旦構建了 Hexastore,我們可以輕易地實現圖搜尋。我們在下一個段落介紹圖查詢語言 Cypher


啟動RedisGraph 

我們可以用Docker直接啟動或是使用Docker Compose

Docker

docker run -p 6379:6379 -it --rm redislabs/redisgraph


Docker-Compose.yml (包含 Redisinsight)

version: "3.3"
services:
  demo-service-redis:
    image: redislabs/redisgraph
    restart: always
    ports:
      - 6379:6379
    networks:
      - demo-net
  redisinsight:
    image: redislabs/redisinsight
    depends_on: [demo-service-redis]
    ports:
      - 8001:8001
    networks:
      - demo-net
networks:
    demo-net:

啟動後,attach到啟動的Container上,便可使用redis-cli 方便進行測試:

$ docker exec -it 7f783929ee62 bash
root@7f783929ee62:/data# redis-cli
127.0.0.1:6379>

RedisGraph官網有一些簡單例子可以說明:

建立新的圖資料庫與其關聯資料

127.0.0.1:6379> GRAPH.QUERY Topo "CREATE (sc:Command {name:'App1'})-[c:Connect]->(dc:Command {name:'App2'}), (sc:Command {name:'App1'})-[c:Connect]->(dc:Command {name:'App3'})"
1) 1) "Labels added: 1"
   2) "Nodes created: 4"
   3) "Properties set: 4"
   4) "Relationships created: 2"
   5) "Cached execution: 0"
   6) "Query internal execution time: 0.386266 milliseconds"

圖查詢語言 Cypher

RedisGraph支援圖查詢語言 Cypher,以上述建立的範例來查詢目的端點的Command.name為'App3',如下:

127.0.0.1:6379> GRAPH.QUERY Topo "MATCH (sc:Command)-[c:Connect]->(dc:Command) WHERE dc.name = 'App3' RETURN sc.name, dc.name"
1) 1) "sc.name"
   2) "dc.name"
2) 1) 1) "App1"
      2) "App3"
3) 1) "Cached execution: 0"
   2) "Query internal execution time: 0.484505 milliseconds"


P.S: 使用Redisinsight

可以使用Redisinsight來連接資料庫並且檢視資料庫。

操作方式

Step 1: 開啟redisinsight

http://<<your server IP>>:8001/

Step 2: 連線DB


填入你的主機位置,資料庫名稱設定為建立好的DB


Step 3: 讀取資料



Reference:

揭祕RedisGraph: Redis內嵌高效能記憶體圖資料庫

RedisGraph



No comments: