iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 13
0
AI & Data

看圖說故事,讓 Neo4j 重新詮釋你的資料庫系列 第 13

Neo4j Bloom 自然語言搜尋

我們在上一篇文章簡單介紹了 Neo4j Bloom 特性,今天就進一步來玩看看 Bloom 囉!

查看 Graph DB Schema

RDBMS 的 DB Schema 會有一堆資料表和欄位的定義;Graph DB Schema 則是一覽 Label、Property、Relation。在探索資料前,還是得先對 DB Schema 有初步的認識,否則根本不知要查什麼啊!

舊版的 Neo4j Browser 輸入以下指令即可

CALL db.schema()

但似乎 Neo4j Browser 4.0 以後指令改掉了,如下

CALL db.schema.visualization()

以北風資料庫為例,會看到類似這樣的結果

Neo4j DB Schema

如圖所示,我們可以得到簡單的概念:客戶會對產品下訂單,而這些產品分別來自不同的供應商,以及不同的分類。
對 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']})

自由探索 Neo4j Bloom

探索的方式還是得根據你想知道什麼?想對資料問什麼問題,或是你已知的商業行為去做調整。如果你還不知道怎麼開始,可以先試著自由探索。

例如你對客戶的資料與行為感興趣,可以先輸入 Customer 來一覽所有客戶,並 double-click 想查看的客戶資料如下

Neo4j Bloom Node detail

這個操作只是先知道客戶會有哪些屬性資料,以及總共有多少客戶資料,有需要的話,也可以直接編輯修改每個屬性。
但您是否有發現這張圖根本看不懂?!怎麼都是一些大寫英文字呢?這是因為 Bloom 用 Customer.customerID 來顯示,這當然不是我們要的,此時我們可以先查看一下所有欄位屬性,確定屬性名稱,然後修改方式如下:

Change Node Caption

  1. 點選左上角按鈕,可以看到 Categories, Relationships 和 Search
  2. 點選想要修改的 Label,就可以看到所有屬性;在想要顯示的屬性打勾,想隱藏的屬性取消勾選即可。如果想要顯示多個屬性,可以多選。

如圖,我們把 Customer 預設顯示屬性改為 companyName

Neo4j Bloom Caption

Dismiss other nodes

改完 Caption 之後會立即生效,客戶的節點已經全部以公司名稱顯示,接下來如果有想要查看特定的客戶,其他客戶節點會造成干擾而想要隱藏,只需點選 [Dismiss other nodes] 即可。

Neo4j Bloom Dismiss other nodes

Expand Node

把焦點放在特定的客戶之後,接下來想看這位客戶的關係,例如相關的訂單與產品,可以選擇 [Expand],有兩種操作方式,第一種是在節點上按右鍵選 [Expand],這裡的子選單可以預覽所有可能的節點關係,可以選擇只探索某種關係,或是全部的關係;第二種是選擇節點後,打開下方選擇清單,點選 [Expand]

Neo4j Bloom Expand

Neo4j Bloom Expand

展開第一層關係後,大概會像是這樣,也就是這位客戶的所有訂單

Neo4j Bloom Node Expanded

但我們真正關心的,可能是該訂單背後的產品,理論上可以依照上面的操作模式,一層一層展開,但有點沒效率。
接下來就跟大家介紹 Neo4j Bloom 的另一個魅力,近似自然語言的搜尋

Neo4j Bloom 自然語言搜尋

Neo4j Bloom 有一些搜尋模式,我是閱讀前輩們的原文得來,有些我不確定怎麼翻譯較好,就直接貼原文囉。學習這些搜尋模式,有助於提升搜尋的效率與準確度,並釐清頭緒。

Specific path

呈上面需求,我們想要知道 QUICK-Shop 這位客戶購買過的產品,只需要搜尋

QUICK Order Product

Neo4j Bloom Search Suggestion

也就是明確指定一條路徑,把符合這條路徑,無論是什麼關係,都找出來。如圖,Bloom 會去找出各種可能性並推薦給我們。

Neo4j Bloom Search Specific path

同理,如果我們還想知道這些產品的供應商是誰,就可以這樣搜尋

QUICK Order Product Supplier

Shortest path

在之前的Cypher文章有介紹過 shortestPath() 函數,尋找兩個節點之間最短距離,除了自已下 Cypher 語法之外,Bloom 也把這個常見需求包含進來了!只需要複選兩個節點(Ctrl/Command + 滑鼠左鍵),然後右鍵選單就可以操作 Path -> Shortest Path。

Neo4j Bloom Shortest path

結果如下,不過要留意的是,最短路徑可能不只一條,Bloom 只是任選一條顯示,不一定是我們想要的路徑。

Neo4j Bloom Shortest Path result

除此之外,複選兩個節點時,也可以修改關聯,建立關係

Neo4j Bloom Create Relations

Paths between nodes

呈上,即使得到了最短路徑,實務上可能不是我們想要的,那麼可以試著列出兩個節點間的其他路徑選擇。

下圖是找出客戶 QUICK-Shop 和 Ernst Handel 之間所有購買過產品 Chang 的訂單

QUICK Order Chang Order Ernst Handel 

Neo4j Bloom Path between nodes

接著我們再複習第一個模式的範例,要找出客戶 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/

更新紀錄

  • 2020/10/18 新增 apoc.meta.graph 指令查看 DB Schema

上一篇
Neo4j 探索資料特性與價值的工具 - Bloom
下一篇
Neo4j Bloom 自然語言搜尋與自訂樣式
系列文
看圖說故事,讓 Neo4j 重新詮釋你的資料庫30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言