neo4j學習總結--第六課 Cypher函數 (方法)

目錄

一、斷言(Predicate)函數

1.1、all() 判斷是否一個斷言適用於列表中的所有元素

1.2、any()  判斷是否一個斷言至少適用於列表中的一個元素

1.3、none()

1.4、single()

1.5、exists() 可能經常使用

二、標量(Scalar)函數

2.1、size()

2.2、length()

2.3、type() 返回字符串代表的關係類型。

2.4、id()

2.5、coalesce() 返回表達式列表中的第一個非空的值

2.6、head()

2.7、last()

2.8、timestamp()

2.9、startNode()

2.10、endNode()

2.11、properties()

2.12、toInt()

2.13、toFloat()

三、列表(List)函數

3.1、nodes() 作用path

3.2、relationships() 作用path

3.2、labels() 參數爲node

3.3、keys() 可以爲節點 和關係

3.4、extract()

3.5、filter()

3.6、tail()

3.7、range()

3.8、reduce()

四、字符串函數

4.1、replace()

4.2、substring()

4.3、left()

4.4、right()

4.4、ltrim()

4.5、rtrim()

4.5、trim()

4.6、lower()

4.7、upper()

4.8、split()

4.9、reverse()

4.10、toString()

五、數學函數

5.1、數值函數

5.2、對數函數

5.3三角函數


在cypher中使用,如count()

MATCH (n)

return count(n)

分類:

  1. 斷言函數
  2. 標量函數
  3. 列表函數
  4. 數學函數
  5. 字符串函數

一、斷言(Predicate)函數

斷言函數是對給定的輸入返回true或者false的布爾函數。它們主要用於查詢的WHERE部分過濾子圖。

1.1、all() 判斷是否一個斷言適用於列表中的所有元素

語法: all(variable IN list WHERE predicate)

參數:

  1. list:返回列表的表達式
  2. variable:用於斷言中的變量
  3. 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)

參數:

  1. list:返回列表的表達式
  2. variable:用於斷言中的變量
  3. 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)

參數:

  1. list:返回列表的表達式
  2. variable:用於斷言中的變量
  3. 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)

參數:

  1. list:返回列表的表達式
  2. variable:用於斷言中的變量
  3. 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 )

參數:

  1. list:返回列表的表達式

RETURN size(['Alice', 'Bob']) AS col

本查詢返回了列表中元素的個數。

模式表達式的size

這裏的size()的參數不是一個列表,而是一個模式表達式匹配到的查詢結果集。

計算的是結果集元素的個數,而不是表達式本身的長度。

語法: size( pattern expression )

參數:

  1. pattern expression:返回列表的模式表達式

MATCH (a)

WHERE a.name = 'Alice'

RETURN size((a)-->()-->()) AS fof

本查詢返回了模式表達式匹配到的子圖的個數。

2.2、length()

1、使用length()函數返回路徑的長度。

語法: length( path )

參數:

  1. path:返回路徑的表達式

MATCH p =(a)-->(b)-->(c)

WHERE a.name = 'Alice'

RETURN length(p)

本查詢返回路徑p的長度。

2、字符串的長度

語法: length( string )

參數:

  1. string:返回字符串的表達式

RETURN length('qwer')

 

MATCH (a)

WHERE length(a.name)> 6

RETURN length(a.name)

查詢返回了name爲’Charlie’的長度。

2.3、type() 返回字符串代表的關係類型。

語法: type( relationship )

參數:

  1. relationship:一個關係

MATCH (n)-[r]->()

WHERE n.name = 'Alice'

RETURN type(r)

 

查詢返回了關係r的關係類型。

2.4、id()

返回關係或者節點的id。

語法: id( property-container )

參數:

  1. property-container:一個節點或者關係

MATCH (a)

RETURN id(a)

返回了節點的id。

2.5、coalesce() 返回表達式列表中的第一個非空的值

返回表達式列表中的第一個非空的值。如果所有的實參都爲空 ,則返回null。

語法: coalesce( expression [, expression]* )

參數:

  1. expression:表達式,可能返回null。

MATCH (a)

WHERE a.name = 'Alice'

RETURN coalesce(a.hairColor, a.eyes)

2.6、head()

head()返回列表中的第一個元素。

語法: head( expression )

參數:

  1. 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 )

參數:

  1. 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 )

參數:

  1. relationship:返回關係的表達式

MATCH ()-[r]-()

WHERE id(r)=1199

RETURN startNode(r)

2.10、endNode()

endNode()返回一個關係的結束節點。

語法: endNode( relationship )

參數:

  1. relationship:返回關係的表達式

MATCH ()-[r]-()

WHERE id(r)=1199

RETURN startNode(r),endNode(r)

2.11、properties()

    properties()將實參轉爲屬性值的map。如果實參是一個節點或者關係,返回的就是節點或關係的屬性的map。如果實參已經是一個map了,那麼原樣返回結果。

語法: properties( expression )

參數:

  1. expression:返回節點,關係或者map的表達式

match (n)

where id(n) =0

RETURN properties(n)

2.12、toInt()

toInt()將實參轉換爲一個整數。字符串會被解析爲一個整數。如果解析失敗,將返回null。浮點數將被強制轉換爲整數。

語法: toInt( expression )

參數:

  1. expression:返回任意值的表達式

RETURN toInt('42'), toInt('not a number')

2.13、toFloat()

toFloat()將實參轉換爲浮點數。字符串會被解析爲一個浮點數。如果解析失敗,將返回null。整數將被強制轉換爲浮點數。

語法: toFloat( expression )

參數:

  1. expression:返回任意值的表達式

RETURN toFloat('11.5'), toFloat('not a number')

三、列表(List)函數

列表函數返回列表中的元素,如路徑中的節點等等。

3.1、nodes() 作用path

返回一條路徑中的所有節點。

語法: nodes( path )

參數:

  1. path:一條路徑

查詢返回了路徑p中的所有節點。

MATCH p =(a)-->(b)-->(c)

WHERE a.name = 'Alice' AND c.name = 'Eskil'

RETURN nodes(p)

3.2、relationships() 作用path

返回一條路徑中的所有關係。

語法: relationships( path )

參數:

  1. path:一條路徑

MATCH p =(a)-->(b)-->(c)

WHERE a.name = 'Alice' AND c.name = 'Eskil'

RETURN relationships(p)

查詢返回了路徑p中的所有節點關係。

3.2、labels() 參數爲node

以字符串列表的形式返回一個節點的所有標籤。

語法: labels( node )

參數:

  1. node:返回單個節點的任意表達式

MATCH (a)

WHERE a.name = 'Alice'

RETURN labels(a)

查詢返回了節點n的所有標籤。

3.3、keys() 可以爲節點 和關係

以字符串列表的形式返回一個節點,關係或者map的所有屬性的名稱。

語法: keys( property-container )

參數:

  1. 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 )

參數:

  1. list:返回列表的表達式
  2. variable:引用list中元素的變量,它在expression中會用到
  3. 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)

參數:

  1. list:返回列表的表達式
  2. variable:斷言中引用列表元素所用到的變量
  3. 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 )

參數:

  1. expression:返回某個類型列表的表達式

MATCH (a)

WHERE a.name = 'Eskil'

RETURN a.array, tail(a.array)

返回了array屬性及屬性中除了第一個之外的所有元素。

3.7、range()

range()返回一個範圍內的數字。值之間的默認步長爲1。範圍包含起始邊界值。

語法: range( start, end [, step] )

參數:

  1. start:起點數值的表達式
  2. end:結束數值的表達式
  3. 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 )

參數:

  1. accmulator:用於累加每次迭代的部分結果
  2. initial:累加器的初始值
  3. list:列表
  4. variable:引用列表中的每個元素的變量
  5. 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 )

參數:

  1. original:原字符串
  2. search:期望被替換的字符串
  3. replace:用於替換的字符串

RETURN replace("hello", "l", "w")

4.2、substring()

substring()返回原字符串的子串。它帶有一個 0爲開始的索引值和長度作爲參數。如果長度省略了,那麼它返回從索引開始到結束的子字符串。

語法: substring( original, start [, length] )

參數:

  1. original:原字符串
  2. start:子串的開始位置
  3. length:子串的長度

RETURN substring('hello', 1, 3), substring('hello', 2)

4.3、left()

left()返回原字符串左邊指定長度的子串。

語法: left( original, length )

參數:

  1. original:原字符串
  2. length:左邊子字符串的長度

RETURN left('hello', 3)

4.4、right()

right()返回原字符串右邊的指定長度的子字符串。

語法: right( original, length )

參數:

  1. original:原字符串
  2. length:右邊子字符串的長度

RETURN right('hello', 3)

4.4、ltrim()

ltrim()返回原字符串移除左側的空白字符後的字符串。

語法: ltrim( original )

參數:

  1. original:原字符串

RETURN ltrim(' hello')

4.5、rtrim()

rtrim()返回原字符串移除右側空白字符後的字符串。

語法: rtrim( original )

參數:

  1. original:原字符串

RETURN rtrim('hello ')

4.5、trim()

trim()返回原字符串移除兩側的空白字符之後的字符串。

語法: trim( original )

參數:

  1. original:原字符串

RETURN trim(' hello ')

4.6、lower()

lower()以小寫的形式返回原字符串。

語法: lower( original )

參數:

  1. original:原字符串

RETURN lower('HELLO')

4.7、upper()

uppper()以大寫的形式返回原字符串。

語法: upper( original )

參數:

  1. original:原字符串

RETURN upper('hello')

4.8、split()

split()返回以指定模式分隔後的字符串序列。

語法: split( original, splitPattern )

參數:

  1. original:原字符串
  2. splitPattern:分割字符串

RETURN split('one,two', ',')

4.9、reverse()

reverse()返回原字符串的倒序字符串。

語法: reverse( original )

參數:

  1. original:原字符串

RETURN reverse('anagram')

4.10、toString()

toString()將實參轉換爲字符串。它將整型、浮點型和布爾型轉換爲字符串。如果實參爲字符串,則按原樣返回。

語法: toString( expression )

參數:

  1. expression:返回數值,布爾或者字符串的表達式

RETURN toString(11.5), toString('already a string'), toString(TRUE )

五、數學函數

這些函數僅適用於數值表達式。如果用於其他類型的值,將返回錯誤。

5.1、數值函數

abs()

abs()函數返回數值的絕對值。

語法: abs( expression )

參數:

  1. 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 )

參數:

  1. expression:數值表達式

RETURN ceil(0.1)

返回大於0.1的最小整數,即爲1。

floor()

floor()返回小於等於表達式的最大的整數。

語法: floor( expression )

參數:

  1. expression:數值表達式

RETURN floor(0.9)

小於等於0.9的最大的整數爲0。

round()

round()返回距離表達式值最近的整數。

語法: round( expression )

參數:

  1. expression:數值表達式

RETURN round(3.141592)

距離3.141592最近的整數爲3。

sign()

sign()返回一個數值的正負。如果值爲零,則返回0。如果值爲負數,則返回-1。如果值爲正數,返回1。

語法: sign( expression )

參數:

  1. expression:數值表達

RETURN sign(-17), sign(0.1)

返回了-17和0.1的正負符號。

rand()

rand()返回[0, 1)之間的一個隨機數。返回的數值在整個區間遵循均勻分佈。

語法: rand()

參數:

RETURN rand()

返回了一個隨機數。

5.2、對數函數

log()

log()返回表達式的自然對數。

語法: log( expression )

參數:

  1. expression:數值表達式

RETURN log(27)

返回了27的自然對數的值。

log10()

log10()返回表達式的常用對數(以10爲底)。

語法: log10( expression )

參數:

  1. expression:數值表達式

RETURN log10(27)

返回了27的常用對數。

exp()

exp()返回e^n,這裏e是自然對數的底,n是表達式的實參值。

語法: e( expression )

參數:

  1. expression:數值表達式

RETURN exp(2)

返回了e的二次方。

e()

e()返回自然對數的底,即e。

語法: e()

參數:

RETURN e()

返回了自然對數的底e的值。

sqrt()

sqrt()返回數值的平方根。

語法: sqrt( expression )

參數:

  1. expression:數值表達式

RETURN sqrt(256)

返回了256的平方根,即16.

5.3三角函數

除非特別指明,所有的三角函數都是針對弧度值進行計算的。

sin()

sin()返回表達式的正弦函數值。

語法: sin( expression )

參數:

  1. expression:一個表示角的弧度的數值表達式

RETURN sin(0.5)

返回弧度爲0.5的正弦值。

cos()

cos()返回表達式的餘弦函數值。

語法: cos( expression )

參數:

  1. expression:一個表示角弧度的數值表達式

RETURN cos(0.5)

返回了弧度爲0.5的餘弦。

tan()

tan()返回表達式的正切值。

語法: tan( expression )

參數:

  1. expression:一個表示角弧度的數值表達式

RETURN tan(0.5)

cot()

cot()返回表達式的餘切值。

語法: cot( expression )

參數:

  1. expression:一個表示角弧度的數值表達式

RETURN cot(0.5)

返回了弧度爲0.5的餘切。

asin()

asin()返回表達式的反正弦值。

語法: asin( expression )

參數:

  1. expression:一個表示角弧度的數值表達式

RETURN asin(0.5)

返回了弧度爲0.5的反正弦。

acos()

acos()返回表達式的反餘弦值。

語法: acos( expression )

參數:

  1. expression:一個表示角弧度的數值表達式

RETURN acos(0.5)

返回了弧度爲0.5的反餘弦。

atan()

atan()返回表達式的反正切值。

語法: atan( expression )

參數:

  1. expression:一個表示角弧度的數值表達式

RETURN atan(0.5)

返回弧度0.5的反正切。

atan2()

atan2()返回方位角,也可以理解爲計算複數 x+yi 的幅角。

語法: atan2( expression1, expression2 )

參數:

  1. expression1:表示複數x部分的數值表達式
  2. expression2:表示複數y部分的數值表達式

RETURN atan2(0.5, 0.6)

返回了0.5和0.6的方位角。

pi()

pi()返回常數pi的數值。

語法: pi()

參數:

RETURN pi()

返回常數pi的值。

degrees()

degrees()將弧度轉爲度。

語法: degrees( expression )

參數:

  1. expression:一個表示角弧度的數值表達式

RETURN degrees(3.14159)

返回接近於pi的度數。

radians()

radians()將度轉爲弧度。

語法: radians( expression )

參數:

  1. expression:一個表示角度數的數值表達式

RETURN radians(180)

返回了180度的弧度值(pi)。

haversin()

haversin()返回表達式的半正矢。

語法: haversin( expression )

參數:

  1. 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);

}

}

 

學習文檔出自:龐國明 老師教學視頻

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章