目錄
1.2、any() 判斷是否一個斷言至少適用於列表中的一個元素
2.5、coalesce() 返回表達式列表中的第一個非空的值
在cypher中使用,如count()
MATCH (n)
return count(n)
分類:
- 斷言函數
- 標量函數
- 列表函數
- 數學函數
- 字符串函數
一、斷言(Predicate)函數
斷言函數是對給定的輸入返回true或者false的布爾函數。它們主要用於查詢的WHERE部分過濾子圖。
1.1、all() 判斷是否一個斷言適用於列表中的所有元素
語法: all(variable IN list WHERE predicate)
參數:
- list:返回列表的表達式
- variable:用於斷言中的變量
- predicate:用於測試列表中所有元素的斷言
示例:
MATCH p =(a)-[*1..3]->(b) WHERE ALL (x IN nodes(p) WHERE x.age > 30) RETURN p |
返回路徑中的所有節點都有一個至少大於30的age屬性。
1.2、any() 判斷是否一個斷言至少適用於列表中的一個元素
語法: any(variable IN list WHERE predicate)
參數:
- list:返回列表的表達式
- variable:用於斷言中的變量
- predicate:用於測試列表中所有元素的斷言
MATCH (a) where ANY (x IN a.array WHERE x = 'one') RETURN a |
返回路徑中的所有節點的array數組屬性中至少有一個值爲'one'。
1.3、none()
如果斷言不適用於列表中的任何元素,則返回true。
語法: none(variable IN list WHERE predicate)
參數:
- list:返回列表的表達式
- variable:用於斷言中的變量
- predicate:用於測試列表中所有元素的斷言
MATCH p =(n)-[*1..3]->(b) WHERE n.name = 'Alice' AND NONE (x IN nodes(p) WHERE x.age = 25) RETURN p |
返回的路徑中沒有節點的age屬性值爲25。
1.4、single()
如果斷言剛好只適用於列表中的某一個元素,則返回true。
語法: single(variable IN list WHERE predicate)
參數:
- list:返回列表的表達式
- variable:用於斷言中的變量
- predicate:用於測試列表中所有元素的斷言
MATCH p =(n)-->(b) WHERE n.name = 'Alice' AND SINGLE (var IN nodes(p) WHERE var.eyes = 'blue') RETURN p |
每條返回的路徑中剛好只有一個節點的eyes屬性值爲'blue'。
1.5、exists() 可能經常使用
如果數據庫中存在該模式或者節點中存在該屬性時,則返回true。
語法: exists( pattern-or-property )
參數: pattern-or-property:模式或者屬性(以’variable.prop’的形式)
MATCH (n) WHERE exists(n.name) RETURN n.name AS name, exists((n)-[:MARRIED]->()) AS is_married |
本查詢返回了所有節點的name屬性和一個指示是否已婚的true/false值。
二、標量(Scalar)函數
標量函數返回一個單值。
2.1、size()
使用size()返回表中元素的個數。
語法: size( list )
參數:
- list:返回列表的表達式
RETURN size(['Alice', 'Bob']) AS col |
本查詢返回了列表中元素的個數。
模式表達式的size
這裏的size()的參數不是一個列表,而是一個模式表達式匹配到的查詢結果集。
計算的是結果集元素的個數,而不是表達式本身的長度。
語法: size( pattern expression )
參數:
- pattern expression:返回列表的模式表達式
MATCH (a) WHERE a.name = 'Alice' RETURN size((a)-->()-->()) AS fof |
本查詢返回了模式表達式匹配到的子圖的個數。
2.2、length()
1、使用length()函數返回路徑的長度。
語法: length( path )
參數:
- path:返回路徑的表達式
MATCH p =(a)-->(b)-->(c) WHERE a.name = 'Alice' RETURN length(p) |
本查詢返回路徑p的長度。
2、字符串的長度
語法: length( string )
參數:
- string:返回字符串的表達式
RETURN length('qwer')
MATCH (a) WHERE length(a.name)> 6 RETURN length(a.name) |
查詢返回了name爲’Charlie’的長度。
2.3、type() 返回字符串代表的關係類型。
語法: type( relationship )
參數:
- relationship:一個關係
MATCH (n)-[r]->() WHERE n.name = 'Alice' RETURN type(r)
|
查詢返回了關係r的關係類型。
2.4、id()
返回關係或者節點的id。
語法: id( property-container )
參數:
- property-container:一個節點或者關係
MATCH (a) RETURN id(a) |
返回了節點的id。
2.5、coalesce() 返回表達式列表中的第一個非空的值
返回表達式列表中的第一個非空的值。如果所有的實參都爲空 ,則返回null。
語法: coalesce( expression [, expression]* )
參數:
- expression:表達式,可能返回null。
MATCH (a) WHERE a.name = 'Alice' RETURN coalesce(a.hairColor, a.eyes) |
2.6、head()
head()返回列表中的第一個元素。
語法: head( expression )
參數:
- expression:返回列表的表達式
MATCH (a) WHERE a.name = 'Eskil' RETURN a.array, head(a.array)
MATCH p=(n)-[r]->() WHERE n.name = 'Alice' return head(nodes(p))
|
返回了路徑中的第一個節點。
2.7、last()
last()返回列表中的最後一個元素。
語法: last( expression )
參數:
- expression:返回列表的表達式
MATCH (a) WHERE a.name = 'Eskil' RETURN a.array, last(a.array) |
返回了路徑中的最後一個節點。
2.8、timestamp()
timestamp()返回當前時間與1970年1月1日午夜之間的差值,單位以毫秒計算。它在整個查詢中始終返回同一個值,即使是在一個運行時間很長的查詢中。
語法: timestamp()
參數: 無
RETURN timestamp() |
以毫秒返回當前時間。
2.9、startNode()
startNode()返回一個關係的開始節點。
語法: startNode( relationship )
參數:
- relationship:返回關係的表達式
MATCH ()-[r]-() WHERE id(r)=1199 RETURN startNode(r) |
2.10、endNode()
endNode()返回一個關係的結束節點。
語法: endNode( relationship )
參數:
- relationship:返回關係的表達式
MATCH ()-[r]-() WHERE id(r)=1199 RETURN startNode(r),endNode(r) |
2.11、properties()
properties()將實參轉爲屬性值的map。如果實參是一個節點或者關係,返回的就是節點或關係的屬性的map。如果實參已經是一個map了,那麼原樣返回結果。
語法: properties( expression )
參數:
- expression:返回節點,關係或者map的表達式
match (n) where id(n) =0 RETURN properties(n) |
2.12、toInt()
toInt()將實參轉換爲一個整數。字符串會被解析爲一個整數。如果解析失敗,將返回null。浮點數將被強制轉換爲整數。
語法: toInt( expression )
參數:
- expression:返回任意值的表達式
RETURN toInt('42'), toInt('not a number') |
2.13、toFloat()
toFloat()將實參轉換爲浮點數。字符串會被解析爲一個浮點數。如果解析失敗,將返回null。整數將被強制轉換爲浮點數。
語法: toFloat( expression )
參數:
- expression:返回任意值的表達式
RETURN toFloat('11.5'), toFloat('not a number') |
三、列表(List)函數
列表函數返回列表中的元素,如路徑中的節點等等。
3.1、nodes() 作用path
返回一條路徑中的所有節點。
語法: nodes( path )
參數:
- path:一條路徑
查詢返回了路徑p中的所有節點。
MATCH p =(a)-->(b)-->(c) WHERE a.name = 'Alice' AND c.name = 'Eskil' RETURN nodes(p) |
3.2、relationships() 作用path
返回一條路徑中的所有關係。
語法: relationships( path )
參數:
- path:一條路徑
MATCH p =(a)-->(b)-->(c) WHERE a.name = 'Alice' AND c.name = 'Eskil' RETURN relationships(p) |
查詢返回了路徑p中的所有節點關係。
3.2、labels() 參數爲node
以字符串列表的形式返回一個節點的所有標籤。
語法: labels( node )
參數:
- node:返回單個節點的任意表達式
MATCH (a) WHERE a.name = 'Alice' RETURN labels(a) |
查詢返回了節點n的所有標籤。
3.3、keys() 可以爲節點 和關係
以字符串列表的形式返回一個節點,關係或者map的所有屬性的名稱。
語法: keys( property-container )
參數:
- property-container:一個節點,關係或者字面值的map
MATCH (a) WHERE a.name = 'Alice' RETURN keys(a) |
查詢返回了節點a的屬性名。
3.4、extract()
可以使用extract()從節點或關係列表中返回單個屬性或者某個函數的值。它將遍歷整個列表,針對列表中的每個元素運行一個表達式,然後以列表的形式返回這些結果。它的工作方式類似與Lisp和Scala等函數式語言中的map方法。
語法: extract( variable IN list | expression )
參數:
- list:返回列表的表達式
- variable:引用list中元素的變量,它在expression中會用到
- expression:針對列表中每個元素所運行的表達式,併產生一個結果列表。
MATCH p =(a)-->(b)-->(c) WHERE a.name = 'Alice' AND b.name = 'Bob' AND c.name = 'Daniel' RETURN extract(n IN nodes(p)| n.age) AS extracted |
返回了路徑中所有節點的age屬性。
3.5、filter()
filter()返回列表中滿足斷言要求的所有元素。
語法: filter(variable IN list WHERE predicate)
參數:
- list:返回列表的表達式
- variable:斷言中引用列表元素所用到的變量
- predicate:針對列表中每個元素進行測試的斷言
MATCH (a) WHERE a.name = 'Eskil' RETURN a.array, filter(x IN a.array WHERE size(x)= 3) |
返回array屬性,及其元素的字符數爲3的元素列表。
3.6、tail()
tail()返回列表中除了首元素之外的所有元素。
語法: tail( expression )
參數:
- expression:返回某個類型列表的表達式
MATCH (a) WHERE a.name = 'Eskil' RETURN a.array, tail(a.array) |
返回了array屬性及屬性中除了第一個之外的所有元素。
3.7、range()
range()返回一個範圍內的數字。值之間的默認步長爲1。範圍包含起始邊界值。
語法: range( start, end [, step] )
參數:
- start:起點數值的表達式
- end:結束數值的表達式
- step:數值間隔的步長
RETURN range(0, 10), range(2, 18, 3) |
第一個返回了0到10之間步長爲1的所有值。第二個返回了從2到18之間步長爲3的所有值。
3.8、reduce()
可以用reduce()對列表中的每個元素執行一個表達式 ,將表達式結果存入一個累加器。它的工作機制類似Lisp和Scala等函數式語言中的fold或者reduce方法。
語法: reduce( accumulator = initial, variable IN list | expression )
參數:
- accmulator:用於累加每次迭代的部分結果
- initial:累加器的初始值
- list:列表
- variable:引用列表中的每個元素的變量
- expression:針對列表中每個元素執行的表達式
MATCH p =(a)-->(b)-->(c) WHERE a.name = 'Alice' AND b.name = 'Bob' AND c.name = 'Daniel' RETURN reduce(totalAge = 0, n IN nodes(p)| totalAge + n.age) AS reduction |
本查詢將路徑中每個節點的age數值加起來,然後返回一個單值。
四、字符串函數
下面的函數都是隻針對字符串表達式。如果用於其他值 ,將返回錯誤。有個例外就是toString(),它還接受數字值和布爾值。
4.1、replace()
replace()返回被替換字符串替換後的字符串。它會替換所有出現過的字符串。
語法: replace( original, search, replace )
參數:
- original:原字符串
- search:期望被替換的字符串
- replace:用於替換的字符串
RETURN replace("hello", "l", "w") |
4.2、substring()
substring()返回原字符串的子串。它帶有一個 0爲開始的索引值和長度作爲參數。如果長度省略了,那麼它返回從索引開始到結束的子字符串。
語法: substring( original, start [, length] )
參數:
- original:原字符串
- start:子串的開始位置
- length:子串的長度
RETURN substring('hello', 1, 3), substring('hello', 2) |
4.3、left()
left()返回原字符串左邊指定長度的子串。
語法: left( original, length )
參數:
- original:原字符串
- length:左邊子字符串的長度
RETURN left('hello', 3) |
4.4、right()
right()返回原字符串右邊的指定長度的子字符串。
語法: right( original, length )
參數:
- original:原字符串
- length:右邊子字符串的長度
RETURN right('hello', 3) |
4.4、ltrim()
ltrim()返回原字符串移除左側的空白字符後的字符串。
語法: ltrim( original )
參數:
- original:原字符串
RETURN ltrim(' hello') |
4.5、rtrim()
rtrim()返回原字符串移除右側空白字符後的字符串。
語法: rtrim( original )
參數:
- original:原字符串
RETURN rtrim('hello ') |
4.5、trim()
trim()返回原字符串移除兩側的空白字符之後的字符串。
語法: trim( original )
參數:
- original:原字符串
RETURN trim(' hello ') |
4.6、lower()
lower()以小寫的形式返回原字符串。
語法: lower( original )
參數:
- original:原字符串
RETURN lower('HELLO') |
4.7、upper()
uppper()以大寫的形式返回原字符串。
語法: upper( original )
參數:
- original:原字符串
RETURN upper('hello') |
4.8、split()
split()返回以指定模式分隔後的字符串序列。
語法: split( original, splitPattern )
參數:
- original:原字符串
- splitPattern:分割字符串
RETURN split('one,two', ',') |
4.9、reverse()
reverse()返回原字符串的倒序字符串。
語法: reverse( original )
參數:
- original:原字符串
RETURN reverse('anagram') |
4.10、toString()
toString()將實參轉換爲字符串。它將整型、浮點型和布爾型轉換爲字符串。如果實參爲字符串,則按原樣返回。
語法: toString( expression )
參數:
- expression:返回數值,布爾或者字符串的表達式
RETURN toString(11.5), toString('already a string'), toString(TRUE ) |
五、數學函數
這些函數僅適用於數值表達式。如果用於其他類型的值,將返回錯誤。
5.1、數值函數
abs()
abs()函數返回數值的絕對值。
語法: abs( expression )
參數:
- expression:數值表達式
MATCH (a),(e) WHERE a.name = 'Alice' AND e.name = 'Eskil' RETURN a.age, e.age, abs(a.age - e.age) |
返回兩個年齡差值的絕對值。
ceil()
ceil()返回大於或等於實參的最小整數。
語法: ceil( expression )
參數:
- expression:數值表達式
RETURN ceil(0.1) |
返回大於0.1的最小整數,即爲1。
floor()
floor()返回小於等於表達式的最大的整數。
語法: floor( expression )
參數:
- expression:數值表達式
RETURN floor(0.9)
小於等於0.9的最大的整數爲0。
round()
round()返回距離表達式值最近的整數。
語法: round( expression )
參數:
- expression:數值表達式
RETURN round(3.141592) |
距離3.141592最近的整數爲3。
sign()
sign()返回一個數值的正負。如果值爲零,則返回0。如果值爲負數,則返回-1。如果值爲正數,返回1。
語法: sign( expression )
參數:
- expression:數值表達
RETURN sign(-17), sign(0.1) |
返回了-17和0.1的正負符號。
rand()
rand()返回[0, 1)之間的一個隨機數。返回的數值在整個區間遵循均勻分佈。
語法: rand()
參數: 無
RETURN rand() |
返回了一個隨機數。
5.2、對數函數
log()
log()返回表達式的自然對數。
語法: log( expression )
參數:
- expression:數值表達式
RETURN log(27)
返回了27的自然對數的值。
log10()
log10()返回表達式的常用對數(以10爲底)。
語法: log10( expression )
參數:
- expression:數值表達式
RETURN log10(27) |
返回了27的常用對數。
exp()
exp()返回e^n,這裏e是自然對數的底,n是表達式的實參值。
語法: e( expression )
參數:
- expression:數值表達式
RETURN exp(2) |
返回了e的二次方。
e()
e()返回自然對數的底,即e。
語法: e()
參數: 無
RETURN e() |
返回了自然對數的底e的值。
sqrt()
sqrt()返回數值的平方根。
語法: sqrt( expression )
參數:
- expression:數值表達式
RETURN sqrt(256) |
返回了256的平方根,即16.
5.3三角函數
除非特別指明,所有的三角函數都是針對弧度值進行計算的。
sin()
sin()返回表達式的正弦函數值。
語法: sin( expression )
參數:
- expression:一個表示角的弧度的數值表達式
RETURN sin(0.5) |
返回弧度爲0.5的正弦值。
cos()
cos()返回表達式的餘弦函數值。
語法: cos( expression )
參數:
- expression:一個表示角弧度的數值表達式
RETURN cos(0.5) |
返回了弧度爲0.5的餘弦。
tan()
tan()返回表達式的正切值。
語法: tan( expression )
參數:
- expression:一個表示角弧度的數值表達式
RETURN tan(0.5) |
cot()
cot()返回表達式的餘切值。
語法: cot( expression )
參數:
- expression:一個表示角弧度的數值表達式
RETURN cot(0.5) |
返回了弧度爲0.5的餘切。
asin()
asin()返回表達式的反正弦值。
語法: asin( expression )
參數:
- expression:一個表示角弧度的數值表達式
RETURN asin(0.5) |
返回了弧度爲0.5的反正弦。
acos()
acos()返回表達式的反餘弦值。
語法: acos( expression )
參數:
- expression:一個表示角弧度的數值表達式
RETURN acos(0.5) |
返回了弧度爲0.5的反餘弦。
atan()
atan()返回表達式的反正切值。
語法: atan( expression )
參數:
- expression:一個表示角弧度的數值表達式
RETURN atan(0.5) |
返回弧度0.5的反正切。
atan2()
atan2()返回方位角,也可以理解爲計算複數 x+yi 的幅角。
語法: atan2( expression1, expression2 )
參數:
- expression1:表示複數x部分的數值表達式
- expression2:表示複數y部分的數值表達式
RETURN atan2(0.5, 0.6) |
返回了0.5和0.6的方位角。
pi()
pi()返回常數pi的數值。
語法: pi()
參數: 無
RETURN pi() |
返回常數pi的值。
degrees()
degrees()將弧度轉爲度。
語法: degrees( expression )
參數:
- expression:一個表示角弧度的數值表達式
RETURN degrees(3.14159) |
返回接近於pi的度數。
radians()
radians()將度轉爲弧度。
語法: radians( expression )
參數:
- expression:一個表示角度數的數值表達式
RETURN radians(180) |
返回了180度的弧度值(pi)。
haversin()
haversin()返回表達式的半正矢。
語法: haversin( expression )
參數:
- expression:一個表示角弧度的數值表達式
RETURN haversin(0.5) |
返回了弧度爲0.5的半正矢。
使用haversin函數計算球面距離
haversin()函數可用於計算球面上兩點(以經緯度的方式給出)之間的距離。在本例計算了德國柏林(lat 52.5,lon 13.4)和美國加州聖馬特奧市(lat 375,lon -122.3)兩點之間的球面距離(以km計),計算時採用的是地球的平均半徑6371km。
CREATE (ber:City { lat: 52.5, lon: 13.4 }),(sm:City { lat: 37.5, lon: -122.3 }) RETURN 2 * 6371 * asin(sqrt(haversin(radians(sm.lat - ber.lat))+ cos(radians(sm.lat))*cos(radians(ber.lat))* haversin(radians(sm.lon - ber.lon)))) AS dist |
返回了柏林和聖馬特奧之間的估算距離。
六、自定義函數
自定義函數用Java語言寫,可部署到數據庫中,調用方式與其他Cypher函數一樣。
下面的例子展示瞭如何調用一個名爲join的自定義函數。
調用自定義函數
調用自定義函數org.neo4j.procedure.example.join()。
MATCH (n:Member) RETURN org.neo4j.function.example.join(collect(n.name)) |
編寫自定義函數
自定義函數的編寫類似於過程(procedure)的創建,但它採用@UserFunction註解,並且只返回一個單值。有效的輸出類型包括long,Long, double,Double,boolean,Boolean,String,Node,Relationship,Path,Map<String, Object>或者List<T>,這裏的T可以是任意支持的類型。
下面是一個簡單的自定義函數例子,該函數將List中的字符串用指定的分隔符連接起來
package example; import org.neo4j.procedure.Name; import org.neo4j.procedure.Procedure; import org.neo4j.procedure.UserFunction; public class Join { @UserFunction @Description("example.join(['s1','s2',...], delimiter) - join the given strings with the given delimiter.") public String join( @Name("strings") List<String> strings, @Name(value = "delimiter", defaultValue = ",") String delimiter) { if (strings == null || delimiter == null) { return null; } return String.join(delimiter, strings); } } |
學習文檔出自:龐國明 老師教學視頻