Neo4J CQL语句

本文详细介绍了如何在Neo4j数据库中使用Cypher查询语言进行CRUD操作,包括创建、查询、更新和删除节点及关系,以及使用索引、聚合函数和算法(如协同过滤)进行商品推荐。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

新增

创建

含义

# study 实体
# 学生 标签
# name 对应字段

create(study:学生{name:"张三"})
create(study:学生{name:"李四"})
create(study:学生{name:"王五"})
create(study:学生{name:"dsy",age:18})

create(city:城市{name:"西安"})

建立关系

match(n:学生{name:"张三"}),(p:城市{name:"西安"}) create (n)-[:出生于] ->(p)
match(n:学生{name:"李四"}),(p:城市{name:"西安"}) create (n)-[:出生于] ->(p)

match (n:学生{name:"张三"}),(n2:学生{name:"李四"}) create (n)-[:兄弟]->(n2)

Set字句

有时,根据我们的客户端要求,我们需要向现有节点或关系添加新属性(字段)。要做到这一点,Neo4j CQL提 供了一个SET子句。

#学生表添加 城市为西安 的字段
match(n:Student{name:"李四"}) set n.city="西安" return n

查询

查询所有节点

match(n) return n

查询指定条件的数据 where子句

match(n) where n.age = 18 return n

查询指定Label(标签)的数据

match(n:`学生`) return n

查询指定字段名称的数据

match(n{name:'张三'}) return n

查询主节点下所关联的对应子节点

#查询出生于西安的所有Person数据
match(n1:province{name:"西安"})<-[:出生于]-(n2:Person) return n2

order by排序

#根据id进行排序,返回id和name字段
match (n:`学生`) return id(n),n.name order by id(n) asc
match (n:`学生`) return id(n),n.name order by id(n) desc

Union子句

#返回结果去重
match(n:`学生`) return n.name as name union match(n:Student) return n.name as name

#返回结果不去重
match(n:`学生`) return n.name as name union all match(n:Student) return n.name as name

Limit和Skip子句

#前两行
match(n:`学生`) return n.name limit 2

#忽略前两行
match(n:`学生`) return n.name skip 2

NUll值

如tom的age,name,sex都为null

#查询年龄为null的数据
match(n:Student) where n.age is null return id(n),n.name,n.age

IN查询

match(n:Student) where n.name in ["tom","李四"] return id(n),n.name,n.age

INDEX索引

创建索引

create index on :Student (name)

删除索引

drop index on:Student (name)

创建唯一索引

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

删除唯一索引

drop constraint on (n:Student) assert n.name is unique

Distinct

match(n:Student) return distinct(n.name)

删除

delete删除

删除标签下所有数据

create(n:班级{name:"一年级"})
create(n:班级{name:"二年级"})

match(n:`班级`) delete n

如果报错如下,说明节点包含关系

删除节点关系

删除完节点关系就可以删除节点了

match(n:`班级`{name:"一年级"})<-[r]-(m) delete r return type(r)

删除节点子句

match(n:`班级`{name:"一年级"}) delete n

remove删除

有时基于客户端要求,我们需要向现有节点或关系添加或删除属性。我们使用Neo4j CQL REMOVE子句来删除节点或关系的现有属性。

#添加多个节点
create (n:Student{name:"张三",age:18,sex:"男"})
create (n:Student{name:"张三",age:18,sex:"男"}),(b:Student{name:"李四",age:14,sex:"女"})

#删除属性(字段)
match(n:Student{name:"张三"}) remove n.age return n

#删除标签(整条数据)
match(n:Student{name:"张三"}) remove n:Student return n

常用函数

字符串函数

功能

描述

示例

UPPER/toUpper

将所有字母转为大写

match(n:Student) return toUpper(n.name)

LOWER/toLower

将所有字母转为小写

match(n:Student) return tolower(n.name)

SUBSTRING

获取指定截取的字符串

match(n:Student) return SUBSTRING(n.name,0,1)

REPLACE

替换一个字符串(tom改为cs)

match(n:Student) return replace(n.name,'tom','cs')

聚合函数

功能

描述

示例

count

返回行数

match(n:Student) return count(n)

max

返回最大值

match(n:Student) return max(id(n))

min

返回最小值

match(n:Student) return min(id(n))

sum

求和

match(n:Student) return sum(n.age)

avg

平均值

match(n:Student) return avg(n.age)

关系函数

左边为子节点,右边为主节点 比如 Person中的张三出生于province中的西安

功能

描述

示例

startnode

获取关系的开始节点

match(n1:Person)-[r]->(n2:province) return startnode(r)

endnode

获取关系的结束节点

match(n1:Person)-[r]->(n2:province) return endnode(r)

id

获取关系的ID

match(n1:Person)-[r]->(n2:province) return id(r)

type

获取字符串表示中的一个关系的type

match(n1:Person)-[r]->(n2:province) return type(r)

算法推荐商品

create(:商品{id:1,name:"阿莫西林",price:12,stockNum:100})
create(:商品{id:2,name:"小儿七星茶颗粒",price:8,stockNum:100})
create(:商品{id:3,name:"益心舒胶囊",price:8.4,stockNum:100})
create(:商品{id:4,name:"红霉素软膏",price:2.3,stockNum:100})
create(:`商品`{id:5,name:"枸杞",price:2.2,stockNum:100})
create(:`商品`{id:6,name:"桑葚",price:2,stockNum:100})


create(:用户{id:101,name:"张三"})
create(:用户{id:102,name:"李四"})
create(:用户{id:103,name:"王五"})
create(:用户{id:104,name:"TOM"})
create(:用户{id:105,name:"jerry"})

match(n1:`用户`{id:101}),(n2:`商品`{id:1}) create(n1)-[:购买]->(n2)
match(n1:`用户`{id:101}),(n2:`商品`{id:2}) create(n1)-[:购买]->(n2)
match(n1:`用户`{id:101}),(n2:`商品`{id:3}) create(n1)-[:购买]->(n2)
match(n1:`用户`{id:101}),(n2:`商品`{id:4}) create(n1)-[:购买]->(n2)

match(n1:`用户`{id:102}),(n2:`商品`{id:1}) create(n1)-[:购买]->(n2)
match(n1:`用户`{id:102}),(n2:`商品`{id:4}) create(n1)-[:购买]->(n2)
match(n1:`用户`{id:102}),(n2:`商品`{id:5}) create(n1)-[:购买]->(n2)
match(n1:`用户`{id:102}),(n2:`商品`{id:6}) create(n1)-[:购买]->(n2)

match(n1:`用户`{id:103}),(n2:`商品`{id:2}) create(n1)-[:购买]->(n2)
match(n1:`用户`{id:103}),(n2:`商品`{id:3}) create(n1)-[:购买]->(n2)

match(n1:`用户`{id:104}),(n2:`商品`{id:1}) create(n1)-[:购买]->(n2)
match(n1:`用户`{id:104}),(n2:`商品`{id:3}) create(n1)-[:购买]->(n2)

在这个例子中,我们使用协同过滤算法来实现基于用户的商品推荐。具体地,我们找到与目标用户有共同购买行为的其他用户,并返回这些用户最喜欢的、目标用户尚未购买的商品。

可以使用以下 Cypher 查询语句来实现协同过滤算法:

这个查询语句会找到与目标用户 ID 为 101 的用户有共同购买行为的其他用户,并返回他们购买过的、目标用户尚未购买的商品。结果按照共同购买用户数量降序排列,并只返回前 3 个推荐商品。

MATCH (u:`用户` {id: 101})-[:购买]->(p:`商品`)<-[:购买]-(ou:`用户`)-[:购买]->(rec:`商品`)
WHERE NOT EXISTS((u)-[:购买]->(rec))
WITH rec, COUNT(DISTINCT ou) AS similarity
ORDER BY similarity DESC
LIMIT 3
RETURN rec.name, similarity

实现推荐查询:

○ 使用 Cypher 查询语句,根据目标用户 ID 查找该用户已购买的商品。

○ 基于协同过滤算法,使用以上的查询语句查找与目标用户具有相关性的其他商品。

○ 返回推荐结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值