Nosql-neo4j-Cypher 语句(3)

目录:[TOC]

RETURN

RETURN 可以返回节点,关系及属性

//返回节点MATCH (n { name: 'B' })RETURN n// 返回关系MATCH (n { name: 'A' })-[r:KNOWS]->(c)RETURN r// 返回属性MATCH (n { name: 'A' })RETURN n.name//返回所有节点关系属性MATCH p =(a)-[r]->(b)RETURN *//不常见字符,使用反引号MATCH (`This isn\'t a common variable`)WHERE `This isn\'t a common variable`.name = 'A'RETURN `This isn\'t a common variable`.happy// 使用别名MATCH (a { name: 'A' })RETURN a.age AS SomethingTotallyDifferent//其他形式的表达式MATCH (a { name: 'A' })RETURN a.age > 30, "I'm a literal",(a)-->()// 去重MATCH (a { name: 'A' })-->(b)RETURN DISTINCT b

WITH

WITH语句允许查询链接在一起,一个查询的结果作为另一个查询的输入WITH变量范围是WITH下面的语句

  • 使用WITH和group by and LIMIT限制下一部分的输入数量
  • 和WHERE结合使用过滤聚合值
  • 使用WITH进行读写分析,读的部分只读,写的部分只写

//过滤聚合值,读 WITH 聚合 WHERE//返回和David联系的至少一次外连接的人MATCH (david { name: 'David' })--(otherPerson)-->()WITH otherPerson, count(*) AS foafWHERE foaf > 1RETURN otherPerson.name//在collect之前对数据进行排序和限制// 先读,WITH,排序MATCH (n)WITH nORDER BY n.name DESC LIMIT 3RETURN collect(n.name)//限制下一部分的搜索范围MATCH (n { name: 'Anders' })--(m)WITH mORDER BY m.name DESC LIMIT 1MATCH (m)--(o)RETURN o.name//

UNWIND

UNWIND解开List成为一行
这个list可能是collect处理的

UNWIND [1, 2, 3, NULL ] AS xRETURN x, 'val' AS y

//去重WITH [1, 1, 2, 2] AS collUNWIND coll AS xWITH DISTINCT xRETURN collect(x) AS setOfVals// 展开任何返回list的表达式WITH [1, 2] AS a,[3, 4] AS bUNWIND (a + b) AS xRETURN x// 展开list的listWITH [[1, 2],[3, 4], 5] AS nestedUNWIND nested AS xUNWIND x AS yRETURN y//应用空list,返回空UNWIND [] AS emptyRETURN empty, 'literal_that_is_not_returned'// 为了不处理空list,使用CASEWITH [] AS listUNWIND   CASE      WHEN list = []         THEN [null]      ELSE list   END AS emptylistRETURN emptylistUNWIND NULL AS xRETURN x, 'some_literal'// 通过参数创建节点{  "events" : [ {    "year" : 2014,    "id" : 1  }, {    "year" : 2014,    "id" : 2  } ]}UNWIND $events AS eventMERGE (y:Year { year: event.year })MERGE (y)<-[:IN]-(e:Event { id: event.id })RETURN e.id AS xORDER BY x

WHERE

WHERE是MATCH, OPTIONAL MATCH and WITH语句的一部分WHERE变量使用index可以提高查询性能

以下面graph为例:

// 创建节点CREATE (andy:Swedish:Person {name: 'Andy',belt:'white',age:36}) CREATE (peter:Person {name: 'Peter',email:'peter_n@example.com',age:35}) CREATE (timothy:Person {name: 'Timothy',address:'Sweden/Malmo',age:25}) CREATE (fido:Dog {name: 'Fido'}) CREATE (ozzy:Dog {name: 'Ozzy'}) CREATE (andy_dog:Dog {name: 'Andy'}) CREATE (banana:Toy {name: 'Banana'}) // 创建节关系CREATE (andy)-[:HAS_DOG{since:2016}]->(andy_dog)CREATE (andy)-[:KNOWS{since:1999}]->(peter)CREATE (andy)-[:KNOWS{since:2012}]->(timothy)CREATE (peter)-[:HAS_DOG{since:2010}]->(fido)CREATE (peter)-[:HAS_DOG{since:2018}]->(ozzy)CREATE (fido)-[:HAS_TOP]->(banana)

基本用法

//AND, OR, XOR and NOTMATCH (n:Person)WHERE n.name = 'Peter' XOR (n.age < 30 AND n.name = 'Timothy') OR NOT (n.name = 'Timothy' OR n.name = 'Peter')RETURN n.name, n.age//过滤节点标签MATCH (n)WHERE n:SwedishRETURN n.name, n.age//过滤节点属性MATCH (n:Person)WHERE n.age < 30RETURN n.name, n.age//过滤关系属性MATCH (n:Person)-[k:KNOWS]->(f)WHERE k.since < 2000RETURN f.name, f.age, f.email//动态计算属性WITH 'AGE' AS propnameMATCH (n:Person)WHERE n[toLower(propname)]< 30RETURN n.name, n.age//属性是否存在MATCH (n:Person)WHERE EXISTS (n.belt)RETURN n.name, n.belt

字符串匹配

  • STARTS WITH and ENDS WITH and ONTAINS,大小写敏感
// STARTS WITHMATCH (n:Person)WHERE n.name STARTS WITH 'Pet'RETURN n.name, n.age//ENDS WITH MATCH (n:Person)WHERE n.name ENDS WITH 'ter'RETURN n.name, n.age//CONTAINSMATCH (n:Person)WHERE n.name CONTAINS 'ete'RETURN n.name, n.age//否定MATCH (n:Person)WHERE NOT n.name ENDS WITH 'y'RETURN n.name, n.age

正则匹配

Cypher支持正则表达式,Cypher正则继承与Java的正则
支持改变字符串匹配模式:case-insensitive (?i), multiline (?m) and dotall (?s)
忽略大小写:MATCH (n) WHERE n.name =~ '(?i)Lon.*' RETURN n
使用正则表达式:=~ 'regexp'

MATCH (n:Person)WHERE n.name =~ 'Tim.*'RETURN n.name, n.age//某些字符不使用正则// . or * 使用转义字符MATCH (n:Person)WHERE n.email =~ '.*\\.com'RETURN n.name, n.age, n.email//大小写不敏感MATCH (n:Person)WHERE n.name =~ '(?i)AND.*'RETURN n.name, n.age

路径匹配中使用WHERE

Cypher中模式也是一种表达式
但是模式不仅仅是表达式其是predicatesWHERE不能用新变量,MATCH匹配subgraph,WHERE删除subgraph

//有外连接到timothy的人,WHERE中加入图模式MATCH (timothy:Person { name: 'Timothy' }),(other:Person)WHERE other.name IN ['Andy', 'Peter'] AND (timothy)<--(other)RETURN other.name, other.age//模式中使用NOT不匹配MATCH (person:Person),(peter:Person { name: 'Peter' })WHERE NOT (person)-->(peter)RETURN person.name, person.age//add properties to your patternsMATCH (n:Person)WHERE (n)-[:KNOWS]-({ name: 'Timothy' })RETURN n.name, n.age//过滤关系类型MATCH (n:Person)-[r]->()WHERE n.name='Andy' AND type(r)=~ 'K.*'RETURN type(r), r.since

WHERE中使用子查询

子查询也可以用于指定模式是否存在
子查询使用{}子查询可以使用外部的变量

subquery was introduced in Neo4j 4.0

  • 语法格式:
EXISTS { MATCH [Pattern] WHERE [Expression] }

实例:

//一般的子查询MATCH (person:Person)WHERE EXISTS {  MATCH (person)-[:HAS_DOG]->(:Dog)}RETURN person.name as name//子查询中加入WHEREMATCH (person:Person)WHERE EXISTS {  MATCH (person)-[:HAS_DOG]->(dog :Dog)  WHERE person.name = dog.name}RETURN person.name as name//子查询嵌套MATCH (person:Person)WHERE EXISTS {  MATCH (person)-[:HAS_DOG]->(dog:Dog)  WHERE EXISTS {    MATCH (dog)-[:HAS_TOY]->(toy:Toy)    WHERE toy.name = 'Banana'  }}RETURN person.name as name

WHERE中使用list

//判断是否在list中MATCH (a:Person)WHERE a.name IN ['Peter', 'Timothy']RETURN a.name, a.age//却失的值为null,在判断是为falseMATCH (n:Person)WHERE n.belt = 'white'RETURN n.name, n.age, n.belt//IS NULLMATCH (n:Person)WHERE n.belt = 'white' OR n.belt IS NULL RETURN n.name, n.age, n.beltORDER BY n.name

WHERE中使用范围

MATCH (a:Person)WHERE a.name >= 'Peter'RETURN a.name, a.ageMATCH (a:Person)WHERE a.name > 'Andy' AND a.name < 'Timothy'RETURN a.name, a.age

本文使用 文章同步助手 同步

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

推荐阅读更多精彩内容