Cypher 笔记
阅读原文时间:2023年07月08日阅读:3
// 创建节点
CREATE (n:MOVIE{name:"电影"})


// 创建节点
create (n:Test)
set n.name="Test"


// 创建关系
MATCH (cust:Customer),(cc:CreditCard)
WHERE cust.id = "1001" AND cc.id= "5001"
CREATE (cust)-[r:DO_SHOPPING_WITH{shopdate:"12/12/2014",price:55000}]->(cc)
RETURN r


// 删除节点
MATCH (cc: CreditCard)-[rel]-(c:Customer)
DELETE cc,c,rel


// 批量删除label的属性
MATCH (book { id:122 })
REMOVE book.price
RETURN book


// 删除单个节点的属性
match (n:Book{title:"kg"}) remove n.pages


// 删除多个属性
match (n:Book{title:"Neo4j Tutorial2"}) remove n.pages, n.price


// 增加/更新 某个节点的属性值
MATCH (n:Book{title:"kg"}) set n.test2="test" return n


// 批量增加属性
MATCH (dc:Book)
SET dc.testss = 3456


// 排序
MATCH (dc:Book)
return dc
order by dc.id desc


// UNION ALL 返回包含重复结果的行
// UNION 返回公共结果,不返回重复的行
// 类名和数据类型要相同,(只需要as后的列名相同)
match (n:Movie) where n.id<=2  return n.id as id, n.price as price
union
match(m:Movie) where m.id>2 return m.id as price, m.price as id


// create 会创建重复的行(如果记录存在,就创建一个同样的节点)
// merge 不会添加重复的行(如果记录已存在就不添加)
MERGE (gp2:GoogleProfile2{ Id: 201402,Name:"Nokia"})


// 遍历列表
unwind [1,2,3,4] as b
return b


// 使用with
with [1,2,3,4] as a
unwind a as b
return b


// 去重后输出
with [1,2,3,3,3] as list
unwind list as item
with distinct item
return item


// 遍历列表
with [1,2] as a , [3,4] as b
unwind (a + b) as c
return c


// 遍历列表(只能解包一层)
with [1,2,[7,8]] as a, [3,4] as b
unwind (a + b) as c
return c


// 解两层
with [1,2,[3,4]] as nest
unwind nest as hidden
unwind hidden as out
return out


// limit 限制取的结果条数
match (n:Book)
return n.id
limit 2


// 跳过第一个结果
match (n:Book)
return n.id
skip 1


// 跳过第一个,从第二个开始取两条
match (n:Book)
return n.id
skip 1
limit 2


// 创建一个属性全为null的节点
create (n:Movie)


// 判断是否为NULL
match (n:Movie)
where n.price is not null
return n.name


// 判断是否为NULL
match (n:Movie)
where n.price is null
return n.name


// 用IN来判断是否包含
match (n:Movie)
where n.name in ["电影1", '电影2']
return n.name

一种跟在return语句之后的关键字。可以对返回的数据进行判断。比如空值怎么处理

  • 格式1:

    CASE var_name
    WHEN var_value THEN result
    [WHEN var_value2 THEN result2]
    [ELSE default_result]
    END

    match (n:VENUE)
    return CASE n.VENUE_TYPE
    WHEN "" THEN "其他"
    WHEN NULL THEN "NULL"
    ELSE n.VENUE_TYPE END AS VENUE_TYPE, count(n) as COUNT

  • 格式2:

    CASE
    WHEN predicate THEN result
    [WHEN predicate THEN result]
    [ELSE default]
    END
    [AS NEW_NAME]

    match (n:VENUE)
    return CASE
    WHEN n.VENUE_TYPE="" OR n.VENUE_TYPE="" IS NULL THEN "其他"
    ELSE n.VENUE_TYPE END AS VENUE_TYPE, count(n) as COUNT

关系必须有方向,关系可以反着写

// 创建关系(正向)
match (m:Movie), (n:Movie)
where m.name="电影111" and n.name="电影2"
create (m)-[r:R{name:"关系"}]->(n)


// 创建关系(反向)
match (m:Movie), (n:Movie)
where m.name="电影111" and n.name="电影2"
create (m)<-[r:R{name:"关系2"}]-(n)


// 同时指定两个方向会报错
match (m:Movie), (n:Movie)
where m.name="电影111" and n.name="电影2"
create (m)<-[r:R{name:"关系2"}]->(n)


// 没有指定方向也会报错
match (m:Movie), (n:Movie)
where m.name="电影111" and n.name="电影2"
create (m)-[r:R{name:"关系2"}]-(n)


// 查询关系(返回关系不会显示在可视化中)
match (m:Movie)-[r:R]->(n:Movie)
where m.name="电影111" and n.name="电影2"
return r


// 查询关系可以反向(n->m 的关系)
match (m:Movie)<-[r:R]-(n:Movie)
where m.name="电影111" and n.name="电影2"
return r


// 查询关系也可以不写方向(会查到两个方向的关系)
match (m:Movie)-[r:R]-(n:Movie)
where m.name="电影111" and n.name="电影2"
return r


// 多跳的关系
match p=(m:Movie{name:"电影2"})-[r]-(n:Movie{name:"电影111"})-[r2]-(t:Movie{name:"电影5"})
return p


// 展开4次,显示路径长度<=4的所有节点和路径。每次都展开相连的所有节点,下一次再继续展开外层的节点
match p=(n:VENUE{OBJ_NAME:"AAA"})-[r*4]-() return p


// 只显示路径长度在[2,3]范围内的路径,太短的路径不会显示(比如长度为1的路径)
match p=(n:FJS{STATION_NAME:"AAA"})-[r*2..3]-() return p


// [1, 2]范围内的路径
match p=(n:FJS{STATION_NAME:"AAA"})-[r*..2]-(m) return p


// 指定长度的路径
match p=(n:FJS{STATION_NAME:"AAA"})-[r2..2]-(m) return p


// 关系可以加上逻辑或操作(|)
match p=(m:SUBSTATION{STATION_NAME:"AAA"})-[r:END_STATION|:PARTNER|:ORIGIN_LINE*2..2]-(n)
return p


match (n:SUBSTATION) where n.SUPPLY_TYPE is not NULL
RETURN n.SUPPLY_TYPE, COUNT(n)

功能

描述

UPPER

它用于将所有字母更改为大写字母

LOWER

它用于将所有字母改为小写字母

SUBSTRING

它用于获取给定String的子字符串SUBSTRING(str,start,end), 截取的范围是[start, end)

REPLACE

它用于替换一个字符串的子字符串

match (n:Movie)
where n.name="AAAbbb"
return UPPER(n.name), upper(n.name), lower(n.name),substring(n.name, 0, 3)


// 替换子串(不会改变原字符串)
match (n:Movie)
where n.name="AAAbbb"
return replace(n.name, "AAA", "CCC")

聚集功能

描述

COUNT

它返回由MATCH命令返回的行数

MAX

它从MATCH命令返回的一组行返回最大值

MIN

它返回由MATCH命令返回的一组行的最小值

SUM

它返回由MATCH命令返回的所有行的求和值

AVG

它返回由MATCH命令返回的所有行的平均值

match (n:Movie)
return max(n.id), min(n.id), avg(n.id), count(n.id)

功能

描述

STARTNODE

它用于知道关系的开始节点

ENDNODE

它用于知道关系的结束节点

ID

它用于知道关系的ID

TYPE

它用于知道字符串表示中的一个关系的TYPE

// 这两个id并不相同,id(n)是系统自动加上的id,n.id是用户加上的id属性。
match (n:Movie)
return id(n), n.id


// 返回关系的类型,不能返回node的类型(会报错)
match (n:Movie)-[r]->(m:Movie)
where n.name="电影111" and m.name="电影2"
return TYPE(r)


match (n:Movie)-[r]->(m:Movie)
where n.name="电影111" and m.name="电影2"
return startnode(r), endnode(r)

CREATE INDEX ON : ()

// 新建索引
CREATE INDEX ON :Customer (name)

DROP INDEX ON : ()

// 删除索引
DROP INDEX ON :Customer (name)

CREATE CONSTRAINT ON ()

ASSERT IS UNIQUE

// 创建索引,如果已有的数据有重复的,那么建立索引会失败。
create constraint on (m:Movie)
assert m.name is unique

DROP CONSTRAINT ON ()

ASSERT IS UNIQUE

// 删除索引
drop constraint on (m:Movie)
assert m.name is unique