之前一篇文章寫了nebula圖數據庫的入門,今天具體講一下nebula中的相關查詢語法,nebula自己開發了一套ngql,同時也支持了部分cypher語句的查詢,查詢語法還是比較豐富的,對於初學者來說,具體場景應該使用哪種查詢語句就會比較困惑。
nebula可以用來查詢的語句關鍵字主要有:GO、FETCH、LOOKUP、MATCH、GET SUBGRAPH、FIND PATH。
我們可以先按需不需要基於索引查詢,可以分為兩類,需要索引:LOOKUP、MATCH
不需要索引:GO、FETCH、GET SUBGRAPH、FIND PATH。這里解釋一下為什么有的需要索引,因為nebula底層數據存儲是基於RocksDB,是一種K-V的存儲結構,nebula存儲數據的時候,key是基於VID生成的,也就是點的唯一標識ID,而屬性則經過序列化后存儲到value里面了,所以正常情況下,是沒有辦法根據屬性值過濾數據,因為屬性根本不在key里面,也不可能全量掃描去反序列化屬性值后再過濾,那樣性能太差。
nebula里面創建索引的目的其實不是為了加快查詢速度,創建索引其實是存儲了一份以屬性值為key的一份數據,這樣才有可能根據屬性是查找。
其實從各自的查詢語法定義就可以看出一些不一樣,GO、FETCH、GET SUBGRAPH、FIND PATH的語句都是開始需要指定VID,所以自然也就不需要依賴索引,而LOOKUP、MATCH沒有要求必須指定VID,所以需要依賴索引才可以正常查詢,沒有索引的情況會直接返回錯誤。這樣我們基本就可以區分了,如果你是需要基於屬性值查詢數據,你只能使用LOOKUP、MATCH,並且需要事先創建好索引。
我們再從業務場景來看,如果我們只是需要查看節點的屬性,不關心節點的關系的化,我們可以使用GO、FETCH、LOOKUP、MATCH,具體我們再怎么選呢。
GO和MATCH是可以滿足各種查詢場景的,功能相對比較豐富一點,我們留到后面討論。我們看一些FETCH和LOOKUP的區別。如果只是簡單的根據VID查詢,我建議使用FETCH查詢,直接根據VID查詢節點或邊的屬性值鄭州治療焦慮症哪個醫院好https://jbk.39.net/yiyuanfengcai/hj_zzjsyy/
如果是需要根據一些條件查詢的話,我們就可以使用LOOKUP,可以支持各種查詢條件的組合
我們再看一些稍微復雜一點的場景,如上圖用戶-訂單-商品的關系圖,我們需要查詢用戶張三買了哪些產品,我們應該怎么查詢呢?下面我們可以分別使用GO和MATCH查詢
對於不熟悉GO和MATCH語法的,相信也能看懂大概的意思,稍微解釋一下,GO語句中"Buy._dst"代表關系的終止節點,其中還用到了"|"管道符,用於把結果作為后面語句的入口,其中"-"代表前一條語句的結果,可以通過"−"代表前一條語句的結果,可以通過"-"獲取相應的屬性。MATCH語句就更好理解了,()代表一個節點,[]代表一個關系,通過-連接,其中箭頭代表了方向,也可以不帶箭頭,就代表雙向的關系。
現在如果我們需要查詢出人到產品的完整路徑,這時候我們怎么查呢?我們可以選擇GET SUBGRAPH和MATCH,GET SUBGRAPH是專門用來查詢子圖的,涉及這種路徑查詢的,第一就想到用這個。MATCH語句只要把上面的查詢稍微改一下就可以了。
下面是GET SUBGRAPH的定義,STEPS代表需要幾跳的距離,然后是指定邊的類型和方向,很好理解。
最后再介紹一下FIND PATH語句,主要是用來找出給定節點之間的路徑,給定起始點和終止點,通過圖算法幫你找出之間的所有路徑,主要有三種路徑類型,SHORTEST最短路徑,ALL所有路徑,NOLOOP非循環路徑。
今天就把nebula中所有的查詢語句都簡單介紹了一下,不過要想熟練使用還是得多多練習,最后再給一個思考題,如果要查詢買了可樂的用戶還買了什么商品,這個應該怎么查詢呢?