美文网首页
Cypher语法关键字(一)MATCH、OPTIONAL MAT

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

作者: 数据的艺术2 | 来源:发表于2020-06-27 21:38 被阅读0次

    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
    

    相关文章

      网友评论

          本文标题:Cypher语法关键字(一)MATCH、OPTIONAL MAT

          本文链接:https://www.haomeiwen.com/subject/zbtbfktx.html