Neo4j Cypher查询语言详解
返回节点
返回一个节点,在返回语句中列出即可。
查询:
START n=node(2)
RETURN n
结果:
返回关系
查询:
START n=node(1)
MATCH (n)-[r:KNOWS]->(c)
RETURN r
结果:
返回属性
查询:
START n=node(1)
RETURN n.name
结果:
带特殊字符的标识符
使用不在英语字符表中的字符,可以使用’单引号。
查询:
START
This isn't a commonidentifier=node(1)
RETURN
This isn't a commonidentifier.
<<!!__??>>`
结果:
列的别名
可以给展示出来的列名起别名。
查询:
START a=node(1)
RETURN a.age AS SomethingTotallyDifferent
返回节点的age属性,但重命名列名。
结果:
可选属性
属性在节点上可能存在也可能不存在,可以使用问号来标识标识符即可。
查询:
START n=node(1, 2)
RETURN n.age?
如果存在age属性,则返回,不存在则返回null。
结果:
特别的结果
DISTINCT 仅检索特别的行,基于选择输出的列。
查询:
START a=node(1)
MATCH (a)-->(b)
RETURN distinct b
返回name为B的节点,但仅为一次。
结果:
neo4j 聚合函数
目录
- 聚合Aggregation
- 计数
- 计算节点数
- 分组计算关系类型
- 计算实体数
- 计算非空可以值数
- 求和sum
- 平均值avg
- 最大值max
- 最小值min
- 聚类COLLECT
- 相异DISTINCT
聚合(Aggregation)
为集合计算数据,Cypher提供聚类功能,与SQL的group by类似。在return语句中发现的任何聚类函数,所有没有聚类函数的列将作为聚合key使用。图:
计数
计数(count)使用来计算行数。Count有两种使用方法。Count(*)计算匹配的行的行数,count(<标识符>)计算标识符中非空值数。
计算节点数
计算链接到一个节点的节点数,可以使用count(*)。
查询:
START n=node(2)
MATCH (n)-->(x)
RETURN n, count(*)
返回开始节点和相关节点节点数。
结果:
分组计算关系类型
计算分组了得关系类型,返回关系类型并使用count(*)计算。
查询:
START n=node(2)
MATCH (n)-[r]->()
RETURN type(r), count(*)
返回关系类型和其分组数。
结果:
计算实体数
相比使用count(*),可能计算标识符更实在。
查询:
START n=node(2)
MATCH (n)-->(x)
RETURN count(x)
返回链接到开始节点上的节点数
结果:
计算非空可以值数
查询:
START n=node(2,3,4,1)
RETURN count(n.property?)
结果:
求和(sum)
Sum集合简单计算数值类型的值。Null值将自动去掉。如下:
查询:
START n=node(2,3,4)
RETURN sum(n.property)
计算所有节点属性值之和。
结果:
平均值(avg)
Avg计算数量列的平均值
查询:
START n=node(2,3,4)
RETURN avg(n.property)
结果:
最大值(max)
Max查找数字列中的最大值。
查询:
START n=node(2,3,4)
RETURN max(n.property)
结果:
最小值(min)
Min使用数字属性作为输入,并返回在列中最小的值。
查询:
START n=node(2,3,4)
RETURN min(n.property)
结果:
聚类(COLLECT)
Collect将所有值收集到一个集合list中。
查询:
START n=node(2,3,4)
RETURN collect(n.property)
返回一个带有所有属性值的简单列。
结果:
相异(DISTINCT)
聚合函数中使用distinct来去掉值中重复的数据。
查询:
START a=node(2)
MATCH a-->b
RETURN count(distinct b.eyes)
结果:
neo4j 高级篇
目录
- 排序Order by
- 通过节点属性排序节点
- 通过多节点属性排序节点
- 倒序排列节点
- 空值排序
- Skip
- 跳过前三个
- 返回中间两个
- Limit
- 返回第一部分
- 函数Functions
- 判断
- All
- Any
- None
- Single
- Scalar函数
- Length
- Type
- Id
- Coalesce
- Iterable函数
- Nodes
- Relationships
- Extract
排序(Order by)
输出结果排序可以使用order by 子句。注意,不能使用节点或者关系排序,仅仅只针对其属性有效。图:
通过节点属性排序节点
查询:
START n=node(3,1,2)
RETURN n
ORDER BY n.name
结果:
通过多节点属性排序节点
在order by子句中可以通过多个属性来排序每个标识符。Cypher首先将通过第一个标识符排序,如果第一个标识符或属性相等,则在order by中检查下一个属性,依次类推。
查询:
START n=node(3,1,2)
RETURN n
ORDER BY n.age, n.name
首先通过age排序,然后再通过name排序。
结果:
倒序排列节点
可以在标识符后添加desc或asc来进行倒序排列或顺序排列。
查询:
START n=node(3,1,2)
RETURN n
ORDER BY n.name DESC
结果:
空值排序
当排列结果集时,在顺序排列中null将永远放在最后,而在倒序排列中放最前面。
查询:
START n=node(3,1,2)
RETURN n.length?, n
ORDER BY n.length?
结果:
Skip
Skip允许返回总结果集中的一个子集。此不保证排序,除非使用了order by’子句。 图:
跳过前三个
返回结果中一个子集,从第三个结果开始,语法如下:
查询:
START n=node(3, 4, 5, 1, 2)
RETURN n
ORDER BY n.name
SKIP 3
前三个节点将略过,最后两个节点将被返回。
结果:
返回中间两个
查询:
START n=node(3, 4, 5, 1, 2)
RETURN n
ORDER BY n.name
SKIP 1
LIMIT 2
中间两个节点将被返回。
结果:
Limit
Limit允许返回结果集中的一个子集。图:
返回第一部分
查询:
START n=node(3, 4, 5, 1, 2)
RETURN n
LIMIT 3
结果:
函数(Functions)
在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的节点的路径,返回符合条件路径中所有节点。
结果:
Any
语法:ANY(identifierin iterable WHERE predicate)
参数:
Ø Iterable(迭代器):一个集合属性,或者可迭代的元素,或一个迭代函数。
Ø Identifier(标识符):可用于判断比较的标识符。
Ø Predicate(判断):一个测试所有迭代器中元素的判断。
查询:
START a=node(2)
WHERE any(x in a.array WHERE x = "one")
RETURN a
结果:
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
结果:
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
结果:
Scalar函数
标量函数返回单个值。
Length
使用详细的length属性,返回或过滤路径的长度。
语法:LENGTH(iterable )
参数:
Ø Iterable(迭代器):一个集合属性,或者可迭代的元素,或一个迭代函数。
查询:
START a=node(3)
MATCH p=a-->b-->c
RETURN length(p)
返回路径的长度。
结果:
Type
返回关系类型的字符串值。
语法:TYPE(relationship )
参数:
Ø Relationship:一条关系。
查询:
START n=node(3)
MATCH (n)-[r]->()
RETURN type(r)
返回关系r的类型。
结果:
Id
返回关系或者节点的id
语法:ID(property-container )
参数:
Ø Property-container:一个节点或者一条关系。
查询:
START a=node(3, 4, 5)
RETURN ID(a)
返回这三个节点的id。
结果:
Coalesce
返回表达式中第一个非空值。
语法:COALESCE(expression [, expression]* )
参数:
Ø Expression:可能返回null的表达式。
查询:
START a=node(3)
RETURN coalesce(a.hairColour?,a.eyes?)
结果:
Iterable函数
迭代器函数返回一个事物的迭代器---在路径中的节点等等。
Nodes
返回一个路径中的所有节点。
语法:NODES(path )
参数:
Ø Path:路径
查询:
START a=node(3), c=node(2)
MATCH p=a-->b-->c
RETURN NODES(p)
结果:
Relationships
返回一条路径中的所有关系。
语法:RELATIONSHIPS(path )
参数:
Ø Path:路径
查询:
START a=node(3), c=node(2)
MATCH p=a-->b-->c
RETURN RELATIONSHIPS(p)
结果:
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属性值。
结果: