Cypher语法

本文详细介绍了Cypher语言的基础结构,包括路径操作、列表与推导、操作符、函数应用,以及常用的创建节点、查询语句、更新和删除等。涵盖了关系匹配、类型转换、索引和约束等内容,适合深入理解图数据库查询实践。
摘要由CSDN通过智能技术生成

Cypher语法

path = (:Person)-[:ACTED_IN]->(:Movie)
path是结果集的抽象封装,有多个函数可以直接重path里面提取数据
nodes(path):提取所有的节点
rels(path):提取所有的关系和relationships(path)相等
length(path):获取路径长度
list与list推导式
return range(1,10,2);
return range(1,10,2)[-1];
return range(1,10)[1..2]; // 类似切片,半闭半开区间
return range(1,10)[..2];
return [i in range(0,10,2) where i%2=0 | i+1] as result    // where实现过滤,表达式执行映射
操作符
Cypher中的操作符有三个不同种类:数学,相等和关系。

数学操作符有: +,-,*,/和%。
字符运算符: +, =~
列表运算符: +, in
布尔运算符: and, or, xor, not
比较运算符有=,<>,<,>,<=,>=, is null, is not null。
函数
  • 字符串函数
    lower()小写, upper() 大写, usbstring() 截取字符串, replace()替换, split()切割, size()大小, reverse()颠倒

  • 联合函数
    count(*)个数, max()最大值, min()最小值, sum()总和, avg()平均值

  • 关系函数
    startnode() endnode()

  • 特殊字符 ?和!
    ?= 没有成立条件返回True
    != 没有成立条件返回False

  • 正则表达式
    =~ .*(匹配)

  • case 表达式 等同于 if else 语句

match (city) return 
    case 
    	city.province 
        when '湖北' 
        	then city.name
        else 
        	city.province +'-' + city.name
    end 
    as result
  • 类型转化函数
    toInt,toFloat, toString, 转化类型失败返回结果为null

关系语句

使用一对短横线表示无方向关系, 有方向加箭头:
-[role]-
-[:ACTED_IN]->
-[role:ACTED_IN]->

常用语句

1.创建节点语句
  • 创建节点并给节点分配一个属性

    CREATE (n{name:“Owern”})

  • 创建节点并且分配属性和标签

    create (n:Person{name:“李四”})

  • 创建一个关系,给两个节点建立关系指定关系类型,方向和绑定一个变量
    CREATE (n{name:“张三”}) - [r:FRIEND]->({bookname:“Cypher”})

  • 批量创建节点并分配属性

    unwind [{name:“张三”},{name:“李四”}] AS mynodes create(n) set n=mynodes

  • 创建两个节点同时创建一个关系,给两个节点建立关系指定关系类型,方向和属性
    create ({name:“李四”})-[:loves{since:“2017”}]->({name:“小花”})

  • 给已经存在的两个节点创建关系
    match (a.Person),(b.:Person) where a.name=“张三” and b.name=“李四” create (a)-[r:FRIEND]->(b) return r

  1. 查询语句
  • 根据属性匹配节点信息

    match (n{name:“张三”}) return n

  • 根据标签和属性匹配节点信息

    math (n:Person{name:“李四”}) return n

  • 任意匹配 匹配任意节点并返回

    match (n) return n

  • 匹配任意关系的两个节点

    match p=(n)-[r]->(m) return p

  • 可选匹配 结果集中有丢失的部分 会用null来补充

    optional match (n)-[r]->(m) return m

  • 匹配节点时指定标签属性和关系类型

    match (n:Person)-[:FRIEND]->(m:Person) where n.name=“张三”

  • 根据标签过滤

    match (n) where n:Person return n

  • 根据节点属性过滤

    match (n) where n.name=“小花” return n

  • 根据关系过滤属性

    match (n)-[k:Knows]->(f) where k.since < 2000 return n, f

字符串匹配
  • 匹配字符串的开头

    match (n) where n.name starts with “张” return n

  • 匹配字符串结尾

    match (n) where n.name ends with “三” return n

  • 匹配字符串包含

    match (n) where n.name contains “三” return n

  • 排除字符

    match (n) where not n.name contains “张” return n

字符串正则匹配
  • 模糊匹配 类似sql语句中的like(等同于 like ‘%小%’)

    match (n) where n.name=~‘.小.’ return n

  • 不区分大小写正则匹配

    match(n) where n.name=~‘(?i)ANSR.*’ return n

where句子中使用路径匹配
  • 在图中匹配名称为李四或王五与张三有任何关系的节点, 并返回符合匹配条件的节点信息

    math (n{name:“张三”}), (m) where m.name IN [“李四”, “王五”] and n<-(m) return m

  • 匹配和张三没有关系的人(NOT)

    match §,(n{name:“张三”}) where NOT §->(n) return p

  • 匹配张三节点和所有关系类型以F开头的所有关系

    match (n)-[r]->() where n.name=“张三” and type® =~‘F.*’ return n

  • 匹配任意关系为Knows 和 loves 的所有节点关系

    match p=(n)-[:Knows|:loves]->(m) return p

关系深度匹配
  • 匹配从 n 到 m 任意关系 深度1-5的节点

    match p=(n)-[*1…5]->(m) return p

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

    match p=(n)-[*]->(m) return p

匹配分页返回

​ match (n) where n.name=‘张三’ return n skip 10 limit 10

匹配返回去重

​ match n) where n.name=‘张三’ return distinct n

匹配返回值排序

​ match (n) where n.name=‘张三’ return distinct n order by n.price DESC

别名返回

​ match n) where n.name=‘张三’ return n.username as name

with 语句使用 是将第一部分的匹配的输出作为下一部分的输入
  • 查找10个朋友以上的张姓男子

    match §-[:Friend]->[f] where p.name=~“张.*” with p, count(f) as f where f> 10 return p

union 结果去重 求并集

​ match (a)-[:Knows]->(b) return b.name union match (a)-[:loves]->(b) return b.name

union all 结果不去重, 求合集

​ match (a)-[:Knows]->(b) return b.name union all match (a)-[:loves]->(b) return b.name

start 语句匹配节点信息
  • 匹配所有节点

    start n=node(*) return n

  • 根据节点的具体id匹配

    start n=node(1) return n

节点更新和删除
更新节点信息, 删除name属性 新增age属性

​ match (n{name:“张三”}) set n={age:23}

新增节点age属性

​ match (n{name:“张三”}) set n+={age:23} return n

添加一个标签

​ match (n{name:“张三”}) set n:Person return n

添加多个标签

​ match (n{name:“张三”}) set n:Person:Student return n

删除标签

​ match (n{name:“张三”}) remove n:Person return n

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

​ match(a:Person{name:“张三”}), (b.Person{name:“李四”}) merge (a)-[r:FRIEND]->(b)

匹配一个节点,更新属性如果属性不存在 创建属性

​ merge (a:Person(name:“张三”)) on create set n.create =timestamp() on match set n.count =coalesce(n.counter, 0) + 1, n.accessTime =timestamp()

删除节点age属性

​ match (n{name:“张三”}) remove n.age return n

删除一个节点间关系

​ match (a)-[r:Knows]->(b) delete r,b

匹配一个节点为它创建一个新的关系

​ match (a.Person{name:“张三”}) merge (a)-[r:Knows]->(b:Person(name:“王五”))

级联删除

​ match (n{name:“王五”}) detach delete n

索引和约束
创建索引

​ crate index on:Person(name)

删除索引

​ drop index on:Person(name)

匹配条件中使用索引

​ match (n:Person) where n.name =“张三” return n

创建节点属性唯一约束, 不可以为已经创建索引的属性创建唯一约束

​ create constraint on (n:Person) assert n.name is unique

删除节点属性唯一约束

​ drop constaint on(n:Pserson) Assert n.name is unique

查询索引中属性名为”some_value”的关系

​ START r=relationship:rels(property =“some_value”) RETURN r

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值