1. 文章
  2. 文章详情

Neo4j-CQL - Cypher列表函数

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

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

例如,节点的array属性

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

size()和length()函数

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

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

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

抽取元素构成列表

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

extract(variable IN list | 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

过滤列表元素

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

filter(variable IN list WHERE predicate)

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

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

获得列表

  • keys(node):从节点的属性中抽取属性键
  • labels(node):节点标签的列表
  • nodes(path):从路径中获取所有节点的列表
  • relationships(path):从路径中获得所有的关系
MATCH (a)
WHERE a.name = 'Alice'
RETURN labels(a),keys(a)

MATCH p =(a)-->(b)-->(c)
WHERE a.name = 'Alice' AND c.name = 'Eskil'
RETURN nodes(p), relationships(p)

序列的生成和倒置

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

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

迭代计算列表

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

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

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

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

foreach子句

列表和路径是Cypher中的关键概念,foreach子句用于更新数据,例如,对路径中的元素或通过聚合创建的列表执行更新命令。

对路径中匹配的所有节点,添加marked属性,并设置属性值为TRUE

MATCH p =(begin)-[*]->(END )
WHERE begin.name = 'A' AND END .name = 'D'
FOREACH (n IN nodes(p)| SET n.marked = TRUE )

发表评论

登录后才能评论

评论列表(0条)