Neo4j-11-Cypher-Function

Neo4j 第十一篇:Cypher 函数

转载: https://www.cnblogs.com/ljhdo/p/10919763.html

参考: https://neo4j.com/docs/developer-manual/3.2/cypher/functions/

Cypher函数是对图进行查询和操作的重要工具。

一 谓词函数

谓词函数返回 true 或者 false,主要用于检查是否存在或满足特定的条件。

1 Exists

如果指定的模式存在于图中,或者特定的属性存在于节点、关系或 Map 中,那么函数返回 True

例如,节点具有 name 属性,并 check 图中是否存在特定的模式:

1
2
3
MATCH (n)
WHERE exists(n.name)
RETURN n.name AS name, exists((n)-[:MARRIED]->()) AS is_married

2 检查集合元素

all() 表示所有的元素都满足条件,any()表示至少一个元素满足条件,none()函数表示没有一个元素满足条件,single()表示只有一个元素满足条件

例如,ALL谓词表示,在路径中,所有节点都必须具有age属性,并且age属性值都必须大于30:

1
2
3
MATCH p =(a)-[*1..3]->(b)
WHERE a.name = 'Alice' AND b.name = 'Daniel' AND ALL (x IN nodes(p) WHERE x.age > 30)
RETURN p

ANY 谓词表示,节点的 array 属性中至少有一个元素值是 one:

1
2
3
MATCH (a)
WHERE a.name = 'Eskil' AND ANY (x IN a.array WHERE x = 'one')
RETURN a.name, a.array

NONE 谓词表示,在路径中,没有节点的age属性等于25

1
2
3
MATCH p =(n)-[*1..3]->(b)
WHERE n.name = 'Alice' AND NONE (x IN nodes(p) WHERE x.age = 25)
RETURN p

SINGLE 谓词表示,在路径中,只有一个节点的 eyes 属性是 blue:

1
2
3
MATCH p =(n)-->(b)
WHERE n.name = 'Alice' AND SINGLE (var IN nodes(p) WHERE var.eyes = 'blue')
RETURN p

二 标量函数

变量函数返回标量值

1 获得节点和关系的ID和属性

id(): 返回节点或关系的ID
properties(): 返回节点或关系的属性(Map)
1
2
CREATE (p:Person { name: 'Stefan', city: 'Berlin' })
RETURN id(p), properties(p)

2 关系

关系是由开始节点,结束节点和边构成的:

endNode(relationship):返回关系的结束节点
startNode(relationship):返回关系的开始节点
type(relationship):返回关系的类型
1
2
3
MATCH (n)-[r]->()
WHERE n.name = 'Alice'
RETURN type(r), startNode(r), endNode(r)

3 列表相关

列表是元素的有序序列,Cypher使用List来表示列表类型,应用于列表的函数有:

coalesce():返回列表中第一个非NULL的元素
head():返回列表中的第一个元素
last():返回列表中的最有一个元素
size():返回列表中元素的数量

例如,节点的array属性,

1
2
3
MATCH (a)
WHERE a.name = 'Eskil'
RETURN a.array, head(a.array), last(a.array), size(a.array)

4 size() 和 length() 函数

求长度的函数:

size(string):表示字符串中字符的数量,可以把字符串当作是字符的列表。
size(list):返回列表中元素的数量。
size(pattern_expression):也是统计列表中元素的数量,但是不是直接传入列表,而是提供模式表达式(pattern_expression),用于在匹配查询(Match query)中提供一组新的结果,这些结果是路径列表,size()函数用于统计路径列表中元素(即路径)的数量。
length(path):返回路径的长度,即路径中关系的数量

例如,统计路径列表中的元素数量:

1
2
3
MATCH (a)
WHERE a.name = 'Alice'
RETURN size((a)-->()-->()) AS fof

三 聚合函数

聚合函数用于对查询的结果进行统计:

avg():计算均值
count(exp):用于计算非null值(value)的数量,使用 count(distinct exp)进行无重复非null值的计数,使用count(*):计算值或记录的总数量,包括null值
max(),min():求最大值和最小值,在计算极值时,null被排除在外,min(null)或max(null)返回null
sum():求和,在求和时,null被排除在外,sum(null)的结果是0
collect():把返回的多个值或记录组装成一个列表,collect(null)返回一个空的列表

在聚合计算中,可以引用分组键来对查询的结果进行分组聚合,例如,在return子句中,如果表达式不是聚合函数,那么该表达式是分组key,下面的表达式是按照type(r)分组,计算每个分组中记录的数量。

1
RETURN type(r), count(*)

四 列表函数

列表是 Cypher 中的一个重要的复合类型,对列表进行操作的函数主要是生成列表、获取列表对象、抽取特定的列表元素、过滤列表元素和对列表元素进行迭代计算。

1 抽取元素构成列表

extract 函数的作用是从列表中抽取值,

1
extract(variable IN list | expression)

根据抽取的值组装成一个列表,返回一个列表:

1
2
3
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

2 过滤列表元素

filter 函数用于对列表中的元素进行过滤,

1
filter(variable IN list WHERE predicate)

把过滤后的元素组成一个了表,返回该列表:

1
2
3
MATCH (a)
WHERE a.name = 'Eskil'
RETURN a.array, filter(x IN a.array WHERE size(x)= 3)

3 获得列表

keys(node):从节点的属性中抽取属性键
labels(node):节点标签的列表
nodes(path):从路径中获取所有节点的列表
relationships(path):从路径中获得所有的关系
1
2
3
MATCH (a)
WHERE a.name = 'Alice'
RETURN labels(a),keys(a)
1
2
3
MATCH p =(a)-->(b)-->(c)
WHERE a.name = 'Alice' AND c.name = 'Eskil'
RETURN nodes(p), relationships(p)

4 序列的生成和倒置

range() 函数,用于生成一个有序的序列,reverse()函数把原始列表的元素进行倒置

1
2
range(start, end [, step])
reverse(list)

5 迭代计算列表

reduce() 函数应用在列表上,对列表中的每个元素e进行迭代计算,在元素e上运行表达式(expression),把当前的结果存储在累加器中,进行迭代计算,并返回最终计算的标量结果:

1
reduce(accumulator = initial, e IN list | expression)

例如,初始的age值是0,对路径p中的所有节点,计算各个节点的age值的和:

1
2
3
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
Contents
  1. 1. Neo4j 第十一篇:Cypher 函数
    1. 1.1. 一 谓词函数
      1. 1.1.1. 1 Exists
      2. 1.1.2. 2 检查集合元素
    2. 1.2. 二 标量函数
      1. 1.2.1. 1 获得节点和关系的ID和属性
      2. 1.2.2. 2 关系
      3. 1.2.3. 3 列表相关
      4. 1.2.4. 4 size() 和 length() 函数
    3. 1.3. 三 聚合函数
    4. 1.4. 四 列表函数
      1. 1.4.1. 1 抽取元素构成列表
      2. 1.4.2. 2 过滤列表元素
      3. 1.4.3. 3 获得列表
      4. 1.4.4. 4 序列的生成和倒置
      5. 1.4.5. 5 迭代计算列表
|