- 精通Neo4j
- 龐國明等
- 1603字
- 2023-07-17 19:01:05
3.2.7 模式
模式和模式匹配是Cypher非常核心的部分。要高效地使用Cypher必須深入理解模式。
使用模式可以描述你期望看到的數據的形狀。例如,在MATCH語句中,當用模式描述一個形狀的時候,Cypher將按照模式來獲取相應的數據。
模式描述數據的形式類似于在白板上畫出圖的形狀。通常用圓圈來表達節點,使用箭頭來表達關系。
模式在MATCH、CREATE和MERGE等語句中都會出現,后續章節會詳細描述。
3.2.7.1 節點模式
模式能表達的最簡單的形狀就是節點。節點使用一對圓括號表示,然后中間含一個名字。例如:

這個模式描述了一個節點,其名稱使用變量a表示。
3.2.7.2 關聯節點的模式
模式可以描述多個節點及其之間的關系。Cypher使用箭頭來表達兩個節點之間的關系。例如:

這個模式描述了一個非常簡單的數據形狀,即兩個節點和從其中一個節點到另外一個節點的關系。兩個節點分別命名為a和b,關系是有方向的,從a指向b。
這種描述節點和關系的方式可以擴展到任意數量的節點和它們之間的關系,例如:

這一系列相互關聯的節點和關系被稱為路徑。
注意,節點的命名僅僅當后續的模式或者Cypher查詢中需要引用時才需要。如果不需要引用,則命名可以省略。例如:

3.2.7.3 標簽
模式除了可以描述節點之外,還可以用來描述標簽。比如:

也可以描述一個節點的多個標簽,如:

3.2.7.4 指定屬性
節點和關系是圖的基礎結構。Neo4j的節點和關系都可以有屬性,這樣可以建立更豐富的模型。屬性在模式中使用鍵值對的Map結構來表示,然后用大括號包起來。例如,一個有兩個屬性的節點如下所示:

關系中的屬性如下所示:

當模式中有屬性時,它實際上為數據增加了額外的約束。在CREATE語句中,屬性會被增加到新創建的節點和關系中。在MERGE語句中,屬性將作為一個約束去匹配數據庫中的數據是否存在該屬性。如果沒有匹配到,則這時MERGE的行為將與CREATE一樣,即屬性將被設置到新創建的節點和關系中。
提示:模式在CREATE語句中支持使用單個參數來指定屬性。例如:CREATE (node$paramName)。但這在其他語句中是不行的,因為Cypher在編譯查詢的時候需要知道屬性的名稱,以便能夠高效地匹配。
3.2.7.5 描述關系
如前面的例子所示,可以用箭頭簡單地描述兩個節點之間的關系。它描述了關系的存在性和方向性。但如果不關心關系的方向,則箭頭的頭部可以省略。例如:

與節點類似,如果后續需要引用到該關系,則可以給關系賦一個變量名。變量名需要用方括號括起來,放在箭頭的短橫線中間,如下所示:

就像節點有標簽一樣,關系可以有類型。可以通過如下方式給關系指定類型:

不像節點可以有多個標簽,關系只能有一個類型。但如果所描述的關系可以是一個類型集中的任意一種類型,可以將這些類型都列入模式中,它們之間以豎線“|”分隔,例如:

注意:這種模式僅適用于描述已經存在的數據(如在MATCH語句中),而在CREATE或者MERGE語句中是不允許的,因為一個關系不能創建多個類型。
與節點類似,關系的命名也是可以省略的,例如:

與使用一串節點和關系來描述一個長路徑的模式不同,很多關系(以及中間的節點)可以采用指定關系的長度的模式來描述,例如:

它描述了一張有三個節點和兩個關系的圖。這些節點和關系都在同一條路徑中(路徑的長度為2)。它等同于:

關系的長度也可以指定一個范圍,這被稱為可變長度的關系,例如:

關系的長度最小值為3,最大值為5。它描述了一個或者有4個節點和3個關系,或者5個節點4個關系,或者6個節點和5個關系連在一起的圖組成的一條路徑。
長度的邊界也是可以省略的,如描述一個路徑長度大于等于3的路徑:

路徑長度小于等于5的路徑,例如:

兩個邊界都可以省略,這允許任意長度的路徑,例如:

我們來看一個簡單的查詢例子:
查詢:

結果:

這個查詢用于找到符合這個模式的數據:即指定一個節點(name屬性值為Filipa)和與它關系為KNOWS的一步和兩步的節點。這是一個查詢一度和二度人脈的典型例子。
提示:可變長度的關系不能用于CREATE和MERGE語句。
3.2.7.6 賦值給路徑變量
如上所述,連接在一起的一系列節點和關系稱為路徑。Cypher允許使用標識符給路徑命名,例如:

在MATCH、CREAT和MERGE語句中可以這樣做,但當模式作為表達式的時候不能這樣做。