Neo4j 第七篇:模式(Pattern)

模式和模式匹配是Cypher的核心,使用模式來描述所需數據的形狀,該模式使用屬性圖的結構來描述,一般使用小括號()表示節點,-->表示關係,-[]->表示關係和關係的類型,箭頭表示關係的方向。html

一,節點模式

用小括號表示節點模式:(a),a是節點變量的名稱,用於引用圖中的某一個節點a。spa

對於匿名的節點,能夠使用()來表示,匿名的節點沒法引用,一般用來表示路徑中的佔位節點。code

1,標籤模式htm

在節點變量的後面,使用 :Lable 來表示標籤,標籤是節點的分組,一個節點能夠有一個標籤,也能夠有多個標籤,blog

好比,(a:User),(a:User:Admin)ip

2,指定屬性rem

節點和關係都有屬性,屬性模式能夠使用Map結構來表示,屬性模式的格式是{ key:value,..},使用大括號表示一個字典,包含一個或多個鍵/值對:文檔

(a {name: 'Andres', sport: 'Brazilian Ju-Jitsu'}) (a)-[{blocked: false}]->(b)

二,關係模式

關係模式是由節點和路徑來描述的,最簡單的關係模式兩個節點和一個路徑:it

(a)--(b)

該模式表示節點a和節點b之間存在關係,不指定關係的方向。class

1,關係的名稱和方向

關係也能夠被命名,Cypher使用[r]來表示關係變量:

(a)-[r]-(b)

關係是有方向的,使用箭頭指定關係的方向:

(a)-[r]->(b)

注意:圖中關係的方向是在建立關係時指定的,在執行Cypher查詢時,若是指定關係的方向,那麼沿着關係的方向進行模式匹配。

2,關係類型

就像節點具備標籤,能夠對節點進行分組,關係也能夠分組,Neo4j按照關係的類型對關係進行分組

(a)-[r:REL_TYPE]->(b)

可是不像節點能夠有多個標籤,關係只能由一個關係類型,可是,關係的類型能夠屬於一個集合,這使用 | 來分割,表示關係輸入集合中的任意一個類型:

(a)-[r:TYPE1|TYPE2]->(b)

三,路徑模式

路徑是由節點和關係構成的序列,在路徑中節點和關係是交替相連的,不可中斷。路徑的長度是指關係的數量,固定長度的路徑是指:路徑中關係的數量是固定不變的,可變長度的路徑是:指路徑中關係的數量是可變的。關係的數量有兩種表示方式:固定長度和變長。

  • 固定長度的關係,使用[* n]來表示
  • 變長的關係,使用[*start..end]來表示,其中 ..  表示關係的長度是可變的,start表示關係數量的最小值,end表示關係數量的最大值。

注:start和end均可以省略,若是省略start,那麼關係的長度 <= end;若是省略end,那麼關係的長度>=start;若是同時省略start和end,那麼關係的長度是任意的。

在變長關係模式中,也能夠指定關係的類型:[Type * start .. end ],變長關係只能用於MATCH查詢語句中,不能用於CREATE和MERGE語句中。

1,固定長度的關係

在關係[]中,使用*2表示關係的長度爲2,使用該模式來表示路徑,路徑兩端的節點是a和b,路徑中間的節點是匿名的,沒法經過變量來引用。

(a)-[*2]->(b)

該模式描述了3個節點和2個關係,路徑兩端的節點是a和b,中間節點是匿名節點,等價於如下的模式:

(a)-->()-->(b)

2,變長關係

在關係[]中,使用[*start .. end]來表示變長關係

(a)-[*3..5]->(b) (a)-[*3..]->(b) (a)-[*..5]->(b) (a)-[*]->(b)

3,路徑變量

Cypher容許對Path命名,把Path賦值給變量p,路徑模式能夠使用p來表示:

p = (a)-[*3..5]->(b)

4,舉個例子

有以下的有向圖數據,按照有向圖來計算路徑,最長的路徑長度是2;按照無向圖來計算路徑,最長的路徑長度是6。

分析如下Cypher查詢,在路徑模式中,路徑是無向的,路徑的長度是1或2,關係的類型是KNOWS,節點Filipa和節點remote_friend在同一條路徑中,

MATCH (me)-[:KNOWS*1..2]-(remote_friend) WHERE me.name = 'Filipa' RETURN remote_friend.name

 

 

參考文檔:

原文出處:https://www.cnblogs.com/ljhdo/p/10913917.html

相關文章
相關標籤/搜索