我們在上一篇文章簡單介紹了 Neo4j Bloom 特性,今天就進一步來玩看看 Bloom 囉!
RDBMS 的 DB Schema 會有一堆資料表和欄位的定義;Graph DB Schema 則是一覽 Label、Property、Relation。在探索資料前,還是得先對 DB Schema 有初步的認識,否則根本不知要查什麼啊!
舊版的 Neo4j Browser 輸入以下指令即可
CALL db.schema()
但似乎 Neo4j Browser 4.0 以後指令改掉了,如下
CALL db.schema.visualization()
以北風資料庫為例,會看到類似這樣的結果
如圖所示,我們可以得到簡單的概念:客戶會對產品下訂單,而這些產品分別來自不同的供應商,以及不同的分類。
對 DB Schema 有概念之後,接著就可以開始探索了~
不過上述查看 DB Schema 的指令,到目前版本(4.1.1)為止仍存在 Bug如下:
如果曾經建立兩種標籤之間的關係,後來這個關係被刪掉了,卻還是會顯示在上述的 Schema 圖形中,會誤導開發者。
APOC library 之中有一個指令也可以查看 DB Schema,會過濾掉被刪除的關係,並且還可以看到每種標籤所包含的總結點數。
CALL apoc.meta.graph
更棒的是,使用 APOC library 可以只查看局部的 DB Schema,這在資料庫結構非常複雜時會很好用,以下範例
**只顯示包含 Custoemr、Order、Product 標籤的 db schema,以及彼此之間的所有關係,但如果有 PURCHASE 關係則隱藏 **
CALL apoc.meta.subGraph({labels:['Customer', 'Order', 'Product'] ,excludes:['PURCHASE']})
**只顯示包含 Custoemr、Order、Product 標籤的 db schema,以及只顯示 ORDER、PART_OF 兩種關係 **
CALL apoc.meta.subGraph({labels:['Customer', 'Order', 'Product'], rels:['ORDER', 'PART_OF']})
探索的方式還是得根據你想知道什麼?想對資料問什麼問題,或是你已知的商業行為去做調整。如果你還不知道怎麼開始,可以先試著自由探索。
例如你對客戶的資料與行為感興趣,可以先輸入 Customer 來一覽所有客戶,並 double-click 想查看的客戶資料如下
這個操作只是先知道客戶會有哪些屬性資料,以及總共有多少客戶資料,有需要的話,也可以直接編輯修改每個屬性。
但您是否有發現這張圖根本看不懂?!怎麼都是一些大寫英文字呢?這是因為 Bloom 用 Customer.customerID 來顯示,這當然不是我們要的,此時我們可以先查看一下所有欄位屬性,確定屬性名稱,然後修改方式如下:
如圖,我們把 Customer 預設顯示屬性改為 companyName
改完 Caption 之後會立即生效,客戶的節點已經全部以公司名稱顯示,接下來如果有想要查看特定的客戶,其他客戶節點會造成干擾而想要隱藏,只需點選 [Dismiss other nodes] 即可。
把焦點放在特定的客戶之後,接下來想看這位客戶的關係,例如相關的訂單與產品,可以選擇 [Expand],有兩種操作方式,第一種是在節點上按右鍵選 [Expand],這裡的子選單可以預覽所有可能的節點關係,可以選擇只探索某種關係,或是全部的關係;第二種是選擇節點後,打開下方選擇清單,點選 [Expand]
展開第一層關係後,大概會像是這樣,也就是這位客戶的所有訂單
但我們真正關心的,可能是該訂單背後的產品,理論上可以依照上面的操作模式,一層一層展開,但有點沒效率。
接下來就跟大家介紹 Neo4j Bloom 的另一個魅力,近似自然語言的搜尋
Neo4j Bloom 有一些搜尋模式,我是閱讀前輩們的原文得來,有些我不確定怎麼翻譯較好,就直接貼原文囉。學習這些搜尋模式,有助於提升搜尋的效率與準確度,並釐清頭緒。
呈上面需求,我們想要知道 QUICK-Shop 這位客戶購買過的產品,只需要搜尋
QUICK Order Product
也就是明確指定一條路徑,把符合這條路徑,無論是什麼關係,都找出來。如圖,Bloom 會去找出各種可能性並推薦給我們。
同理,如果我們還想知道這些產品的供應商是誰,就可以這樣搜尋
QUICK Order Product Supplier
在之前的Cypher文章有介紹過 shortestPath() 函數,尋找兩個節點之間最短距離,除了自已下 Cypher 語法之外,Bloom 也把這個常見需求包含進來了!只需要複選兩個節點(Ctrl/Command + 滑鼠左鍵),然後右鍵選單就可以操作 Path -> Shortest Path。
結果如下,不過要留意的是,最短路徑可能不只一條,Bloom 只是任選一條顯示,不一定是我們想要的路徑。
除此之外,複選兩個節點時,也可以修改關聯,建立關係
呈上,即使得到了最短路徑,實務上可能不是我們想要的,那麼可以試著列出兩個節點間的其他路徑選擇。
下圖是找出客戶 QUICK-Shop 和 Ernst Handel 之間所有購買過產品 Chang 的訂單
QUICK Order Chang Order Ernst Handel
接著我們再複習第一個模式的範例,要找出客戶 QUICK-Shop 訂購的產品以及供應商
QUICK Order Product Supplier
不過這樣找下來,資訊非常多,我們可以更精確地問,QUICK-Shop 這位客戶曾經購買過供應商 Tokyo Traders 的哪些產品? 如下都是可以的
QUICK Order Product Tokyo Traders
QUICK Order Product Tokyo
QUICK Order Product Tok
我們還可以再問,QUICK-Shop 購買過哪些海鮮產品?
QUICK Order Product part of Seafood
這裡明確指定了 Relation,但也可省略如下
QUICK Order Product Seafood
你不用特地告訴 Bloom,Seafood 是產品的分類名稱。
顯然地,Bloom 會去猜測你搜尋的意圖,當然這前提是先看過 DB Schema,以及你要搜尋的節點名字或關鍵字。我們不需要明確告訴 Bloom 要找什麼 Label、用什麼 Relation 和 Property,也不用告訴它 QUICK-Shop 是客戶的公司名稱,Bloom 會自動掃瞄各種可能性。
當然你還是可以明確寫出 Relation,這樣語句上會更接近自然語言,而 Relation 包含的底線或其他特殊符號會被忽略,以空白填補即可。
以上就是用 Neo4j Bloom 探索資料庫的一些常見做法,下次會繼續分享其他的搜尋方式、圖形、顏色的自訂,以及在 Bloom 使用 Cypher 語法查詢,請看官們繼續支持~
參考來源:
https://medium.com/neo4j/tips-and-tricks-in-neo4j-bloom-41e4b3b1cc8f
https://neo4j.com/labs/apoc/4.1/database-introspection/meta/
更新紀錄