據(jù)庫中關(guān)系即實(shí)體的奧秘)
NeoEloquent Edges 核心概念理解圖數(shù)據(jù)庫中關(guān)系即實(shí)體的奧秘【免費(fèi)下載鏈接】NeoEloquentThe Neo4j OGM for Laravel項(xiàng)目地址: https://gitcode.com/gh_mirrors/ne/NeoEloquentNeoEloquent 是 Laravel 生態(tài)中最受歡迎的 Neo4j 對象圖映射OGM工具而NeoEloquent Edges正是它最具圖思維特色的核心概念。在傳統(tǒng)關(guān)系型數(shù)據(jù)庫里關(guān)系只是一串外鍵但在 Neo4j 圖數(shù)據(jù)庫中關(guān)系本身就是一個可以攜帶屬性的實(shí)體。這篇文章將帶你用最直觀的方式理解 NeoEloquent Edges 如何讓 Laravel 開發(fā)者像操作普通模型一樣操作圖關(guān)系徹底解鎖圖數(shù)據(jù)庫關(guān)系即數(shù)據(jù)的潛力。為什么說圖數(shù)據(jù)庫里關(guān)系即實(shí)體先看一張對比表你會立刻明白差異所在數(shù)據(jù)庫類型關(guān)系如何表示關(guān)系能帶屬性嗎關(guān)系型SQL外鍵字段? 需拆中間表文檔型Mongo內(nèi)嵌引用? 只能存引用圖數(shù)據(jù)庫Neo4j獨(dú)立的邊Relationship? 天然支持在 Neo4j 中一條關(guān)系就像一枚貼了標(biāo)簽的箭頭箭頭身上還能掛載任意屬性。比如演員參演電影這條關(guān)系可以攜帶role角色名屬性(keanu)-[:ACTS_IN { role: Neo }]-(matrix1)這正是 NeoEloquent 引入Edges邊的原因——把關(guān)系包裝成輕量模型讓你用 Laravel 最熟悉的方式讀寫關(guān)系屬性。認(rèn)識 NeoEloquent Edges關(guān)系的輕量模型NeoEloquent 的 Edges 家族都位于src/Eloquent/Edges/目錄下核心是抽象基類Edge它定義了關(guān)系的骨架方向direction決定誰是起始節(jié)點(diǎn)、誰是結(jié)束節(jié)點(diǎn)屬性attributes關(guān)系的自有屬性像模型字段一樣讀寫時間戳自動維護(hù)created_at和updated_at主鍵每條關(guān)系也有自己的 ID。簡單說Edge 就是關(guān)系的模型層。你可以這樣給它賦值并保存$edge $location-associate($user); // 得到一個 EdgeIn $edge-last_visited today; // 像模型一樣設(shè)屬性 $edge-save(); // 寫入數(shù)據(jù)庫EdgeIn 與 EdgeOut一眼看懂關(guān)系方向方向是圖關(guān)系最重要的特征。NeoEloquent 用兩個子類來表達(dá)EdgeOut出邊從父模型指向關(guān)聯(lián)模型對應(yīng)hasOne/hasMany這類外向關(guān)系EdgeIn入邊從關(guān)聯(lián)模型指向父模型對應(yīng)belongsTo這類內(nèi)向關(guān)系。以用戶發(fā)帖為例(:User)-[:POSTED]-(:Post)是典型的出邊返回的就是EdgeOut實(shí)例而位置屬于用戶則映射為(:Location)-[:LOCATED_AT]-(:User)返回EdgeIn實(shí)例。這兩個類的源碼極其精簡真正的工作都在基類Edge中完成。你甚至可以通過$edge-parent()和$edge-related()取回關(guān)系兩端的模型非常方便。HyperEdge 超邊三個節(jié)點(diǎn)間的復(fù)雜關(guān)系如果關(guān)系不止涉及兩個節(jié)點(diǎn)呢比如用戶評論了某篇文章——這涉及用戶、評論、文章三個節(jié)點(diǎn)。NeoEloquent 用HyperEdge超邊解決這個問題對應(yīng)多態(tài)關(guān)系hyperMorph。HyperEdge 內(nèi)部由兩條邊拼接而成左邊緣left用戶 → 評論右邊緣right評論 → 文章。你可以像剝洋蔥一樣逐層訪問$edge $user-comments($post)-save($comment); $user $edge-parent(); // 用戶 $comment $edge-hyper(); // 中間的評論節(jié)點(diǎn) $post $edge-related(); // 文章給關(guān)系加屬性Edge 的增刪改查Edge 最實(shí)用的場景就是為關(guān)系加料。例如給關(guān)注關(guān)系記錄時間$relation $jd-followers()-attach($mc); $relation-since 2015; $relation-save();在父模型開啟$timestamps時Edge 還會自動維護(hù)創(chuàng)建和更新時間戳讀取時自動轉(zhuǎn)為 Carbon 實(shí)例。刪除關(guān)系同樣簡單調(diào)用$edge-delete()即可NeoEloquent 會根據(jù)方向自動匹配兩端節(jié)點(diǎn)。快速上手3 個使用 Edge 的實(shí)操場景場景一關(guān)聯(lián)已存在的模型并保存$location Location::find(1922); $user User::find(3876); $location-associate($user)-save();場景二查詢兩個模型之間的邊$edge $location-user()-edge(); // 取回 EdgeIn 實(shí)例場景三通過邊操作關(guān)系屬性$edge-since 1966; $edge-present true; $edge-save();源碼導(dǎo)讀Edge 家族文件一覽如果你想深入了解實(shí)現(xiàn)細(xì)節(jié)可以參考以下源碼文件均位于src/Eloquent/Edges/文件職責(zé)Edge.php抽象基類方向判斷、屬性、時間戳、保存與刪除EdgeIn.php入邊實(shí)現(xiàn)固定方向?yàn)閕nEdgeOut.php出邊實(shí)現(xiàn)固定方向?yàn)閛utHyperEdge.php超邊組合左右兩條邊表達(dá)三元關(guān)系Finder.php查找器在模型間定位關(guān)系并構(gòu)造 Edge 實(shí)例Delegate.php公共基類連接管理、節(jié)點(diǎn)轉(zhuǎn)換、屬性組裝此外README 的 Edges 章節(jié) 提供了完整的代碼示例官方示例項(xiàng)目則位于Examples/Movies/包含模型與啟動腳本非常適合動手實(shí)踐??偨Y(jié)NeoEloquent Edges 的精髓只有一句話把圖數(shù)據(jù)庫的關(guān)系當(dāng)作一等公民。借助EdgeIn、EdgeOut和HyperEdge你可以在 Laravel 中以優(yōu)雅的 Eloquent 風(fēng)格為關(guān)系附加屬性、管理方向、處理多節(jié)點(diǎn)復(fù)雜場景。掌握了 Edges你就真正拿到了圖數(shù)據(jù)庫建模的鑰匙讓社交關(guān)系、推薦系統(tǒng)、權(quán)限圖譜等業(yè)務(wù)在 Neo4j 上如魚得水?!久赓M(fèi)下載鏈接】NeoEloquentThe Neo4j OGM for Laravel項(xiàng)目地址: https://gitcode.com/gh_mirrors/ne/NeoEloquent創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考