目录
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); } } |
学习文档出自:庞国明 老师教学视频