官术网_书友最值得收藏!

  • 精通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語句中列出的所有節點。

結果:

主站蜘蛛池模板: 磐安县| 银川市| 青神县| 临澧县| 广西| 大石桥市| 清流县| 巴东县| 普格县| 内江市| 青岛市| 福安市| 广宗县| 延安市| 康定县| 济南市| 基隆市| 筠连县| 嘉荫县| 牟定县| 东阿县| 衢州市| 璧山县| 石楼县| 中江县| 滦南县| 田林县| 秦皇岛市| 景东| 新安县| 沧源| 曲周县| 焦作市| 团风县| 旬邑县| 英吉沙县| 宁乡县| 公安县| 会同县| 株洲市| 泰安市|