Cypher语法关键字(一)MATCH、OPTIONAL MATCH、WHERE、RETURN

cypher关键字

cypher关键字可分为三类。

  • 读关键字:MATCH、OPTIONAL MATCH、WHERE、START、Aggregation和LOAD CSV
  • 写关键字:CREATE、MERGE、SET、DELETE、REMOVE、FOREACH和CREATE UNIQUE
  • 通用关键字:RETURN、ORDER BY、LIMIT、SKIP、WITH、UNWIND、UNION和CALL

1,MATCH

MATCH关键字用于指定的模式检索数据库的数据。

查找节点

//查询数据库里所有节点
MATCH (n) RETURN n 

//查询带有某个标签的所有节点
MATCH (movie:Movie) RETURN movie

//查询关联节点
MATCH (:Person{ name: 'Lilly Wachowski'})--(movie) RETURN movie.title 

查找关系

//关系的方向通过-->或者<--来表示
MATCH (:Person { name: 'Lilly Wachowski' })-->(movie) RETURN movie.title 

//有向关系和变量
MATCH (:Person { name: 'Lilly Wachowski' })-[r]->(movie) RETURN type(r)

//匹配关系类型
MATCH (wallstreet:Movie { title: 'The Matrix' })<-[:ACTED_IN]-(actor) RETURN actor.name

//匹配多种关系类型:当需要匹配多种关系中的一种时,可以通过竖线|将多个关系连接在一起
MATCH (wallstreet { title: 'The Matrix' })<-[:ACTED_IN|:DIRECTED]-(person) 
RETURN person.name 

//多个关系:关系可以多语句以 ()--()的形式来表达,或者它们相互连接在一起。
MATCH (tom:Person{ name: 'Tom Hanks' })-[:ACTED_IN]->(movie)<-[:DIRECTED]-(director)
RETURN tom, movie, director 

/**
可变长关系
可变长关系和节点的语法如下:
   -[:TYPE*minHops..maxHops]->
minHops和maxHops都是可选的,默认值分别为1和无穷大。
当没有边界值的时候,点也可以省略。
当只设置了一个边界的时候,如果点省略了就意味着是一个固定长度的模式。
*/
//返回与'Tom Hanks'关系为1跳(hop)到3跳的所有电影。
MATCH (martin:Person { name: 'Tom Hanks' })-[:ACTED_IN*1..3]-(movie:Movie)
RETURN movie.title 

//变长关系的关系变量:当连接两个节点之间的长度是变长的,那么关系变量返回的将可能是一个关系列表。
MATCH (actor { name: 'Tom Hanks' })-[r:ACTED_IN*2]-(co_actor) RETURN r 

//匹配一簇关系:当模式包含一簇关系时,关系模式不会指定方向,Cypher将尝试匹配两个方向的关系。
MATCH (a)-[r]-(b) WHERE id(r)= 0 RETURN a,b 

查询路径

//如果想返回或者需要对路径进行过滤,可以将路径赋值给一个变量。
MATCH p =(tom { name: 'Tom Hanks' })-->() RETURN p 

//单条最短路径: 通过使用shortestPath函数很容易找到两个节点之间的最短路径
MATCH  p=shortestPath((tom { name: 'Tom Hanks' })-[*..15]-( Steve {name:'Steve Zahn'}))
RETURN p 
//上面查询的含义为:找到两个节点之间的最短路径,路径最大长度为15。在搜索最短路径的时候,还可以使用关系类型、最大跳数和方向等约束条件。如果用到了WHERE语句,相关的断言会被包含到shortestPath中去。如果路径的关系元素中用到了none()或者all()断言,那么这些将用于在检索时提高性能。

通过id查询节点或关系

//通过id查询节点:可以在断言中使用id()函数来根据id查询节点。
MATCH (n) WHERE id(n)= 0 RETURN n

//通过id查询多个节点:通过id查询多个节点的时候,可以将id放到IN语句中。
MATCH (n) WHERE id(n) IN [0, 3, 5] RETURN n

//通过id查询关系:通过id查询关系与节点类似。
MATCH ()-[r]->() WHERE id(r)= 0 RETURN r 

2,OPTIONAL MATCH

OPTINAL MATCH语句用于搜索模式中描述的匹配项,对于找不到的项用null代替。

关系

​ 如果某个关系是可选的,可使用OPTINAL MATCH。这很类似SQL中outer join的工作方式。如果关系存在就返回,否则在相应的地方返回null。

MATCH (a:Movie { title: 'The Matrix' })
OPTIONAL MATCH (a)-->(x)
RETURN x 

返回了null,因为这个节点没有外向关系。

可选元素的属性

如果可选的元素为null,那么该元素的属性也返回null。

MATCH (a:Movie { title: 'The Matrix' })
OPTIONAL MATCH (a)-->(x)
RETURN x, x.name

返回了x元素(查询中为null),它的name属性也为null。

可选关系类型

可在查询中指定可选的关系类型。

MATCH (a:Movie { title: 'The Matrix' })
OPTIONAL MATCH (a)<-[r: ACTED_IN]-()
RETURN r 

3,WHERE

​ WHERE在 MATCH或者OPTINAL MATCH语句中添加约束,或者与WITH一起使用来过滤结果。

基本使用

//布尔运算:可以在WHERE中使用布尔运算符,如AND和OR,以及布尔函数NOT。
//查找1990年到2000年发行的电影的名称
MATCH (nineties:Movie) 
WHERE nineties.released > 1990 AND nineties.released < 2000 
RETURN nineties.title

//节点标签的过滤:可以在WHERE中类似使用WHERE n:foo写入标签断言来过滤节点。
MATCH (n) WHERE n:Movie RETURN n 

//节点属性的过滤。
MATCH (n) WHERE n.released > 1990 RETURN n 

//关系属性的过滤
MATCH (n)-[:ACTED_IN]->(m) WHERE m.released > 1990 RETURN n

//属性存在性检查:使用exists()只能检查节点或者关系的某个属性是否存在。
MATCH (n) WHERE exists(n.title) RETURN n 

字符串匹配

//匹配字符串的开始:STARTS WITH用于以大小写敏感的方式匹配字符串的开始。
MATCH (n) WHERE n.name STARTS WITH 'Tom' RETURN n 

//匹配字符串的结尾:ENDS WITH用于以大小写敏感的方式匹配字符串的结尾。
MATCH (n) WHERE n.name ENDS WITH 'Hanks' RETURN n 

//字符串包含:CONTAINS用于检查字符串中是否包含某个字符串,它是大小写敏感的,且不关心匹配部分在字符串中的位置。
MATCH (n) WHERE n.name CONTAINS 'bin' RETURN n 

//字符串反向匹配:使用NOT关键词可以返回不满足给定字符串匹配要求的结果。
MATCH (n) WHERE NOT n.name ENDS WITH 's' RETURN n 

正则表达式

​ Cypher支持正则表达式过滤。正则表达式的语法继承来自Java正则表达式。

//正则表达式:可以使用=~ 'regexp'来进行正则表达式的匹配。
MATCH (n) WHERE n.name =~ 'Tom.*' RETURN n 

//正则表达式中的转义字符:如果需要在正则表达式中插入斜杠,需使用转义字符。注意:字符串中的反斜杠也需要转义。
MATCH (n) WHERE n.title =~ 'sun\\/rise' RETURN n 

//正则表达式的非大小写敏感:在正则表达式前面加入(?i)之后,整个正则表达式将变成非大小写敏感。
MATCH (n) WHERE n.name =~ '(?i)TOM.*' RETURN n 

在WHERE中使用路径模式

//模式过滤
MATCH (n { name:'Kevin Bacon'}),(m) WHERE (n)-[:ACTED_IN]-(m) RETURN n,m

//模式中的NOT过滤:NOT功能可用于排除某个模式。
MATCH (n { name:'Kevin Bacon'}),(m:Movie) WHERE NOT (n)-[:ACTED_IN]-(m) RETURN m

//模式中的属性过滤:可以在模式中添加属性来过滤结果。
MATCH (n) WHERE (n)-[: ACTED_IN]-({ title: 'Apollo' }) RETURN n

关系类型过滤

​ 可以在MATCH模式中添加关系类型,但有时候希望在类型过滤上具有丰富的功能。这时,可以将类型与其他进行比较。例如,下面的例子将关系类型与一个正在表达式进行比较。

MATCH (n)-[r]->()
WHERE type(r)=~ 'DIRE.*'
RETURN n 

IN运算符

检查列表中是否存在某个元素,可以使用IN运算符。

MATCH (a)
WHERE a.name IN ['Keanu Reeves', 'Lana Wachowski','Hugo Weaving']
RETURN a

空值过滤

​ 有时候需要测试某个值或变量是否为null。在Cypher中与SQL类似,可以使用IS NULL。相反,“不为空”使用IS NOT NULL,尽管NOT (IS NULL x)也可以。

MATCH (m)
WHERE m.title IS NULL 
RETURN m

4,RETURN

​ RETURN语句定义了查询结果集中返回的内容。

//返回节点
MATCH (n { name: 'Steve Zahn' }) RETURN n

//返回关系
MATCH (n { name: 'Steve Zahn' })-[r:KNOWS]->(c) RETURN r

//返回属性
MATCH (n { name: 'Steve Zahn' }) RETURN n.name

//返回所有元素:当希望返回查询中找到的所有节点,关系和路径时,可以使用星号*表示
MATCH p =(a { name: 'Steve Zahn' })-[r]->(b) RETURN *

//变量中的特殊字符:如果想使用空格等特殊字符,可以用反引号`将其括起来。
MATCH (`This is a common variable`)
WHERE `This is a common variable`.name = 'Steve Zahn'
RETURN `This is a common variable`.happy

//列别名:如果希望列名不同于表达式中使用的名字,可以使用AS<new name>对其重命名。
MATCH (a { name: 'Steve Zahn' }) RETURN a.born AS bornYear
     
//可选属性:如果某个属性可能存在,也可能不存在。这时,依然可以正常地去查询,对于不存在的属性,Cypher返回null。
MATCH (n) RETURN n.title

//其他表达式:任何表达式都可以作为返回项。如字面值,断言,属性,函数和任何其他表达式。
MATCH (a { name: 'Steve Zahn' })
RETURN a.born > 1960, "I a literal",(a)-->()

//唯一性结果:DISTINCT用于仅仅获取结果集中所依赖列的唯一行。
MATCH (a) RETURN DISTINCT a.name
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351