Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the ultimate-addons-for-gutenberg domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /opt/bitnami/wordpress/wp-includes/functions.php on line 6114
Database - 八寶周的研究小屋

Category: Database

  • [Arango DB] Graph Database – Query 003 – CRUD Operations

    【前情提要】

    對於資料庫,我們時常提出增刪查改,也就是俗稱的 CRUD(Create, Read, Update, Delete)操作。在之前我們都只讀取資料,那這期呢則會進入編輯修改的操作。我們廢話不多說趕緊開始吧。

    【重點整理】

    1. 透過 REPLACE 能修改整個資料,而不僅僅選擇的屬性

    【預計內容】

    1. 新增資料
    2. 更新資料
    3. 刪除資料

    【主要內容】

    1. 新增資料

    那首先當然是最重要的部分 — 建立資料,下方範例 INSERT 自製的假資料。執行後,應該會顯示寫入了幾筆,我們再去資料庫中檢查。發現新的資料確實存進去了。

    GraphQL
    INSERT {
      "artist_id": 2420,
      "full_name": "BaBaoChou",
      "nationality": "R.O.C.",
      "style": "Beginner"
    } INTO artist_vertices

    2. 修改資料

    今天我覺得資料有誤了,怎麼可能只有新手等級呢?這時,我們能透過 UPDATE 與 _key 來進行修改。有興趣的也可以多研究下 INSERT 的 overwrite 屬性,相對我不太推薦增加改動的風險。

    那下方,我們只修改我們的繪畫風格的屬性。

    GraphQL
    UPDATE "22212" WITH {
      "style": "Pro Digital Painting"
    } in artist_vertices

    但我們能想像,我們能修改更多甚至新增屬性,但如何刪除呢?這時,我們就要依靠 REPLACE 方法,它會覆蓋掉所有的資料欄位。如下方,扣掉索引值最後只會保存兩種屬性。

    GraphQL
    REPLACE {
      _key: "22212",
      artist_id: 2420,
      "style": "Digital Painting"
    } IN artist_vertices

    3. 刪除資料

    那今天如果有不想要的資料,我們不可能讓它活在資料庫中占位置。因此,我們接著就要用 REMOVE 方法透過 _key 刪除資料,或者利用 DOCUMENT 來刪除。

    GraphQL
    REMOVE "22212" IN artist_vertices
    GraphQL
    REMOVE DOCUMENT("artist_vertices/22212") IN artist_vertices

    【後話】

    那在這篇,我們簡單的講過如何編輯資料。那 Query 的基本操作大概也到這邊為止,之後有機會再推出進階的語法。那之後將先把資料備份的方法為主軸,盡快讓文章與各位會面。

    【參考資料】

    [1] Data Queries
    https://docs.arangodb.com/3.12/aql/data-queries/#data-modification-queries

    【延伸閱讀】

    [1] INSERT
    https://docs.arangodb.com/3.12/aql/high-level-operations/insert/

    [2] UPSERT
    https://docs.arangodb.com/3.12/aql/high-level-operations/upsert/

  • [Arango DB] Graph Database – Query 001 – Basic Controls and Data Read

    [Arango DB] Graph Database – Query 001 – Basic Controls and Data Read

    【前言】

    我們在之前都只靠 Web UI 進行資料的架設與連結的綁定,那接著我們就要透過 Query Function 開始取得資料啦。在這篇將講述最基礎的語法,讓各位能更快理解底層的用法。

    【重點整理】

    1. 我們可以將常用的 query function 儲存起來,快速呼叫與切換

    【預計內容】

    1. 儲存 Query Function
    2. 物件與回傳
    3. 自訂輸入值
    4. 迴圈與限制
    5. 資料的排序

    【主要內容】

    1. 儲存 Query Function

    在多數時候,我們設計好 Query Function 總是要儲存起來,減少重複書寫的時間。那在 Arango DB 也支援這種服務,那我們當然要先提及。我們後續輸入完 Query 語法後,都能透過 Save As 按鈕保存,並從 Queries 快速呼叫。我們甚至還能夠匯出資料到本地,方便後續的開發工作。

    2. 物件與回傳

    在取值時,最重要的必然是資料與回傳值。那在這邊我們能透過 DOCUMENT('_id') 取得物件,並利用屬性取得特定目標。最後,一定要使用 RETURN 回傳結果,我們才能取得輸出值。

    那在下方範例中,按下執行後,我們應該取得 Claude Monet 的資料,並只回傳名稱、出生死亡與國籍。

    GraphQL
    LET artist = DOCUMENT('artist_vertices/366')
    
    RETURN {
      artist: artist.full_name,
      nationality: artist.nationality, 
      birth: artist.birth, 
      death: artist.death
    }

    3. 自訂輸入值

    但在許多情況,我們會透過輸入值判斷要找那些資料,而非寫死在程式碼中。這時,我們就要透過 @ 標記變數。那在 Web UI 的右側就會出現欄位可以填寫。

    4. 迴圈與限制

    通常我們不只有一筆資料,總要透過迴圈輸出多筆資料。那在 AQL 只支援 FOR … IN 語法,我們就修改前面的回傳模板,取得所有作家的相關資料。

    GraphQL
    FOR artist in artist_vertices
      RETURN {
        artist: artist.full_name,
        nationality: artist.nationality, 
        birth: artist.birth, 
        death: artist.death
      }

    但 421 筆實在太過龐雜,我今天只想先取得最初的 10 筆就好,那我們只要在 RETURN 之前,加上 LIMIT 與數量即可。

    GraphQL
    FOR artist in artist_vertices
      LIMIT 10
      RETURN {
        artist: artist.full_name,
        nationality: artist.nationality, 
        birth: artist.birth, 
        death: artist.death
      }

    那或者說,今天確定有個目標,比如名為 Paul 的畫家,我們則能依靠 FILTER 先進行篩選。關於塞選的判斷式,常見有 ==, !=, >=, >, <, <=, LIKE, IN, NOT IN 以上的幾種,另外也支援 REGEX 表示法。

    GraphQL
    FOR artist in artist_vertices
      FILTER artist.first_name == 'Paul'
      RETURN {
        artist: artist.full_name,
        nationality: artist.nationality, 
        birth: artist.birth, 
        death: artist.death
      }

    5. 資料排序

    在預設情況下,系統會依照資料順序跑過,但如果今天想要不同的排序方法,就要倚靠 SORT 方法來幫忙。下方範例我們使用出生年分當作排序條件。那預設的方向是 ASC(升冪),想要換方向可改用 DESC(降冪)。

    GraphQL
    FOR artist in artist_vertices
      SORT artist.birth ASC
      RETURN {
        artist: artist.full_name,
        nationality: artist.nationality, 
        birth: artist.birth, 
        death: artist.death
      }

    【後話】

    那在這篇中,我們涵蓋了最基礎的數種取得資料的基礎,那在下一篇,我們就會透過 Edge 連結來取得我們的資料,並透過集合來塞選最終的結果。

    【參考資料】

    [1] Data Queries
    https://docs.arangodb.com/3.12/aql/data-queries/

  • [Arango DB] Graph Database – Graph 001 – Visualize the Nodes and Edges

    [Arango DB] Graph Database – Graph 001 – Visualize the Nodes and Edges

    【前言】

    那在上回我們建立了資料與關係的集合,但逐行看難以理解複雜的關係也很痛苦。那這回我們就要依靠上次的兩個 Edge Collection 進行圖像化,更快速且清楚地理解資料間的關係。

    【重點整理】

    1. 建立圖資料庫後,可以按右鍵快速建立新的資料或關聯
    2. from 與 to 會影響階層式分布的順序

    【預計內容】

    1. 製作圖資料庫
    2. 格式設定
    3. 樣式展示
    4. 資料的顯示與新增

    【主要內容】

    1. 製作圖資料庫

    我們首先到 Graph 介面,點擊 Add Graph 開始新增圖表,這邊我先使用同集合內的資料,比較容易使用標籤。

    這樣我們就完成圖資料庫了,應該要能透過 Edge 能看到串接起來的資料。但預設情況下,只會顯示隨機一個資料當起始點,我們必須在設定中選到我們要的所有點。

    那這邊我們繼續使用 Claude Monet 當起始點,可以看到與之有任何連結的資料也會呈現在資料中。但在預設情況下,我們很難記得 ID 與對應的值,因此我們要進行 Nodes 的設定以顯示名稱。

    2. 格式設定

    那我們知道資料中,畫家的欄位有 full_name 紀錄全名,那我們只要在 label 設定輸入要使用的欄位即可。

    那相對的,我們現在雖然有人名,卻沒有明確的關係。那接著我們就一樣到 Edges 靠 label 顯示關係吧。那因為我之前有多設定 relationship 該額外的屬性,因此才能使用。

    那如各位所見,其實還有其他的條件可以設定,但基本都是讓圖更加精緻,就請各位自行研究啦。

    3. 樣式展示

    那透過上方的排版格式,我們很容易的能看出相互關係。但如果今天想要如族譜有明確的階層關係,就與 from 與 to 的方向有關了。我們此時將 layout 從 forceAtlas2 改成 hierarchical,就會從 from 向下展開到 to 了。

    4. 資料的顯示與新增

    但今天我不想一筆一筆的勾選,要如何一次看完所有資料?我們首先要先透過 Settings 的 Limit 限制最多呈現多少節點,之後便能按下右上方的全選按鈕。現在下面的範例中,便能發現本該 421 筆卻只顯示 250 個節點,便是沒修改正確的 Limit 導致。

    那其實之後其實就不用回去看 Collection 的資料,也能夠在圖資料庫,按下右鍵直接新增資料或關聯。但大量的資料還是得回去 Collection 直接匯入 JSON 才行。

    那我們也能針對點跟線按右鍵,進行資料的編輯(這張是升級後補的,介面稍微不同)

    【後話】

    那透過這一期,我們建立了方便視覺化又能簡單管理的圖資料庫。但我們之後又要如何取值呢?則要依靠 Edge 的關係去做索引,那我們下次就會以 Query 為主題,簡單的展示常見的呼叫方式,與如何找出關聯資料。

  • [Arango DB] Graph Database – Collection 001 – Document and Edge Collection

    [Arango DB] Graph Database – Collection 001 – Document and Edge Collection

    【前言】

    Arango DB 相對多數的圖資料庫,特殊的便是圖資料庫與傳統的資料庫並存。藉由分出 Document(資料)與 Edge(關係)兩種集合,分開負責不同的檔案型態,又能直接透過 Edge 進行跨集合的資料連接。那這期我們就先從最基礎的資料與關聯開始建立。

    【重點整理】

    1. 社群版的 Web UI 只能上傳與匯出 JSON 格式,若要使用其他格式可自行參考 CLI 工具

    【可用資料】

    1. 本系列所使用之範例資料來自 Kaggle 的 Famous Paintings 之中的 artists.csv 與 works.csv
      https://www.kaggle.com/datasets/mexwell/famous-paintings
    2. csv 轉 json 工具
      https://csvjson.com/csv2json

    【預計內容】

    1. Document — 資料匯入
    2. Edge — 同資料集的連接
    3. Edge — 跨資料集的連接

    【主要內容】

    1. Document — 資料匯入

    在開始之前,我們當然需要先建立 Collection,這邊選擇 Document 形式,取好名後便可建立。那通常我們會推薦在尾部加上 vertices 或 nodes 標註用途。

    成功進入後,點擊進入設定介面,我們進入 Content 仍是一片空白,這時我們就將事先準備的資料進行匯入。但要注意的是,資料庫本身不會檢查資料是否重複,因此後續要新加入的資料要隔離開來。

    那如果想要手動新增任何資料,也可透過表格右上的按鈕透過輸入 JSON 格式進行添加。那可以看到,實際上是有辦法能指定資料的 key 值,我們未來再進行解說。

    那實際上資料欄位是可以增多或缺漏的,之後在提取時系統會自動認為 Null 空值,所以不用太擔心無法伸縮。(下圖刪除了 nationality 欄位)

    那再來,就麻煩各位再建立一個 work_vertices,匯入 work 資料集吧。

    2. Edge — 同資料集的連接

    那接著我們就要進入同資料集的關聯性,那我們就以畫家間的關聯來做介紹。那我們這次建立名為 artist_edges 的 Edge 型態的集合。

    那在這之中,我利用塞選條件找到作為師徒關係的 Eugène Boudin 與 Claude Monet,那 from 跟 to 其實只會影響資料提取時的方向,因此請在 Collection 統一格式。那 body 可以做為資料的延伸,如這邊我就標記師徒關係。(在圖資料庫的階層式分布中,from 會向下延伸到 to 節點)

    那為了之後的圖像化呈現,我再加上兩位 Claude Monet 的朋友 Paul Cézanne 與 Pierre-Auguste Renoir 兩個關聯。

    那其實這樣後,我們就完成集合內部的關聯囉。那其實也可以透過 _from 與 _to,先製作一份 JSON 直接匯入。但這個步驟,由於涉及到各式各樣的關聯,還是非常的消耗人力。

    3. Edge — 跨資料集的連接

    那再來我們建立新的 Edge Collection 叫 work_edges,我們接著要將多個作品連結到作者。那操作過上述流程,一樣使用 _id 來指定資料即可,只是這次會是不同資料及的內容。那在這邊我先塞選出登記在資料中的 Claude Monet 的作品。

    那我就使用前三筆,from 作者 to 作品來示範跨資料的連結了

    【後話】

    那建立完這些連結,一條一條的去看十分的難受。所以我們下一步,就要透過 Graph 功能,將上方兩個 Edge 進行圖像化,方便我們用眼看出關係。那麼,我們下期再會啦。

    【參考資料】

    [1] Arango DB Tutorial
    https://youtu.be/4C4zqhXwCKs?si=vHTrqR9tFbflJLyW