Neo4j Cypher查询语言详解

Stella981
• 阅读 815

Neo4j Cypher查询语言详解

返回节点

返回一个节点,在返回语句中列出即可。

查询:

START n=node(2)

RETURN n

 结果:

Neo4j Cypher查询语言详解

返回关系

查询:

START n=node(1)

MATCH (n)-\[r:KNOWS\]->(c)

RETURN r

结果:

Neo4j Cypher查询语言详解

返回属性

查询:

START n=node(1)

RETURN n.name

结果:

Neo4j Cypher查询语言详解

带特殊字符的标识符

使用不在英语字符表中的字符,可以使用’单引号。

查询:

START This isn't a commonidentifier=node(1)

RETURN This isn't a commonidentifier.<<!!\_\_??>>\`

结果:

Neo4j Cypher查询语言详解

列的别名

可以给展示出来的列名起别名。

查询:

START a=node(1)

RETURN a.age AS SomethingTotallyDifferent

 返回节点的age属性,但重命名列名。

结果:

Neo4j Cypher查询语言详解

可选属性

属性在节点上可能存在也可能不存在,可以使用问号来标识标识符即可。

查询:

START n=node(1, 2)

RETURN n.age?

如果存在age属性,则返回,不存在则返回null。

结果:

Neo4j Cypher查询语言详解

特别的结果

DISTINCT 仅检索特别的行,基于选择输出的列。

查询:

START a=node(1)

MATCH (a)-->(b)

RETURN distinct b

返回name为B的节点,但仅为一次。

结果:

Neo4j Cypher查询语言详解

neo4j 聚合函数

目录

  1. 聚合Aggregation
    1. 计数
    2. 计算节点数
    3. 分组计算关系类型
    4. 计算实体数
    5. 计算非空可以值数
    6. 求和sum
    7. 平均值avg
    8. 最大值max
    9. 最小值min
    10. 聚类COLLECT
    11. 相异DISTINCT

聚合(Aggregation)

为集合计算数据,Cypher提供聚类功能,与SQL的group by类似。在return语句中发现的任何聚类函数,所有没有聚类函数的列将作为聚合key使用。图:

Neo4j Cypher查询语言详解

计数

计数(count)使用来计算行数。Count有两种使用方法。Count(\*)计算匹配的行的行数,count(<标识符>)计算标识符中非空值数。

计算节点数

计算链接到一个节点的节点数,可以使用count(\*)。

查询:

START n=node(2)

MATCH (n)-->(x)

RETURN n, count(\*)

 返回开始节点和相关节点节点数。

结果:

Neo4j Cypher查询语言详解

分组计算关系类型

计算分组了得关系类型,返回关系类型并使用count(\*)计算。

查询:

START n=node(2)

MATCH (n)-\[r\]->()

RETURN type(r), count(\*)

 返回关系类型和其分组数。

结果:

Neo4j Cypher查询语言详解

计算实体数

相比使用count(\*),可能计算标识符更实在。

查询:

START n=node(2)

MATCH (n)-->(x)

RETURN count(x)

 返回链接到开始节点上的节点数

结果:

Neo4j Cypher查询语言详解

计算非空可以值数

查询:

START n=node(2,3,4,1)

RETURN count(n.property?)

 结果:

Neo4j Cypher查询语言详解

求和(sum)

Sum集合简单计算数值类型的值。Null值将自动去掉。如下:

查询:

START n=node(2,3,4)

RETURN sum(n.property)

 计算所有节点属性值之和。

结果:

Neo4j Cypher查询语言详解

平均值(avg)

Avg计算数量列的平均值

查询:

START n=node(2,3,4)

RETURN avg(n.property)

 结果:

Neo4j Cypher查询语言详解

最大值(max)

Max查找数字列中的最大值。

查询:

START n=node(2,3,4)

RETURN max(n.property)

 结果:

Neo4j Cypher查询语言详解

最小值(min)

Min使用数字属性作为输入,并返回在列中最小的值。

查询:

START n=node(2,3,4)

RETURN min(n.property)

 结果:

Neo4j Cypher查询语言详解

聚类(COLLECT)

Collect将所有值收集到一个集合list中。

查询:

START n=node(2,3,4)

RETURN collect(n.property)

 返回一个带有所有属性值的简单列。

结果:

Neo4j Cypher查询语言详解

相异(DISTINCT)

聚合函数中使用distinct来去掉值中重复的数据。

查询:

START a=node(2)

MATCH a-->b

RETURN count(distinct b.eyes)

 结果:

Neo4j Cypher查询语言详解

neo4j 高级篇

目录

  1. 排序Order by
    1. 通过节点属性排序节点
    2. 通过多节点属性排序节点
    3. 倒序排列节点
    4. 空值排序
  2. Skip
    1. 跳过前三个
    2. 返回中间两个
  3. Limit
    1. 返回第一部分
  4. 函数Functions
    1. 判断
    2. All
    3. Any
    4. None
    5. Single
    6. Scalar函数
    7. Length
    8. Type
    9. Id
    10. Coalesce
    11. Iterable函数
    12. Nodes
    13. Relationships
    14. Extract

排序(Order by)

输出结果排序可以使用order by 子句。注意,不能使用节点或者关系排序,仅仅只针对其属性有效。图:

Neo4j Cypher查询语言详解

通过节点属性排序节点

查询:

START n=node(3,1,2)

RETURN n

ORDER BY n.name

 结果:

Neo4j Cypher查询语言详解

通过多节点属性排序节点

在order by子句中可以通过多个属性来排序每个标识符。Cypher首先将通过第一个标识符排序,如果第一个标识符或属性相等,则在order by中检查下一个属性,依次类推。

查询:

START n=node(3,1,2)

RETURN n

ORDER BY n.age, n.name

 首先通过age排序,然后再通过name排序。

结果:

Neo4j Cypher查询语言详解

倒序排列节点

可以在标识符后添加desc或asc来进行倒序排列或顺序排列。

查询:

START n=node(3,1,2)

RETURN n

ORDER BY n.name DESC

 结果:

Neo4j Cypher查询语言详解

 

空值排序

当排列结果集时,在顺序排列中null将永远放在最后,而在倒序排列中放最前面。

查询:

START n=node(3,1,2)

RETURN n.length?, n

ORDER BY n.length?

 结果:

 Neo4j Cypher查询语言详解

Skip

Skip允许返回总结果集中的一个子集。此不保证排序,除非使用了order by’子句。 图:

Neo4j Cypher查询语言详解

跳过前三个

返回结果中一个子集,从第三个结果开始,语法如下:

查询:

START n=node(3, 4, 5, 1, 2)

RETURN n

ORDER BY n.name

SKIP 3

 前三个节点将略过,最后两个节点将被返回。

结果:

Neo4j Cypher查询语言详解

 

返回中间两个

查询:

START n=node(3, 4, 5, 1, 2)

RETURN n

ORDER BY n.name

SKIP 1

LIMIT 2

 中间两个节点将被返回。

结果:

 Neo4j Cypher查询语言详解

Limit

Limit允许返回结果集中的一个子集。图:

Neo4j Cypher查询语言详解

返回第一部分

查询:

START n=node(3, 4, 5, 1, 2)

RETURN n

LIMIT 3

 结果:

Neo4j Cypher查询语言详解

函数(Functions)

在Cypher中有一组函数,可分为三类不同类型:判断、标量函数和聚类函数。图:

Neo4j Cypher查询语言详解

判断

判断为boolean函数,对给出的输入集合做判断并返回true或者false。常用在where子句中过滤子集。

All

迭代测试集合中所有元素的判断。

语法:

All(标识符 in iterable where 判断)

参数:

Ø  iterable :一个集合属性,或者可迭代的元素,或一个迭代函数。

Ø  标识符:可用于判断比较的标识符。

Ø  判断:一个测试所有迭代器中元素的判断。

查询:

START a=node(3), b=node(1)

MATCH p=a-\[\*1..3\]->b

WHERE all(x in nodes(p) WHERE x.age > 30)

RETURN p

过滤包含age〈30的节点的路径,返回符合条件路径中所有节点。

结果:

Neo4j Cypher查询语言详解

Any

语法:ANY(identifierin iterable WHERE predicate)

参数:

Ø  Iterable(迭代器):一个集合属性,或者可迭代的元素,或一个迭代函数。

Ø  Identifier(标识符):可用于判断比较的标识符。

Ø  Predicate(判断):一个测试所有迭代器中元素的判断。

查询:

START a=node(2)

WHERE any(x in a.array WHERE x = "one")

RETURN a

结果:

Neo4j Cypher查询语言详解

None

在迭代器中没有元素判断将返回true。

语法:NONE(identifierin iterable WHERE predicate)

Ø  Iterable(迭代器):一个集合属性,或者可迭代的元素,或一个迭代函数。

Ø  Identifier(标识符):可用于判断比较的标识符。

Ø  Predicate(判断):一个测试所有迭代器中元素的判断。

查询:

START n=node(3)

MATCH p=n-\[\*1..3\]->b

WHERE NONE(x in nodes(p) WHERE x.age = 25)

RETURN p

 结果:

Neo4j Cypher查询语言详解

Single

如果迭代器中仅有一个元素则返回true。

语法:SINGLE(identifierin iterable WHERE predicate)

参数:

Ø  Iterable(迭代器):一个集合属性,或者可迭代的元素,或一个迭代函数。

Ø Identifier(标识符):可用于判断比较的标识符。

Ø Predicate(判断):一个测试所有迭代器中元素的判断。

查询:

START n=node(3)

MATCH p=n-->b

WHERE SINGLE(var in nodes(p) WHERE var.eyes = "blue")

RETURN p

结果:

Neo4j Cypher查询语言详解

Scalar函数

标量函数返回单个值。

Length

使用详细的length属性,返回或过滤路径的长度。

语法:LENGTH(iterable )

参数:

Ø  Iterable(迭代器):一个集合属性,或者可迭代的元素,或一个迭代函数。

查询:

START a=node(3)

MATCH p=a-->b-->c

RETURN length(p)

返回路径的长度。

结果:

Neo4j Cypher查询语言详解

Type

返回关系类型的字符串值。

语法:TYPE(relationship )

参数:

Ø  Relationship:一条关系。

查询:

START n=node(3)

MATCH (n)-\[r\]->()

RETURN type(r)

返回关系r的类型。

结果:

Neo4j Cypher查询语言详解

Id

返回关系或者节点的id

语法:ID(property-container )

参数:

Ø  Property-container:一个节点或者一条关系。

查询:

START a=node(3, 4, 5)

RETURN ID(a)

返回这三个节点的id。

结果:

Neo4j Cypher查询语言详解

Coalesce

返回表达式中第一个非空值。

语法:COALESCE(expression \[, expression\]\* )

参数:

Ø  Expression:可能返回null的表达式。

查询:

START a=node(3)

RETURN coalesce(a.hairColour?,a.eyes?)

结果:

Neo4j Cypher查询语言详解

Iterable函数

迭代器函数返回一个事物的迭代器---在路径中的节点等等。

Nodes

返回一个路径中的所有节点。

语法:NODES(path )

参数:

Ø  Path:路径

查询:

START a=node(3), c=node(2)

MATCH p=a-->b-->c

RETURN NODES(p)

结果:

Neo4j Cypher查询语言详解

Relationships

返回一条路径中的所有关系。

语法:RELATIONSHIPS(path )

参数:

Ø  Path:路径

查询:

START a=node(3), c=node(2)

MATCH p=a-->b-->c

RETURN RELATIONSHIPS(p)

结果:

Neo4j Cypher查询语言详解

Extract

可以使用extract单个属性,或从关系或节点集合迭代一个函数的值。将遍历迭代器中所有的节点并运行表达式返回结果。

语法:EXTRACT(identifier in iterable : expression )

Ø  Iterable(迭代器):一个集合属性,或者可迭代的元素,或一个迭代函数。

Ø  Identifier(标识符):闭包中表述内容的标识符,这决定哪个标识符将用到。

Ø  expression(表达式):这个表达式将对于迭代器中每个值运行一次,并生成一个结果迭代器。

查询:

START a=node(3), b=node(4),c=node(1)

MATCH p=a-->b-->c

RETURN extract(n in nodes(p) : n.age)

返回路径中所有age属性值。

结果:

Neo4j Cypher查询语言详解

原文地址:http://www.ttlsa.com/nosql/how-to-neo4j-cypher-query-language/
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java反射, 不看你可别后悔
<divid"content\_views"class"markdown\_views"<!flowchart箭头图标勿删<svgxmlns"http://www.w3.org/2000/svg"style"display:none;"<pathstrokelinecap"round"d"M5,00,
Stella981 Stella981
3年前
AndroidStudio封装SDK的那些事
<divclass"markdown\_views"<!flowchart箭头图标勿删<svgxmlns"http://www.w3.org/2000/svg"style"display:none;"<pathstrokelinecap"round"d"M5,00,2.55,5z"id"raphael
Stella981 Stella981
3年前
Native memory allocation (mmap) failed to map xxx bytes for committing reserved memory
<divid"content\_views"class"markdown\_views"<!flowchart箭头图标勿删<svgxmlns"http://www.w3.org/2000/svg"style"display:none;"<pathstrokelinecap"round"d"M5,00,
Stella981 Stella981
3年前
Spring Boot 2下使用Feign找不到@EnableFeignClients的解决办法
<divid"content\_views"class"markdown\_views"<!flowchart箭头图标勿删<svgxmlns"http://www.w3.org/2000/svg"style"display:none;"<pathstrokelinecap"round"d"M5,00,2
Wesley13 Wesley13
3年前
Java8中的LocalDateTime工具类
<divid"content\_views"class"markdown\_views"<!flowchart箭头图标勿删<svgxmlns"http://www.w3.org/2000/svg"style"display:none;"<pathstrokelinecap"round"d"M5,00,
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这