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

}

}

 

学习文档出自:庞国明 老师教学视频

 

 

  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值