Patterns
圖形模式匹配是Cypher的核心。它是一種用于通過(guò)應(yīng)用聲明性模式從圖中導(dǎo)航、描述和提取數(shù)據(jù)的機(jī)制。在MATCH子句中,可以使用圖模式定義要搜索的數(shù)據(jù)和要返回的數(shù)據(jù)。圖模式匹配也可以在不使用MATCH子句的情況下在EXISTS、COUNT和COLLECT子查詢中使用。
圖模式使用類似于在白板上繪制屬性圖的節(jié)點(diǎn)和關(guān)系的語(yǔ)法來(lái)描述數(shù)據(jù)。在白板上,節(jié)點(diǎn)繪制為圓圈,關(guān)系繪制為箭頭。Cypher將圓圈表示為一對(duì)括號(hào),箭頭表示為破折號(hào)和大于或小于符號(hào): ()-->()<--()
這些節(jié)點(diǎn)和關(guān)系的簡(jiǎn)單模式構(gòu)成了路徑模式的構(gòu)建塊,可以匹配固定長(zhǎng)度的路徑。除了討論簡(jiǎn)單的模式外,本章還將介紹更復(fù)雜的模式,展示如何匹配可變長(zhǎng)度的模式,內(nèi)聯(lián)過(guò)濾器以提高查詢性能,以及如何向路徑模式添加循環(huán)和非線性形狀。
概念
Node patterns
每個(gè)圖模式至少包含一個(gè)節(jié)點(diǎn)模式。最簡(jiǎn)單的圖形模式是單個(gè)空節(jié)點(diǎn)模式: MATCH ()
。
空節(jié)點(diǎn)模式匹配屬性圖中的每個(gè)節(jié)點(diǎn)。為了獲得對(duì)匹配節(jié)點(diǎn)的引用,需要在node模式中聲明一個(gè)變量: MATCH (n)
通過(guò)這個(gè)變量引用,可以訪問(wèn)節(jié)點(diǎn):MATCH (n) RETURN n.name
向節(jié)點(diǎn)模式添加Label表達(dá)式意味著只返回具有匹配標(biāo)簽的節(jié)點(diǎn)。MATCH (n:Stop)
更復(fù)雜模式:MATCH (n:(TrainStation&BusStation)|StationGroup)
屬性名稱和值的映射可用于基于與指定值的相等性來(lái)匹配節(jié)點(diǎn)屬性。MATCH (n { mode: 'Rail' })
更一般的謂詞可以用WHERE
子句表示。MATCH (n:Station WHERE n.name STARTS WITH 'Preston')
Relationship patterns
最簡(jiǎn)單的關(guān)系模式: --
。此模式匹配任何方向的關(guān)系,并且不過(guò)濾任何關(guān)系類型或?qū)傩?。與節(jié)點(diǎn)模式不同,關(guān)系模式不能在兩端沒(méi)有節(jié)點(diǎn)模式的MATCH
子句中使用。
為了獲得對(duì)模式匹配的關(guān)系的引用,需要在模式中聲明一個(gè)關(guān)系變量,方法是在破折號(hào)之間的方括號(hào)中添加變量名:-[r]-
為了匹配特定的方向,在左側(cè)或右側(cè)分別加上<
或>
: -[r]->
若要匹配關(guān)系類型,在冒號(hào)后添加類型名稱: -[:CALLS_AT]->
與節(jié)點(diǎn)模式類似,可以添加屬性名稱和值的映射,以基于與指定值的相等性來(lái)過(guò)濾關(guān)系的屬性: -[{ distance: 0.24, duration: 'PT4M' }]->
。WHERE
子句可以用于更一般的謂詞: -[r WHERE time() + duration(r.duration) < time('22:00') ]->
。
Path patterns
任何有效的路徑都以一個(gè)節(jié)點(diǎn)開(kāi)始和結(jié)束,每個(gè)節(jié)點(diǎn)之間都有關(guān)系(如果有多個(gè)節(jié)點(diǎn))。路徑模式具有相同的限制,對(duì)于所有有效的路徑模式,以下條件為真:
-
它們至少有一個(gè)節(jié)點(diǎn)模式。
-
它們以節(jié)點(diǎn)模式開(kāi)始和結(jié)束。
-
它們?cè)诠?jié)點(diǎn)和關(guān)系之間交替。
這些都是有效的路徑模式:
()
(s)--(e)
(:Station)--()<--(m WHERE m.departs > time('12:00'))-->()-[:NEXT]->(n)
無(wú)效路徑模式:
--> //無(wú)節(jié)點(diǎn)
()--> //尾部沒(méi)有節(jié)點(diǎn)
()-->-->() //節(jié)點(diǎn)和關(guān)系之間無(wú)交替
路徑模式匹配
Equijoins
等量連接是一種對(duì)路徑的操作,它要求多個(gè)節(jié)點(diǎn)或路徑之間的關(guān)系相同。通過(guò)在多個(gè)節(jié)點(diǎn)模式或關(guān)系模式中聲明相同的變量來(lái)指定節(jié)點(diǎn)或關(guān)系之間的相等性。等量連接允許在路徑模式中指定循環(huán)。
MATCH (n:Station {name: 'London Euston'})<-[:CALLS_AT]-(s1:Stop)
-[:NEXT]->(s2:Stop)-[:CALLS_AT]->(:Station {name: 'Coventry'})
<-[:CALLS_AT]-(s3:Stop)-[:NEXT]->(s4:Stop)-[:CALLS_AT]->(n)
RETURN s1.departs+'-'+s2.departs AS outbound,
s3.departs+'-'+s4.departs AS `return`
量化路徑模式
通過(guò)使用量化路徑模式來(lái)匹配不同長(zhǎng)度的路徑,從而允許您搜索長(zhǎng)度未知或在特定范圍內(nèi)的路徑。
在搜索可從錨節(jié)點(diǎn)到達(dá)的所有節(jié)點(diǎn)、查找連接兩個(gè)節(jié)點(diǎn)的所有路徑,或者遍歷可能具有不同深度的層次結(jié)構(gòu)時(shí),量化路徑模式可能非常有用。
量化路徑模式通過(guò)將路徑模式的重復(fù)部分提取到括號(hào)中并應(yīng)用量詞來(lái)解決此問(wèn)題。該量詞指定要匹配的提取模式的可能重復(fù)范圍。第一步是識(shí)別重復(fù)模式,
((:Stop)-[:NEXT]->(:Stop)){1,3}
(:Stop)-[:NEXT]->(:Stop) |
(:Stop)-[:NEXT]->(:Stop)(:Stop)-[:NEXT]->(:Stop) |
(:Stop)-[:NEXT]->(:Stop)(:Stop)-[:NEXT]->(:Stop)(:Stop)-[:NEXT]->(:Stop)
這里的聯(lián)合運(yùn)算符(|)僅用于說(shuō)明;以這種方式使用它不是Cypher語(yǔ)法的一部分。在上面的擴(kuò)展中,如果兩個(gè)節(jié)點(diǎn)模式彼此相鄰,它們必須匹配相同的節(jié)點(diǎn):服務(wù)的下一個(gè)部分從上一個(gè)部分結(jié)束的地方開(kāi)始。因此,它們可以被重寫為具有任何過(guò)濾條件組合的單節(jié)點(diǎn)模式。在本例中,這是微不足道的,因?yàn)閼?yīng)用于這些節(jié)點(diǎn)的過(guò)濾只是標(biāo)簽Stop:
MATCH (:Station { name: 'Denmark Hill' })<-[:CALLS_AT]-(d:Stop)
((:Stop)-[:NEXT]->(:Stop)){1,3}
(a:Stop)-[:CALLS_AT]->(:Station { name: 'Clapham Junction' })
RETURN d.departs AS departureTime, a.arrives AS arrivalTime
量化關(guān)系
量化關(guān)系允許以更簡(jiǎn)潔的方式重寫一些簡(jiǎn)單的量化路徑模式。
MATCH (d:Station { name: 'Denmark Hill' })<-[:CALLS_AT]-(n:Stop)
((:Stop)-[:NEXT]->(:Stop)){1,10}
(m:Stop)-[:CALLS_AT]->(a:Station { name: 'Clapham Junction' })
WHERE m.arrives < time('17:18')
RETURN n.departs AS departureTime
MATCH (d:Station { name: 'Denmark Hill' })<-[:CALLS_AT]-
(n:Stop)-[:NEXT]->{1,10}(m:Stop)-[:CALLS_AT]->
(a:Station { name: 'Clapham Junction' })
WHERE m.arrives < time('17:18')
RETURN n.departs AS departureTime
量詞{1,10}
的作用域是關(guān)系模式-[:NEXT]->
,而不是與之相鄰的節(jié)點(diǎn)模式。更一般地說(shuō),其中量化路徑模式中包含的路徑模式具有以下形式:
(() <relationship pattern> ()) <quantifier>
//可以簡(jiǎn)化為
<relationship pattern> <quantifier>
Group variables
顧名思義,這個(gè)屬性表示兩個(gè)站點(diǎn)之間的距離。為了返回連接一對(duì)station的每個(gè)服務(wù)的總距離,需要一個(gè)變量來(lái)引用所遍歷的每個(gè)關(guān)系。類似地,要提取每個(gè)Stop的出發(fā)地和到達(dá)地屬性,需要引用遍歷的每個(gè)節(jié)點(diǎn)的變量。在這個(gè)在Denmark Hill和Clapham Junction之間匹配服務(wù)的示例中,變量l和m被聲明為匹配stop, r被聲明為匹配關(guān)系。變量origin只匹配路徑中的第一個(gè)Stop:
MATCH (:Station { name: 'Denmark Hill' })<-[:CALLS_AT]-(origin)
((l)-[r:NEXT]->(m)){1,3}
()-[:CALLS_AT]->(:Station { name: 'Clapham Junction' })
在量化路徑模式中聲明的變量稱為組變量。之所以這樣稱呼它們,是因?yàn)楫?dāng)在量化路徑模式之外引用時(shí),它們是匹配中綁定到的節(jié)點(diǎn)或關(guān)系的列表。要理解如何考慮組變量綁定到節(jié)點(diǎn)或關(guān)系的方式,可以擴(kuò)展量化路徑模式,并觀察不同變量如何匹配到整體匹配路徑的元素。
(l1)-[r1:NEXT]->(m1) |
(l1)-[r1:NEXT]->(m1)(l2)-[r2:NEXT]->(m2) |
(l1)-[r1:NEXT]->(m1)(l2)-[r2:NEXT]->(m2)(l3)-[r3:NEXT]->(m3)
每個(gè)變量的下標(biāo)表示它們屬于路徑模式重復(fù)的哪個(gè)實(shí)例。
l => [n2, n3, n4]
r => [r2, r3, r4]
m => [n3, n4, n5]
最短路徑
MATCH p = shortestPath((hby)-[:LINK*]-(cnm))
WHERE hby.name = 'Hartlebury' AND cnm.name = 'Cheltenham Spa'
RETURN [n in nodes(p) | n.name] AS stops
MATCH p = shortestPath((hby)-[:LINK*]-(cnm))
WHERE all(link in relationships(p) WHERE link.distance < 20) AND
hby.name = 'Hartlebury' AND cnm.name = 'Cheltenham Spa'
RETURN [n in nodes(p) | n.name] AS stops
MATCH p = allShortestPaths((hby)-[link:LINK*]-(psh))
WHERE hby.name = 'Hartlebury' AND psh.name = 'Pershore'
RETURN [n in nodes(p) | n.name] AS stops
量化路徑模式斷言
primer
語(yǔ)法和語(yǔ)義
//節(jié)點(diǎn)模式
nodePattern ::= "(" [ nodeVariable ] [ labelExpression ]
[ propertyKeyValueExpression ] [ "WHERE" booleanExpression ] ")"
//關(guān)系模式
relationshipPattern ::= fullPattern | abbreviatedRelationship
fullPattern ::=
"<-[" patternFiller "]-"
| "-[" patternFiller "]->"
| "-[" patternFiller "]-"
abbreviatedRelationship ::= "<--" | "--" | "-->"
patternFiller ::= [ relationshipVariable ] [ typeExpression ]
[ propertyKeyValueExpression ] [ "WHERE" booleanExpression ]
//Lable 表達(dá)式
labelExpression ::= ":" labelTerm
//
labelTerm ::=
labelIdentifier
| labelTerm "&" labelTerm
| labelTerm "|" labelTerm
| "!" labelTerm
| "%"
| "(" labelTerm ")"
//
propertyKeyValueExpression ::=
"{" propertyKeyValuePairList "}"
propertyKeyValuePairList ::=
propertyKeyValuePair [ "," propertyKeyValuePair ]
propertyKeyValuePair ::= propertyName ":" valueExpression
//
pathPattern ::= [{ simplePathPattern | quantifiedPathPattern }]+
simplePathPattern ::= nodePattern
[ { relationshipPattern | quantifiedRelationship } nodePattern ]*
quantifiedPathPattern ::=
"(" fixedPath [ "WHERE" booleanExpression ] ")" quantifier
fixedPath ::= nodePattern [ relationshipPattern nodePattern ]+
quantifiedRelationship ::= relationshipPattern quantifier
Quantifiers
quantifier ::=
"*" | "+" | fixedQuantifier | generalQuantifier
fixedQuantifier ::= "{" unsignedInteger "}"
generalQuantifier ::= "{" lowerBound "," upperBound "}"
lowerBound ::= unsignedInteger
upperBound ::= unsignedInteger
unsignedInteger ::= [0-9]+
Variant | Canonical form | Description |
---|---|---|
{m,n} |
{m,n} |
Between m and n iterations. |
+ |
{1,} |
1 or more iterations. |
* |
{0,} |
0 or more iterations. |
{n} |
{n,n} |
Exactly n iterations. |
{m,} |
{m,} |
m or more iterations. |
{,n} |
{0,n} |
Between 0 and n iterations. |
{,} |
{0,} |
0 or more iterations. |
請(qǐng)注意,帶有量詞{1}
的量化路徑模式不等同于固定長(zhǎng)度的路徑模式。盡管最終的量化路徑模式將與其中包含的固定長(zhǎng)度路徑在沒(méi)有量詞的情況下匹配,但量詞的存在意味著路徑模式中的所有變量都將作為組變量公開(kāi)。
Graph patterns
graphPattern ::=
pathPattern [ "," pathPattern ]* [ "WHERE" booleanExpression ]
Node pattern pairs
編寫一對(duì)相鄰的節(jié)點(diǎn)模式是無(wú)效的語(yǔ)法。例如,以下所有操作都會(huì)引發(fā)語(yǔ)法錯(cuò)誤:
然而,相鄰的節(jié)點(diǎn)模式對(duì)的放置是有效的,它間接來(lái)自于量化路徑模式的擴(kuò)展。
量化路徑模式迭代
當(dāng)一個(gè)量化的路徑模式被展開(kāi)時(shí),包含在其括號(hào)中的固定路徑模式被重復(fù)和鏈接。這導(dǎo)致成對(duì)的節(jié)點(diǎn)模式彼此相鄰。
((x:X)<--(y:Y)){3}
通過(guò)重復(fù)三次固定路徑模式(x: x)←-(y: y)
來(lái)擴(kuò)展它,并在變量上添加索引以表明沒(méi)有隱含的等量連接
(x1:X)<--(y1:Y)(x2:X)<--(y2:Y)(x3:X)<--(y3:Y)
結(jié)果是兩對(duì)節(jié)點(diǎn)模式最終彼此相鄰,(y1:Y)(x2:X)
和(y2:Y)(x3:X)
。在匹配過(guò)程中,每對(duì)節(jié)點(diǎn)模式將匹配相同的節(jié)點(diǎn),這些節(jié)點(diǎn)將滿足節(jié)點(diǎn)模式中謂詞的連接。例如,在第一對(duì)中,y1和x2將綁定到同一個(gè)節(jié)點(diǎn),并且該節(jié)點(diǎn)必須具有X和y的標(biāo)簽。這種擴(kuò)展和綁定如下圖所示:
簡(jiǎn)單路徑模式和量化路徑模式
量化路徑模式對(duì)
當(dāng)兩個(gè)量化路徑模式相鄰時(shí),第一模式的最后一次迭代的最右節(jié)點(diǎn)與第二模式的第一次迭代的最左節(jié)點(diǎn)合并。例如,以下相鄰的模式:
((:A)-[:R]->(:B)){2} ((:X)<--(:Y)){1,2}
將匹配與以下兩個(gè)路徑模式匹配的路徑的并集相同的路徑集:
(:A)-[:R]->(:B&A)-[:R]->(:B&X)<--(:Y)
(:A)-[:R]->(:B&A)-[:R]->(:B&X)<--(:Y&X)<--(:Y)
零迭代
如果量詞允許模式的零次迭代,例如{0,3},那么該模式的第0次迭代將導(dǎo)致兩邊的節(jié)點(diǎn)模式配對(duì)。
(:X) ((a:A)-[:R]->(b:B)){0,1} (:Y)
//匹配
(:X&Y) // 節(jié)點(diǎn)具有X,Y標(biāo)簽
(:X&A)-[:R]->(:B&Y)
變長(zhǎng)關(guān)系
在Neo4j 5.9中引入量化路徑模式和量化關(guān)系的語(yǔ)法之前,Cypher中匹配可變長(zhǎng)度路徑的唯一方法是使用可變長(zhǎng)度關(guān)系。這個(gè)語(yǔ)法仍然可用。
Variant | Description |
---|---|
* |
1 or more iterations. |
*n |
Exactly n iterations. |
*m..n |
Between m and n iterations. |
*m.. |
m or more iterations. |
*..n |
Between 1 and n iterations. |
Variable-length relationship | Equivalent quantified path pattern |
---|---|
(a)-[*2]->(b) |
(a) (()-[]->()){2,2} (b) |
(a)-[:KNOWS*3..5]->(b) |
(a) (()-[:KNOWS]->()){3,5} (b) |
(a)-[r*..5 {name: 'Filipa'}]->(b) |
(a) (()-[r {name: 'Filipa'}]->()){1,5} (b) |
可變長(zhǎng)度關(guān)系的變量可以在后續(xù)模式中使用,以引用該變量綁定到的關(guān)系列表。這與綁定到單個(gè)節(jié)點(diǎn)或關(guān)系的變量的等量連接相同。
值和類型
Cypher支持一系列數(shù)據(jù)值。在編寫Cypher查詢時(shí),不可能聲明數(shù)據(jù)類型。相反,Cypher將自動(dòng)推斷給定值的數(shù)據(jù)類型。
Property types
屬性類型:BOOLEAN、DATE、DURATION、FLOAT、INTEGER、LIST、LOCAL DATETIME、LOCAL TIME、POINT、STRING、ZONED DATETIME和ZONED TIME。
-
屬性類型可以從Cypher查詢返回。
-
屬性類型可以用作參數(shù)。
-
屬性類型可以存儲(chǔ)為屬性。
-
屬性類型可以用Cypher字面值構(gòu)造。
簡(jiǎn)單類型的同構(gòu)列表可以存儲(chǔ)為屬性,但一般列表(請(qǐng)參閱構(gòu)造類型)不能存儲(chǔ)為屬性。作為屬性存儲(chǔ)的列表不能包含空值。
Cypher還提供了對(duì)字節(jié)數(shù)組的傳遞支持,字節(jié)數(shù)組可以作為屬性值存儲(chǔ)。由于性能原因,支持字節(jié)數(shù)組,因?yàn)槭褂肅ypher的泛型LIST(其中每個(gè)INTEGER都有64位表示)的成本太高。但是,字節(jié)數(shù)組不被Cypher視為第一類數(shù)據(jù)類型,因此它們沒(méi)有文字表示。
結(jié)構(gòu)類型
結(jié)構(gòu)類型:NODE、RELATIONSHIP和PATH。
-
結(jié)構(gòu)類型可以從Cypher查詢返回。
-
結(jié)構(gòu)類型不能用作參數(shù)。
-
結(jié)構(gòu)類型不能存儲(chǔ)為屬性。
-
結(jié)構(gòu)類型不能用Cypher字面值構(gòu)造。
NODE數(shù)據(jù)類型包括:id、label(s)和屬性映射。注意標(biāo)簽不是值,而是模式語(yǔ)法的一種形式。
RELATIONSHIP數(shù)據(jù)類型包括:id、關(guān)系類型、屬性映射、開(kāi)始節(jié)點(diǎn)id和結(jié)束節(jié)點(diǎn)id。
PATH數(shù)據(jù)類型是節(jié)點(diǎn)和關(guān)系的交替序列。
構(gòu)造類型
構(gòu)造類型中:LIST和MAP。
-
可以從Cypher查詢返回構(gòu)造類型。
-
構(gòu)造類型可以用作參數(shù)。
-
構(gòu)造的類型不能存儲(chǔ)為屬性(同構(gòu)列表除外)。
-
構(gòu)造類型可以用Cypher字面值構(gòu)造。
LIST數(shù)據(jù)類型可以是簡(jiǎn)單值的同構(gòu)集合,也可以是異構(gòu)的有序值集合,每個(gè)值都可以具有任何屬性、結(jié)構(gòu)類型或構(gòu)造類型。
MAP數(shù)據(jù)類型是(鍵、值)對(duì)的異構(gòu)、無(wú)序集合,其中鍵是文字,而值可以具有任何屬性、結(jié)構(gòu)類型或構(gòu)造類型。
構(gòu)造類型值也可以包含null。
類型同義詞
Type | Synonyms |
---|---|
ANY |
ANY VALUE |
BOOLEAN |
BOOL |
DATE |
|
DURATION |
|
FLOAT |
|
INTEGER |
INT , SIGNED INTEGER
|
LIST<INNER_TYPE> |
ARRAY<INNER_TYPE> , INNER_TYPE LIST , INNER_TYPE ARRAY
|
LOCAL DATETIME |
TIMESTAMP WITHOUT TIMEZONE |
LOCAL TIME |
TIME WITHOUT TIMEZONE |
MAP |
|
NODE |
ANY NODE , VERTEX , ANY VERTEX
|
NOTHING |
|
NULL |
|
PATH |
|
POINT |
|
PROPERTY VALUE |
ANY PROPERTY VALUE |
RELATIONSHIP |
ANY RELATIONSHIP , EDGE , ANY EDGE
|
STRING |
VARCHAR |
ZONED DATETIME |
TIMESTAMP WITH TIMEZONE |
ZONED TIME |
TIME WITH TIMEZONE |
所有Cypher類型都包含空值。要使它們不可為空,可以將not NULL
附加到類型的末尾(例如BOOLEAN not NULL
, LIST<FLOAT not NULL>
)。
屬性類型明細(xì)
Type | Min. value | Max. value | Precision |
---|---|---|---|
BOOLEAN |
False |
True |
- |
DATE |
-999_999_999-01-01 |
+999_999_999-12-31 |
Days |
DURATION |
P-292471208677Y-6M-15DT-15H-36M-32S |
P292471208677Y6M15DT15H36M32.999999999S |
Nanoseconds |
FLOAT |
Double.MIN_VALUE [1] |
Double.MAX_VALUE |
64 bit |
INTEGER |
Long.MIN_VALUE |
Long.MAX_VALUE |
64 bit |
LOCAL DATETIME |
-999_999_999-01-01T00:00:00 |
+999_999_999-12-31T23:59:59.999999999 |
Nanoseconds |
LOCAL TIME |
00:00:00 |
23:59:59.999999999 |
Nanoseconds |
POINT |
Cartesian: (-Double.MAX_VALUE , -Double.MAX_VALUE )Cartesian_3D: (-Double.MAX_VALUE , -Double.MAX_VALUE , -Double.MAX_VALUE )WGS_84: (-180 , -90 )WGS_84_3D: (-180 , -90 , -Double.MAX_VALUE ) |
Cartesian: (Double.MAX_VALUE , Double.MAX_VALUE )Cartesian_3D: (Double.MAX_VALUE , Double.MAX_VALUE , Double.MAX_VALUE )WGS_84: (180 , 90 )WGS_84_3D: (180 , 90 , Double.MAX_VALUE ) |
The precision of each coordinate of the POINT is 64 bit as they are floats. |
STRING |
- | - | - |
ZONED DATETIME |
-999_999_999-01-01T00:00:00+18:00 |
+999_999_999-12-31T23:59:59.999999999-18:00 |
Nanoseconds |
ZONED TIME |
00:00:00+18:00 |
23:59:59.999999999-18:00 |
Nanoseconds |
時(shí)間類型
Type | Date support | Time support | Time zone support |
---|---|---|---|
DATE |
√ | ||
LOCAL TIME |
√ | ||
ZONED TIME |
√ | √ | |
LOCAL DATETIME |
√ | √ | |
ZONED DATETIME |
√ | √ | √ |
DURATION |
- |
- |
- |
相比之下,DURATION不是即時(shí)類型。DURATION表示時(shí)間量,捕獲兩個(gè)瞬間之間的時(shí)間差,并且可以為負(fù)值。
新的版本,類型名字有所改變
Type | Old type name |
---|---|
DATE |
Date |
LOCAL TIME |
LocalTime |
ZONED TIME |
Time |
LOCAL DATETIME |
LocalDateTime |
ZONED DATETIME |
DateTime |
DURATION |
Duration |
空間類型
null操作
邏輯操作
邏輯運(yùn)算符(AND、OR、XOR、NOT)將null作為三值邏輯的未知值。
a | b | a AND b |
a OR b |
a XOR b |
NOT a |
---|---|---|---|---|---|
false |
false |
false |
false |
false |
true |
false |
null |
false |
null |
null |
true |
false |
true |
false |
true |
true |
true |
true |
false |
false |
true |
true |
false |
true |
null |
null |
true |
null |
false |
true |
true |
true |
true |
false |
false |
null |
false |
false |
null |
null |
null |
null |
null |
null |
null |
null |
null |
null |
true |
null |
true |
null |
null |
總結(jié):
-
AND
:只要有一個(gè)為false,則為false。 -
OR
:只要有一個(gè)為true,則為true。
IN
IN操作符遵循類似的邏輯。如果Cypher可以確定列表中存在某物,則結(jié)果將為真。任何包含null
且沒(méi)有匹配元素的列表都將返回null。否則,結(jié)果將為false。
Expression | Result |
---|---|
2 IN [1, 2, 3] |
true |
2 IN [1, null, 3] |
null |
2 IN [1, 2, null] |
true |
2 IN [1] |
false |
2 IN [] |
false |
null IN [1, 2, 3] |
null |
null IN [1, null, 3] |
null |
null IN [] |
false |
使用all、any、none和single遵循類似的規(guī)則。如果結(jié)果可以確定地計(jì)算出來(lái),則返回true或false。否則將產(chǎn)生null。
[ ]
訪問(wèn)帶有null的list或map將返回null
返回null的表達(dá)式
-
從列表中獲取缺失的元素:
[][0]
,head([])
。 -
試圖訪問(wèn)節(jié)點(diǎn)或關(guān)系上不存在的屬性:
n.missingProperty
。 -
當(dāng)任何一方為空時(shí)的比較:1 < null。
-
包含null的算術(shù)表達(dá)式:1 + null。
-
某些函數(shù)調(diào)用的任何參數(shù)都為空:例如,sin(null)。
LIST
RETURN [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] AS list
RETURN range(0, 10)[3] AS element //range創(chuàng)建LIST
RETURN range(0, 10)[-3] AS element //下標(biāo)支持負(fù)數(shù)
RETURN range(0, 10)[0..3] AS list //切片
RETURN range(0, 10)[0..-5] AS list //
RETURN range(0, 10)[-5..] AS list //
RETURN range(0, 10)[..4] AS list //
RETURN range(0, 10)[15] AS list //超過(guò)索引的單個(gè)元素返回null。
RETURN range(0, 10)[5..15] AS list //超過(guò)索引的LIST 元素截?cái)唷?
MAP
RETURN {key: 'Value', listKey: [{inner: 'Map1'}, {inner: 'Map2'}]}
Map 投影
Cypher支持Map投影,它允許從節(jié)點(diǎn)、關(guān)系和其他Map值構(gòu)造Map投影。
Map投影以綁定到要進(jìn)行投影的圖形實(shí)體的變量開(kāi)始,并包含一組逗號(hào)分隔的映射元素,由{
和}
括起來(lái)。
map_variable {map_element, [, ...n]}
MAP投影將一個(gè)或多個(gè)鍵值對(duì)投影到MAP投影。有四種不同類型的MAP投影元素:
-
屬性選擇器:將屬性名稱作為鍵進(jìn)行投影,并將map_variable中的值作為投影的值。
-
字面量實(shí)體 :這是一個(gè)鍵值對(duì),值是一個(gè)任意的表達(dá)式鍵:
<expression>
。 -
變量選擇器:投影一個(gè)變量,變量名作為鍵,變量指向的值作為投影的值。它的語(yǔ)法就是變量。
-
所有屬性選擇器:從map_variable值投射所有鍵值對(duì)。
-
如果map_variable指向null,則整個(gè)MAP投影的值將為null。
-
映射中的鍵名必須是
STRING
類型。
MATCH (keanu:Person {name: 'Keanu Reeves'})-[:ACTED_IN]->(movie:Movie)
WITH keanu, collect(movie{.title, .released}) AS movies
RETURN keanu{.name, movies: movies} // name屬性作為一個(gè)元素,movies字面量,作為KEY, movies變量作為VALUE,是個(gè)LIST
keanu |
---|
{movies: [{title: "The Devils Advocate", released: 1997}, {title: "The Matrix Revolutions", released: 2003}, {title: "The Matrix Resurrections", released: 2021}, {title: "The Matrix Reloaded", released: 2003}, {title: "The Matrix", released: 1999}], name: "Keanu Reeves"} |
Rows: 1 |
類型轉(zhuǎn)換
參考 Functions
附錄
參考
https://neo4j.com/docs/cypher-manual/current/patterns/
https://neo4j.com/docs/cypher-manual/current/values-and-types/文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-634236.html
https://neo4j.com/docs/cypher-manual/current/functions/文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-634236.html
到了這里,關(guān)于neo4j查詢語(yǔ)言Cypher詳解(二)--Pattern和類型的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!