数据查询与更新
原创大约 4 分钟
注意
为了演示方便,所以才在之前/后的节点
和关系
中使用了中文,在生产环境下还是建议用英文或拼音。
二度关系
在之前的操作中已经用过match
来删除数据,但其实它真正的作用是查询已有的节点
或关系
,类似于MySQL中的SELECT
。
先还原之前的贵圈
关系数据。
查询女星1
这个节点
。
> match (a:Actor {name:"女星1"}) return a
查询女星3
的旧爱
信息。
# 可以这样写(有没有 f3 都不影响结果)
> match (f3:Actor {name:"女星3"}) <-[:旧爱]- (n:Actor) return n
> match (:Actor {name:"女星3"}) <-[:旧爱]- (n:Actor) return n
# 或者这样写
> match (n:Actor) -[:旧爱]-> (f3:Actor {name:"女星3"}) return n
> match (n:Actor) -[:旧爱]-> (:Actor {name:"女星3"}) return n
# 只返回name值
> match (n:Actor) -[:旧爱]-> (:Actor {name:"女星3"}) return n.name
对于女星3
的所有旧爱
们来说,它们之间就是二度关系
(虽然它们彼此之间可能不知道对方的存在)。
比较直观的解释是下面这样的。
X -[关注]-> 主播 <-[关注]- Y
。X
和Y
就是二度关系
。
┌-------- 二度关系 --------┐
| |
X -[关注]-> 主播 <-[关注]- Y
三度关系
三度关系
是二度关系
的升级版,它是这样的。
X -[关注]-> 主播A <-[关注]- Y -[关注]-> 主播B
。X
和主播B
就是三度关系
。
┌--------------- 三度关系 --------------┐
| |
X -[关注]-> 主播A <-[关注]- Y -[关注]-> 主播B
| |
└-------- 二度关系 --------┘
可以这样来理解贵圈
的三度关系
:X -[旧爱]-> 女星A <-[旧爱]- Y -[旧爱]-> 女星B
,就是找到X
和女星B
。
查询贵圈
的三度关系
。
> match (a:Actor {name:"女星3"}) <-[:旧爱]- (b:Actor) -[:旧爱]-> (c:Actor) return a, b, c
# 或者只显示名字
> match (a:Actor {name:"女星3"}) <-[:旧爱]- (b:Actor) -[:旧爱]-> (c:Actor) return a.name, b.name, c.name
三度关系
的查询结果如下。

结果说明,对于同为女星3
的旧爱
的男星5/6/7
,它们的三度关系
就是女星4
。
但是这样结果还是不够直观,删除所有数据,重新初始化Neo4j。
# 清除所有数据
> match (n) detach delete n
# 再输入新的数据
> merge(a:User {name:"A"})
merge(b:User {name:"B"})
merge(c:User {name:"C"})
merge(d:User {name:"D"})
merge(e:User {name:"E"})
merge(f:User {name:"F"})
merge(a) -[:follow]-> (b)
merge(c) -[:follow]-> (b)
merge(a) -[:follow]-> (d)
merge(a) -[:follow]-> (e)
merge(c) -[:follow]-> (e)
merge(c) -[:follow]-> (f)
现在用的是正经的社交follow
数据。

重新查询社交三度关系
。
> match (a:User {name:"B"}) <-[:follow]- (b:User) -[:follow]-> (c:User) return a.name as 主播B, b.name as 主播B的粉丝, c.name as 粉丝关注的新主播
查询结果显示,关注主播B
的粉丝,有两个都关注了主播E
——这正是三度关系
对于社交应用的意义之所在——当有新的粉丝关注了主播B
后,主播E
被平台推荐的可能性会很大。

Neo4j在查询数据时,也可以实现简单的过滤、排序等命令。
# 统计关注主播E的人数,并按倒序排序,再取前3条
> match (a:User {name:"B"}) <-[:follow]- (b:User) -[:follow]-> (c:User) return a.name as 主播B, c.name as 粉丝关注的新主播, count(*) as sum order by sum desc limit 3
同样,也可以给查询添加where
条件。
> match (a:User {name:"B"}) <-[:follow]- (b:User) -[:follow]-> (c:User) where c.name <> "D" return a.name as 主播B, b.name as 主播B的粉丝, c.name as 粉丝关注的新主播
更新数据
更新数据包括更新节点
和更新关系
。
更新
节点
数据使用match + set
的组合。更新
关系
数据使用match + delete
的组合(它也可以用来删除节点
)。
修改节点
中的属性
。
# 无则增加,有则更新
> match (a:User {name:"A"}) set a.age = 20
其实之前已经操作过关系的删除
,再来操作一遍。
> match (:User {name:"A"}) -[n:follow]-> (:User {name:"B"}) delete n
感谢支持
更多内容,请移步《超级个体》。