- 精通Neo4j
- 龐國明等
- 2347字
- 2023-07-17 19:01:07
3.3.1 MATCH語句
MATCH語句用于指定的模式檢索數據庫。
3.3.1.1 簡介
MATCH語句通過模式來檢索數據庫。它常與帶有約束或者斷言的WHERE語句一起使用,這使得匹配的模式更具體。斷言是模式描述的一部分,不能看作是匹配結果的過濾器。這意味著WHERE應當總是與MATCH語句放在一起使用。
MATCH可以出現在查詢的開始或者末尾,也可能位于WITH之后。如果它在語句開頭,此時不會綁定任何數據。Neo4j將設計一個搜索去找到匹配這個語句以及WHERE中指定斷言的結果。這將牽涉數據庫的掃描,搜索特定標簽的節點或者搜索一個索引以找到匹配模式的開始點。這個搜索找到的節點和關系可作為一個“綁定模式元素(Bound Pattern Elements)”。它可以用于匹配一些子圖的模式,也可以用于任何進一步的MATCH語句,Neo4j將使用這些已知的元素來找到更進一步的未知元素。
Cypher是聲明式的,因此查詢本身不指定搜索的算法。Neo4j會自動地用最好的方法去找到開始節點和匹配模式。WHERE中的斷言可以在模式匹配之前、匹配中或者匹配后進行處理。這可以通過查詢編譯器來影響這個決定。詳情可參見3.5.1節和3.6.4節。
MATCH語句示例如圖3-3所示。

圖3-3 MATCH語句示例
3.3.1.2 查找節點
1.查詢所有節點
通過指定一個不帶標簽的節點的模式,可以返回圖中的所有節點。
查詢:

結果將返回數據庫中的所有節點。
結果:

2.查詢帶有某個標簽的所有節點
通過指定帶有一個標簽的節點的模式,可以獲取滿足該標簽的所有節點。
查詢:

結果將返回數據庫中的所有電影。
結果:

3.查詢關聯節點
符號--意為相關的,這個關系不帶有類型和方向。
查詢:

結果將返回'Oliver Stone'導演的所有電影。
結果:

4.匹配標簽
可以為查詢的節點增加標簽約束。
查詢:

結果將返回與Person 'Oliver Stone'相連的帶有Movie標簽的所有節點。
結果:

3.3.1.3 查找關系
1.外向關系
關系的方向可以通過-->或者<--來表示。
查詢:

結果將返回與Person 'Oliver Stone'外向連接的所有節點。
結果:

2.有向關系和變量
當需要過濾關系中的屬性,或者返回關系的時候,就很有必要使用變量了。
查詢:

結果將返回'Oliver Stone'的外向關系的類型。
結果:

3.匹配關系類型
當已知要匹配關系的類型時,可通過冒號后面緊跟關系類型。
查詢:

結果將返回電影'Wall Street'中的所有演員。
結果:

4.匹配多種關系類型
當需要匹配多種關系中的一種時,可以通過豎線(|)將多個關系連接在一起。
查詢:
結果將返回與'Wall Street'節點關系為ACTED_IN或者DIRECTED的所有節點。
結果:

5.匹配關系類型和使用關系變量
如果想通過變量來引用關系和指定關系類型,可以將它們放在一起。例如:
查詢:

結果將返回電影'Wall Street'中所有演員的角色。
結果:

3.3.1.4 關系的深度
1.帶有特殊字符的關系類型
某些時候數據庫中可能會有非字母字符的類型,或者中間含有空格。可以使用反引號“`”將它們括起來。下面的例子在'Charlie Sheen'和'Rob Reiner'之間添加了一個包含有空格的關系。
查詢:

該查詢產生的結果如圖3-4所示。

圖3-4 查詢結果圖
查詢:

結果將返回帶有空格的關系類型。
結果:

2.多個關系
關系可以多語句以()--()的形式來表達,或者它們相互連接在一起。例如:
查詢:

結果將返回'Charlie Sheen'參演的電影和電影的導演。
結果:

3.可變長度關系
可變長度關系和節點的語法如下:

minHops和maxHops都是可選的,默認值分別為1和無窮大。當沒有邊界值的時候,點也是可以省略的。當只設置了一個邊界的時候,如果省略了點,則意味著這是一個固定長度的模式。
查詢:

結果將返回與'Charlie Sheen'具有1跳(Hop)到3跳關系的所有電影。
結果:

4.具有多種關系類型的可變長度關系
可變長度關系可以與多種關系類型組合。在這種情況下,*minHops..maxHops適用于所有關系類型以及它們的任何組合。
查詢:

結果將返回與'Charlie Sheen'具有2跳ACTED_IN或DIRECTED關系的所有人員。
結果:

5.可變長度關系的關系變量
當連接兩個節點之間的長度是可變的,那么關系變量返回的將可能是一個關系列表。
查詢:

結果將返回一個關系列表。
結果:

6.可變長度路徑上的屬性匹配
帶有屬性的可變長度關系,意味著路徑上的所有關系都必須包含給定的屬性值。在這個查詢中,'Charlie Sheen'和他的父親'Martin Sheen'之間有兩條路徑。其中一條包含一個'blocked'關系,另外一條則沒有。首先,通過下面的語句增加BLOCKED和UNBLOCKED關系。
查詢:

后續將以圖3-5為基礎來講解。

圖3-5 可變長度路徑上的屬性匹配圖例
查詢:

結果將返回'Charlie Sheen'和'Martin Sheen'之間滿足blocked屬性值為false的所有關系。
結果:

7.零長度路徑
可以通過指定可變長度路徑的下界值為零,來實現兩個變量指向同一個節點。
查詢:

結果將返回電影本身及一跳關系的演員和導演。
結果:

8.命名路徑
如果想返回或者需要對路徑進行過濾,可以將路徑賦值給一個變量。
查詢:

結果將返回從'Michael Douglas'開始的路徑。
結果:

9.不指定方向匹配關系
可以不指定方向來匹配關系,Cypher將嘗試匹配兩個方向的關系。
查詢:

結果將返回兩個相連的節點a和b。
結果:

3.3.1.5 最短路徑
1.單條最短路徑
通過使用shortestPath函數很容易找到兩個節點之間的最短路徑,如下所示。
查詢:

上面查詢的含義為:找到兩個節點之間的最短路徑,路徑最大長度為15。在搜索最短路徑的時候,還可以使用關系類型、最大跳數和方向等約束條件。如果用到了WHERE語句,則相關的斷言會被包含到shortestPath中去。如果路徑的關系元素中用到了none()或者all()斷言,那么這些將用于在檢索時提高性能。
結果:

2.帶斷言的最短路徑
查詢:

這個查詢尋找'Charlie Sheen'和'Martin Sheen'之間的最短路徑,通過WHERE斷言可以確保不考慮兩個節點之間的父親/兒子關系。
結果:

3.所有最短路徑
找到兩個節點之間的所有最短路徑。
查詢:

結果將找到'Martin Sheen'和'Michael Douglas'之間的兩條最短路徑。
結果:

3.3.1.6 通過id查詢節點或關系
1.通過id查詢節點
可以在斷言中使用id()函數來根據id查詢節點。
提示:Neo4j會重用已刪除的節點和關系的內部id。這意味著依賴Neo4j內部的id存在風險。因此,建議通過程序來產生id。
查詢:

結果將返回節點id為0的節點。
結果:

2.通過id查詢關系
通過id查詢關系與查詢節點類似,但在實踐中不推薦這么做。
查詢:

結果將返回關系id為0的關系。
結果:

3.通過id查詢多個節點
通過id查詢多個節點的時候,可以將id放到IN語句中。
查詢:

結果將返回IN語句中列出的所有節點。
結果:

- 數據分析實戰:基于EXCEL和SPSS系列工具的實踐
- Python數據分析入門:從數據獲取到可視化
- Python金融大數據分析(第2版)
- UDK iOS Game Development Beginner's Guide
- Python數據分析:基于Plotly的動態可視化繪圖
- Ceph源碼分析
- ZeroMQ
- IPython Interactive Computing and Visualization Cookbook(Second Edition)
- INSTANT Android Fragmentation Management How-to
- Google Cloud Platform for Developers
- Augmented Reality using Appcelerator Titanium Starter
- 數字IC設計入門(微課視頻版)
- Python 3爬蟲、數據清洗與可視化實戰
- 數據分析思維:產品經理的成長筆記
- Nagios Core Administrators Cookbook