Cypher 语句

Cypher是图形数据库Neo4j的声明式查询语言。
Cypher语句规则和具备的能力:
Cypher通过模式匹配图数据库中的节点和关系,来提取信息或者修改数据。
Cypher语句中允许使用变量,用来表示命名、绑定元素和参数。
Cypher语句可以对节点、关系、标签和属性进行创建、更新和删除操作。
Cypher语句可以管理索引和约束。

运算符

常规运算 DISTINCT, ., []
算数运算 +, -, *, /, %, ^
比较运算 =, <>, <, >, <=, >=, IS NULL, IS NOT NULL
逻辑运算 AND, OR, XOR, NOT
字符串操作 +
List操作 +, IN, [x], [x .. y]
正则操作 =~
字符串匹配 STARTS WITH, ENDS WITH, CONTAINS

语句

1.创建节点语句

例子1:创建节点并给节点分配一个属性

CREATE (n {name:"张三"})

例子2:批量创建节点并且分配属性

UNWIND [{name:"李四"},{name:"张三"}] AS mynodes
CREATE (n) SET n = mynodes

例3:创建节点时分配属性和标签

CREATE ( n:Person{name:"李四"} )

例4:创建一个关系,给两个节点建立关系指定关系类型、方向和绑定一个变量。

  CREATE ({name:"李四"})-[r:have]->({bookname:"设计模式"})

例5:创建两个节点同时创建一个关系,给两个节点建立关系指定关系类型、方向和属性。

  CREATE ({name:"李四"})-[:LOVES{since:"2017"}]->({name:"小花"})

例6:给已经存在的两个节点创建一个关系。

  MATCH (a:Person),(b:Person)
WHERE a.name = '张三' AND b.name = 李四'
CREATE (a)-[r:FRIEND]->(b)
RETURN r

2.匹配语句

Cypher的MATCH语句和SQL的SELECT语句类似,都是查询数据的表达式.而Cypher语句中的WHERE和SQL语句中的WHERE语句由这相同的作用,其作用是用来过滤匹配结的,在Cypher语句中WHERE是在MATCH、OPTIONAL MATCH、WITH或START语句中使用的过滤限定语句

匹配语句结构
[MATCH WHERE]
[OPTIONAL MATCH WHERE]
[WITH [ORDER BY] [SKIP] [LIMIT]]
RETURN [ORDER BY] [SKIP] [LIMIT]

例1:根据属性匹配节点信息。

MATCH (n{name:"张三"}) RETURN n

例2:根据标签和属性匹配节点信息。

MATCH (n:Person{name:"李四"}}) RETURN  n


例3:任意匹配,返回任意节点信息。
Cypher语句允许任意匹配,任意匹配可以匹配任何与cypher表达式相符合的所有节点.
1.匹配任意节点

  //该语句会匹配任意节点,并返回
MATCH (n) RETURN n

2.任意关系

  //该语句是匹配出有任意关系的两个节点
MATCH p = (n)-[r]->(m) RETURN p

3.可选匹配

//匹配结果集中如果有丢的部分,则会用null来补充
OPTIONAL MATCH (n)-[r]->(m) RETURN m

例4:匹配节点时指定标签、属性和关系类型

MATCH (n:Person)-[:FRIEND]->(m:Person) WHERE n.name = '张三'

例5:根据标签过滤

//从图数据库中,过滤出Person标签
MATCH (n) WHERE n:Person RETURN n

例6:根据节点属性过滤

MATCH (n) WHERE n.name = "李思思" RETURN n

例7:根据关系属性过滤

MATCH (n)-[k:KNOWS]->(f) WHERE k.since < 2000 RETURN f

例8:字符串匹配
字符串首尾可以使用STARTS WITH 和 ENDS WITH,去匹配定位字符串,字符串匹配还可以使用AONTAINS来匹配字符串中包含的自字符串。
1.匹配字符串的开头
匹配图中的所有节点,返回节点中包含name属性,且属性值以"张"开头的所有节点

  MATCH (n)
WHERE n.name STARTS WITH '张'
RETURN n

2.匹配字符串的末尾
匹配图中的所有节点,返回节点中包含name属性,且属性值以"三"开头的所有节点

  MATCH (n)
WHERE n.name ENDS WITH '三'
RETURN n

3.匹配字符串的包含匹配
匹配图中的所有节点,返回节点中包含name属性,且属性值中任意位置包含"小"字符串的节点

  MATCH (n)
WHERE n.name CONTAINS '三'
RETURN n

4.字符串排除匹配
在字符串匹配的时候可以使用NOT关键字来排除匹配到的结果,得到相反的结果

//匹配图中的所有节点,返回节点中包含name属性,且不是姓张的所有节点
MATCH (n)
WHERE NOT n.name STARTS WITH '张'
RETURN n

例9:字符串正则表达式
Cypher支持使用正则表达式进行过滤。 正则表达式语法从Java正则表达式继承过来的。这包括支持改变字符串匹配的标志,包括不区分大小写(?i),多行(?m)和逗点(?s),在这里正则表达式使用的解析符号是=~

1.模糊匹配,类似sql语句中的like

  //类似like '%小%'

  MATCH (n)
WHERE n.name =~ '.*小.*'
RETURN n

2.不去分大小写正则匹配

  //不区分大小写匹配,名字中以"ANDR"开头的节点
MATCH (n)
WHERE n.name =~ '(?i)ANDR.*'
RETURN n

例10:WHERE句子中使用路径匹配
1.使用逻辑运算符号和路径作为过滤条件

  //在图中匹配名称为"李四"或"王五"与"张三"有任何关系的节点,并返回符合匹配条件的节点信息
MATCH (n { name: '张三' }),(m)
WHERE m.name IN ['李四', '王五'] AND (n)<--(m)
RETURN m

2.关系匹配使用NOT逻辑运算符号

  //匹配和张三没有关系的人
MATCH (persons),(zhangsan { name: '张三' })
WHERE NOT (persons)-->(zhangsan)
RETURN persons

3.关系类型匹配,并使用正则表达式

  //在图中匹配张三节点和所有节点的关系类型以F开头的所有关系
MATCH (n)-[r]->()
WHERE n.name='张三' AND type(r)=~ 'F.*'
RETURN r

例11:使用"或"逻辑匹配关系

//返回任意关系为KNOWS和LOVES的所有节点关系
MATCH p=(n)-[:KNOWS|:LOVES]->(m) RETURN p

例12:关系深度匹配
1.匹配从n到m,任意关系,深度1到5的节点

MATCH p=(n)-[*1..5]->(m) RETURN p

2.匹配从n到m,任意关系、任意深度的节点

MATCH p=(n)-[*]->(m) RETURN p

例13:匹配分页返回

MATCH (n) WHERE n.productName='苹果' RETURN n SKIP 10 LIMIT 10

例14:匹配去重返回

MATCH (n) WHERE n.productName='苹果' RETURN DISTINCT n

例15:匹配分组返回值

MATCH (n) WHERE n.productName='苹果' RETURN n ORDER BY n.price DESC

例16:别名返回

MATCH (n) WHERE n.productName=~'.*苹果.*' RETURN n.productName AS name

例17:WITH语句使用使用示例
WITH语句是将第一部分匹配的输出作为下一部分匹配的输入。
1.查找有十个以上朋友的张姓男子

  MATCH (user)-[:FRIEND]-(friend)
WHERE user.name =~ '张.*'
WITH user, count(friend) AS friends
WHERE friends > 10
RETURN user

2.WITH语句中使用ORDER BY、SKIP 和 LIMIT 语句示例。

MATCH (user)-[:FRIEND]-(friend)
WITH user, count(friend) AS friends
ORDER BY friends DESC
SKIP 1
LIMIT 3
RETURN user

例17:UNION语句使用使用示例
1.使用UNION结果去重,求并集

  MATCH (a)-[:KNOWS]->(b)
RETURN b.name
UNION
MATCH (a)-[:LOVES]->(b)
RETURN b.name

2.使用UNION ALL结果不去重, 求和集

  MATCH (a)-[:KNOWS]->(b)
RETURN b.name
UNION ALL
MATCH (a)-[:LOVES]->(b)
RETURN b.name

例17:start语句匹配节点信息
1.匹配所有节点

  START n=node(*) RETURN n

2.根据节点的具体id匹配

  //在node函数中的值,是节点在图中的id
START n=node(1) RETURN n

3.节点更新和删除

例1:更新和添加一个属性

  //1.创建一个节点,只有一个属性name='张三'
CREATE ({name:'张三'}) //2.给创建的"张三"节点,添加一个属性age=20,修改name属性值为"李四"
MATCH (n {name:'张三'})
SET n.name='李四'
SET n.age=20
RETURN n

例2: 修改节点信息,覆盖节点属性

  //该语句会直接删除掉name属性,新增age属性
MATCH (n {name:'张三'})
SET n={age:20}

例3:修改节点信息,新增节点属性

  //该语句不会删除掉name属性,而是在节点中新增age属性
MATCH (n {name:'张三'}) SET n += {age:20} RETURN n

例4:删除节点属性

  MATCH (n{name:'张三'}) remove n.age RETURN n

例5:为节点添加新标签

  //添加一个标签
MATCH (n{name:'张三'}) SET n:Person RETURN n
//添加多个标签
MATCH (n{name:'张三'}) SET n:Person:Student RETURN n

例6:删除节点标签

  MATCH (n{name:'张三'}) REMOVE n:Person RETURN n

例7:为已经存在的两个节点添加关系


MATCH (a:Person {name: "张三"}),
(b:Person {name: "李四"})
MERGE (a)-[r:FRIENDS]->(b)

例8:匹配一个节点,更新属性如果属性不存在则创建该属性

MERGE (n:Person {name: "张三"})
ON CREATE SET n.created = timestamp()
ON MATCH SET
n.counter = coalesce(n.counter, 0) + 1,
n.accessTime = timestamp()

例9:匹配一个节点为他创建一个新的关系

  //如果没有"王五"节点则创建一个新的
MATCH (a:Person {name: "张三"})
MERGE
(a)-[r:KNOWS]->(b:Person {name: "王五"})

例10:删除一个节和关系

  MATCH (a)-[r:KNOWS]->(b) DELETE r,b

例11:级联删除

  //删除"王五"节点之后,将与王五节点建立关系也删除掉
MATCH (n{name: "王五"}) DETACH DELETE n

4.索引和约束

例1:创建索引

  //为"Person"标签的name属性创建索引
CREATE INDEX ON :Person(name)

例2:删除索引

  //删除"Person"标签的name属性的索引
DROP INDEX ON :Person(name)

例3:匹配条件中使用索引

MATCH (n:Person)
WHERE n.name = 'Andres'
RETURN n

例4:创建节点属性唯一约束
创建一个唯一约束保证图数据库中同一个标签内的节点的属性值不重复。
注意:不可以为已经创建索引的属性创建唯一约束

  CREATE CONSTRAINT ON (n:Person) ASSERT n.name IS UNIQUE

例5:创建节点属性唯一约束

  DROP CONSTRAINT ON (n:Person) ASSERT n.name IS UNIQUE

作者:cooze
链接:https://www.jianshu.com/p/2bb98c81d8ee
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

Neo4j之Cypher学习总结的更多相关文章

  1. neo4j初次使用学习简单操作-cypher语言使用

    Neo4j 使用cypher语言进行操作 Cypher语言是在学习Neo4j时用到数据库操作语言(DML),涵盖对图数据的增删改查  neo4j数据库简单除暴理解的概念: Neo4j中不存在表的概念, ...

  2. Neo4j/cypher学习笔记与学习建议

    简介 本笔记的主要内容是 cypher 查询语言的编写与使用. 笔记主要整理自w3cschool上的neo4j教程以及Neo4j中文网所提供的cypher中文文档,此外还包括少量从其他个人博客与官方手 ...

  3. Neo4j使用Cypher查询图形数据

    Neo4j使用Cypher查询图形数据,Cypher是描述性的图形查询语言,语法简单,功能强大,由于Neo4j在图形数据库家族中处于绝对领先的地位,拥有众多的用户基数,使得Cypher成为图形查询语言 ...

  4. neo4j使用cypher查询路径避免出现环路

    neo4j在使用可变长路径找两个点之前的所有路径时,会返回包含环路的路径(一个点在路径中出现两次),如下面的语句: MATCH path = (x)-[:KNOWS*]-(y) 可能返回a->b ...

  5. neo4j中cypher语句多个模糊查询

    总结一下经验: neo4j中,cypher语句的模糊查询,好像是个正则表达式结构. 对于一个属性的多个模糊查询,可以使用如下写法: 比如,查询N类型中,属性attr包含'a1'或者'a2'的所有节点. ...

  6. Neo4j 使用cypher语言进行查询

    Neo4j是一个Java开发的图数据库,它将结构化数据存储在网络(从数学角度叫做图)上而不是表中.相对于关系数据库来说,图数据库善于处理大量复杂.互连接.低结构化的数据,这些数据变化迅速,需要频繁的查 ...

  7. (六)图数据neo4j之cypher(一)

    1.Cypher概述 cypher是一种声明式的图数据库查询语言,能高效的查询和更新图数据库,是依赖于模式的.所谓模式(Patterns)是就是众多节点和关系的任意复杂想法. (1)节点语法 cyph ...

  8. neo4j常用cypher语句

    阅读更多 1.删除带有关系的节点   a.先删除关系 match (n:Node)-[r:关系名称]-() where (n...条件) delete r   b.删除节点 match (n:Node ...

  9. Neo4j学习案例【转】

    转自 打怪的蚂蚁 CSDN: https://blog.csdn.net/xgjianstart/article/details/77285334 neo4j有社区版本和企业版.社区版本是免费的,只支 ...

随机推荐

  1. How to reset XiaoMi bluetooth headphone Youth edition.

    To reset the speaker 1. Long press the phone call button to shut off the speaker 2. Connect the char ...

  2. python作业员工信息表程序(第四周)

    作业需求: 1. 员工信息表程序,实现增删改查操作: 2. 可进行模糊查询,语法至少支持下面3种: select name,age from staff_table where age > 22 ...

  3. Wireshark过滤语句中常用的操作符

    关键字有: eq,== 等于ne,!= 不等于gt,> 比…大lt,< 比…小 ge,>= 大于等于le,<= 小于等于 and,|| 且 or,&& 或 no ...

  4. linux脚本学习之路-在suse10环境中生存指定大小指定文件名的压缩文件

    #!/bin/bash#-------------------------------------------------------------------------------# Name:   ...

  5. jquery ajax的再次封装,简化操作

    1.封装的ajax var funUrl=""   // 每个请求地址相同的部分 function queryData(url,params,success,error){ url ...

  6. Tutorial 3: Class-based Views

    转载自:http://www.django-rest-framework.org/tutorial/3-class-based-views/ Tutorial 3: Class-based Views ...

  7. 手游研发CJ抱大腿指南

    文摘要:CJ来了,又是一年一度的游戏圈盛事,随着手游行业的迅速崛起,今年CJ上,手游研发商以及发行商必定成为焦点.由于门槛低.市场热.前景好等因素的影响,国内一下子蹦出一大堆手游研发团队.很幸运(或者 ...

  8. 【转】Python OCR识别图片验证码

    转载自:博客 对于某些网站登录的时候,往往需要输入验证码才能实现登录.如果要爬虫这类网站,往往总会比这个验证码导致无法爬取数据.以下介绍一种比较折中的方法,也是比较可行的方法: 实现思想: 1.通过截 ...

  9. 搜索关键词智能提示suggestion

    转载自:stormbjm的专栏 题目详情:百度搜索框中,输入“北京”,搜索框下面会以北京为前缀,展示“北京爱情故事”.“北京公交”.“北京医院”等等搜索词,输入“结构之”,会提示“结构之法”,“结构之 ...

  10. Vue进阶篇

    前引 今天是2018年12月30,虽不是2018年的最后一天,但是却是自己在2018年写的最后一篇博客了,昨天下班在地铁上闲来无事,翻起了关注的一些公众号发的技术博文,里面就提到写博客的重要性,其实这 ...