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

一,谓词函数

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

1,Exists

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

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

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:

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:

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

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

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:

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)
CREATE (p:Person { name: 'Stefan', city: 'Berlin' })
RETURN id(p), properties(p)

2,关系

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

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

3,列表相关

列表是元素的有序序列,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)

4,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

三,聚合函数

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

  • 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)分组,计算每个分组中记录的数量。

RETURN type(r), count(*)

四,列表函数

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

1,抽取元素构成列表

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

2,过滤列表元素

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)

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)

4,序列的生成和倒置

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

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

5,迭代计算列表

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

参考文档:

Cypher Functions

Neo4j 第十一篇:Cypher函数的更多相关文章

  1. 第十一篇 Python函数之定义&形参&实参&位置参数&关键字参数&可变长参数&默认参数

    函数的定义:函数是为了完成某一特定功能的,函数是逻辑结构化和过程化的一种编程方法 函数的定义格式,函数一般都是有返回值的 #语法 #函数名要能反映其意义 def 函数名(参数1,参数2,参数3,... ...

  2. Python开发【第十一篇】函数

    函数 什么是函数? 函数是可以重复执行的语句块,可以重复调用并执行函数的面向过程编程的最小单位. 函数的作用: 函数用于封装语句块,提高代码的重用性,定义用户级别的函数.提高代码的可读性和易维护性. ...

  3. Neo4j 第三篇:Cypher查询入门

    本文转载自:https://www.cnblogs.com/ljhdo/p/5516793.html Neo4j使用Cypher查询图形数据,Cypher是描述性的图形查询语言,语法简单,功能强大,由 ...

  4. 【python自动化第十一篇】

    [python自动化第十一篇:] 课程简介 gevent协程 select/poll/epoll/异步IO/事件驱动 RabbitMQ队列 上节课回顾 进程: 进程的诞生时为了处理多任务,资源的隔离, ...

  5. Python开发【第二十一篇】:Web框架之Django【基础】

    Python开发[第二十一篇]:Web框架之Django[基础]   猛击这里:http://www.cnblogs.com/wupeiqi/articles/5237704.html Python之 ...

  6. Neo4j 第四篇:使用C#更新和查询Neo4j

    本文使用的IDE是Visual Studio 2015 ,驱动程序是Neo4j官方的最新版本:Neo4j Driver 1.3.0 ,创建的类库工程(Project)要求安装 .NET Framewo ...

  7. Neo4j 第四篇:使用.NET驱动访问Neo4j

    本文使用的IDE是Visual Studio 2015 ,驱动程序是Neo4j官方的最新版本:Neo4j.Driver,创建的类库工程(Project)要求安装 .NET Framework 4.5. ...

  8. 解剖SQLSERVER 第十一篇 对SQLSERVER的多个版本进行自动化测试(译)

    解剖SQLSERVER 第十一篇    对SQLSERVER的多个版本进行自动化测试(译) http://improve.dk/automated-testing-of-orcamdf-against ...

  9. 第十一篇 SQL Server代理维护计划

    本篇文章是SQL Server代理系列的第十一篇,详细内容请参考原文 在这一系列的上一篇,我们看了使用代理帐户模仿Windows安全上下文完成作业步骤的工作.大多数子系统支持代理账户,同时子系统限制代 ...

随机推荐

  1. git报错:fatal: bad config line 1 in file C:/Users/JIANGXIAOLIANG/.gitconfig

    在给git设置用户名和邮箱的时候报下面的错误:fatal: bad config line 1 in file C:/Users/JIANGXIAOLIANG/.gitconfig看提示的意思是git ...

  2. python中反转列表的三种方式

    1.内建函数reversed() li =[1, 2, 3, 4, 5, 6] a = list(reversed(li)) print (a) 注意:reversed()函数返回的是一个迭代器,而不 ...

  3. Python绘图还在用Matplotlib?out了 !发现一款手绘可视化神器!

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. GitHub 地址:https://github.com/chenjian ...

  4. Flask 教程 第二章:模板

    本文翻译自 The Flask Mega-Tutorial Part II: Templates 在Flask Mega-Tutorial系列的第二部分中,我将讨论如何使用模板. 学习完第一章之后,你 ...

  5. 微信小程序 setData 如何修改动态数据?

    最近这段时间在写微信小程序,有一个页面需要动态修改 data 中的数据,而这里似乎是个坑. 1.正常修改 正常修改很简单,当触发 change 事件时,数据和页面都会同时发生改变.这个也不用多说,很简 ...

  6. VS2017 打开WebService 提示已经在解决方案中打开了具有该名称的项目

    .net开发.用VS2017工具,打开VS2010创建的WebSevice工程时,提示工程不可用. 重新加载后提示:已经在解决方案中打开了具有该名称的项目. 该问题原因是因为启用了源代码管理工具的问题 ...

  7. (入门SpringBoot)SpringBoot项目创建基本配置(二)

    SpringBoot的环境搭建和基本开发:1.环境开发就不说了,一个程序员的基本功:2.基本开发-使用自定义的配置:2.1.配置文件.properties和yml文件.2.2.SpringBoot配置 ...

  8. Python 修饰符@用法

    def funA(desA): print("It's funA") def funB(desB): print(desB( )) print("It's funB&qu ...

  9. (五)Amazon Lightsail 部署LAMP应用程序之迁移到Amazon RDS实例

    迁移到您的Amazon RDS实例 在某些时候,您的应用程序需求可能需要在 Amazon Lightsail中找不到的功能.幸运的是,将应用程序的一个或所有部分移动到其他AWS服务中非常简单 您将数据 ...

  10. 设置了相对定位relative之后,改变top值,如何去掉多余空白?

    众所周知,relative和absolute有一个区别在于relative是相对自身定位,而absolute是相对于最近的定位父级定位,而此时的相对定位经过top值改变其在文档流中的位置之后,自身本来 ...