Neo4j 第八篇:投射和过滤
投射子句用于定义如何返回数据集,并可以对返回的表达式设置别名,而过滤子句用于对查询的结果集按照条件进行过滤
一,Return子句
使用return子句返回节点,关系和关系。
1,返回节点
MATCH (n { name: 'B' }) RETURN n
2,返回关系
MATCH (n { name: 'A' })-[r:KNOWS]->(c) RETURN r
3,返回属性
MATCH (n { name: 'A' }) RETURN n.name
4,返回所有元素
MATCH p =(a { name: 'A' })-[r]->(b) RETURN *
5,为属性设置别名
MATCH (a { name: 'A' }) RETURN a.age AS SomethingTotallyDifferent
6,返回谓词(predicate),文本(literal)或模式(pattern)
MATCH (a { name: 'A' }) RETURN a.age > 30, "I'm a literal",(a)-->()
7,使用distinct关键字返回不重复值
MATCH (a { name: 'A' })-->(b) RETURN DISTINCT b
二,with 子句
一个查询(Query)语句有很多查询子句,每一个查询子句按照特定的顺序执行,每一个子句是查询的一部分(Part)。with子句的作用是把上一个查询的结果进行处理,作为下一个查询的数据源,也就是说,在上一个查询的结果输出到客户端之前,把结果传递到后续的子句中去。
1,对聚合的结果进行过滤
聚合的结果必须通过with子句才能被过滤,例如,with子句保留otherPerson,并新增聚合查询count(*),通过where子句过滤,返回查询结果:Anders。
MATCH (david { name: 'David' })--(otherPerson)-->() WITH otherPerson, count(*) AS foaf WHERE foaf > 1 RETURN otherPerson.name
2,限制返回的结果
MATCH (n { name: 'Anders' })--(m) WITH m ORDER BY m.name DESC LIMIT 1 MATCH (m)--(o) RETURN o.name
三,unwind子句
unwind子句用于把list格式的字符串拆开为行的序列
1,拆开列表
UNWIND [1, 2, 3, NULL ] AS x RETURN x, 'val' AS y
2,拆开嵌套列表
WITH [[1, 2],[3, 4], 5] AS nested
UNWIND nested AS x
UNWIND x AS y
RETURN y
3,Collect函数
collect函数用于把值组装成列表
WITH [1, 1, 2, 2] AS coll
UNWIND coll AS x
WITH DISTINCT x
RETURN collect(x) AS setOfVals
四,Where子句
使用Where子句对查询的结果进行过滤
1,按照逻辑表达式来过滤
MATCH (n) WHERE n.name = 'Peter' XOR (n.age < 30 AND n.name = 'Tobias') OR NOT (n.name = 'Tobias' OR n.name = 'Peter') RETURN n.name, n.age
2,按照节点的标签来过滤
MATCH (n)
WHERE n:Swedish
RETURN n.name, n.age
3,按照节点的属性来过滤
MATCH (n) WHERE n.age < 30 RETURN n.name, n.age
4,按照关系的属性来过滤
MATCH (n)-[k:KNOWS]->(f) WHERE k.since < 2000 RETURN f.name, f.age, f.email
5,按照动态计算的属性来计算
WITH 'AGE' AS propname MATCH (n) WHERE n[toLower(propname)]< 30 RETURN n.name, n.age
6,是否存在属性
MATCH (n)
WHERE exists(n.belt)
RETURN n.name, n.belt
7,字符串匹配
对字符串进行匹配:starts with、ends with,contains
MATCH (n) WHERE n.name STARTS WITH 'Pet' RETURN n.name, n.age MATCH (n) WHERE n.name ENDS WITH 'ter' RETURN n.name, n.age MATCH (n) WHERE n.name CONTAINS 'ete' RETURN n.name, n.age
8,正则匹配
使用 =~ 'regexp' 匹配正则 ,如果正则表达式以(?i)开头,表示整个正则是大小写敏感的。
MATCH (n) WHERE n.name =~ 'Tob.*' RETURN n.name, n.age MATCH (n) WHERE n.name =~ '(?i)ANDR.*' RETURN n.name, n.age
9,匹配路径模式
MATCH (tobias { name: 'Tobias' }),(others) WHERE others.name IN ['Andres', 'Peter'] AND (tobias)<--(others) RETURN others.name, others.age
使用not来排除路径模式:
MATCH (persons),(peter { name: 'Peter' }) WHERE NOT (persons)-->(peter) RETURN persons.name, persons.age
使用属性来匹配路径:
MATCH (n) WHERE (n)-[:KNOWS]-({ name: 'Tobias' }) RETURN n.name, n.age
使用关系类型来匹配路径:
MATCH (n)-[r]->() WHERE n.name='Andres' AND type(r)=~ 'K.*' RETURN type(r), r.since
10,列表
使用IN操作符表示匹配列表中的元素
MATCH (a) WHERE a.name IN ['Peter', 'Tobias'] RETURN a.name, a.age
11,缺失值
如果属性值缺失,那么属性值默认值是null,null和任何值比较都是false;可以使用is not null 或 is null来判断是否为null
MATCH (person) WHERE person.name = 'Peter' AND person.belt IS NULL RETURN person.name, person.age, person.belt
五,排序
使用order by对查询的结果进行排序,默认是升序,使用关键字desc使Cypher按照降序进行排序。
1,按照节点的属性进行升序排序
MATCH (n)
RETURN n.name, n.age
ORDER BY n.name
2,按照节点的属性值进行降序排序
MATCH (n)
RETURN n.name, n.age
ORDER BY n.name DESC
六,SKIP和LIMIT
SKIP是跳过前N行,LIMIT是限制返回的数量
1,跳过前3行
MATCH (n)
RETURN n.name
ORDER BY n.name
SKIP 3
2,跳过前3行,返回第4和5行
MATCH (n) RETURN n.name ORDER BY n.name SKIP 3 LIMIT 2
参考文档: