Cypher入门

ops/2025/2/3 21:37:39/

文章目录

  • Cypher入门
    • 创建数据
    • 查询数据
      • match
      • optional match
      • where
      • 分页
      • with
    • 更新数据
    • 删除数据
    • 实例:好友推荐

Cypher入门

  • Cypher是Neo4j的查询语言。

创建数据

  • 在Neo4j中使用create命令创建节点、关系、属性数据。
sql">create (n {name:$value}) return n //创建节点,节点的属性是name,n为该节点的变量,创建完成后返回该节点

在这里插入图片描述

sql">create (n:$Tag {name:$value}) //创建节点,指定标签

在这里插入图片描述

sql">create (n)-[r:knows{name:$value}]->(m) //创建n指向m的关系,并且指定关系类型为:KNOWS

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

查询数据

match

sql">[match where] //条件查询
[option match where] //选择查询,查询不到使用null代替
[with [order by] [skip] [limit]] //查询的结果以管道的方式传递给下面的语句,聚合查询必须使用with
return [order by] [skip] [limit] //返回、排序、跳过、返回个数
  • MATCH 语句通过模式(Patter)来检家数据库。它常与带有约束或者断言的 WHERE语句一起使用,这使得匹配的模式更具体。断言是模式描述的一部分,不能看作是匹配结果的过滤器
  • MATCH 可以出现在查询的开始或者末尾,也可能位于 WITH 之后。如果它在语句开头,此时不会绑定任何数据。Neo4j将设计一个搜索去找到匹配这个语句以及 WHERE 中指定断言的结果。这将牵涉数据库的扫描,搜索特定标签的节点或者搜索一个索引以找到匹配模式的开始点,这个搜索找到的节点和关系可作为一个“绑定模式元素(Bound Patter Elements)”。它可以用于匹配一些子图的模式,也可以用于任何进一步的 MATCH 语句,
  • Neo4j 将使用这些已知的元系来找到更进一步的未知元素。
  • Cypher 是声明式的,因此查询本身不指定搜家的算法。Neo4i会自动地用最好的方法去找到开始节点和匹配模式。WHERE 中的断言可以在模式匹配之前、匹配中或者匹配后进行处理。这可以通过查询编译器来影响这个决定。

  • 创建查询语句需要的数据
    sql">create (n:User {name:"张宇"})
    create (n)-[:sing]->(:Song {title:"月亮惹的祸"})
    create (n)-[:sing]->(:Song {title:"雨一直下"})
    create (n)-[:sing]->(:Song {title:"大女人"})
    create (n)-[:love]->(:User {name:"十一郎"})
    
  • 查询所有节点
    sql">match (n) return n
    

在这里插入图片描述

  • 查询所有User节点
    sql">match (n:User) return n
    

在这里插入图片描述

  • 查询所有与“张宇”有关系的节点
    sql">match (n:User{name:"张宇"})--(m) return n,m
    

在这里插入图片描述

  • 查询所有与张宇演唱的歌曲
    sql">match (n:User {name:"张宇"})-->(m:Song) return n,m
    

在这里插入图片描述

  • 将查询赋值与变量
    sql">match p=(n:User {name:"张宇"})-->(m:Song) return p
    

在这里插入图片描述

  • 查询张宇与月亮惹的祸之间的关系
    sql">match (n:User {name:"张宇"})-[r]->(m:Song {title:"月亮惹的祸"}) return type(r)
    

在这里插入图片描述

  • 指定关系标签查询
    sql">match (n:User {name:"张宇"})-[:sing]->(m) return n,m
    

在这里插入图片描述

  • 指定多种关系标签查询
    sql">match(n:User {name:"张宇"})-[:sing|:love]-> (m) return n,m
    

在这里插入图片描述

  • 在关系查询中指定关系的深度-[:TYPE*minHops..maxHops]->
    sql">//查询有1~2层关系的节点
    match (n:Person {name:"Keanu Reeves"}) -[r:ACTED_IN*1..2]-(m) return n,m,r
    //查询有2层关系的节点
    match (n:Person {name:"Keanu Reeves"}) -[r:ACTED_IN*2]-(m) return n,m,r
    

在这里插入图片描述
在这里插入图片描述

  • 查询两个节点之间的深度为1~10的路径
    sql">match (n:Person {name:"Keanu Reeves"}),(m:Person {name:"Danny DeVito"}),p = shortestPath((n)-[*1..10]-(m)) return p
    

在这里插入图片描述

  • 查询两个节点之间最短的路径
    sql">match (n:Person {name:"Keanu Reeves"}),(m:Person {name:"Danny DeVito"}),p = shortestPath((n)-[*]-(m)) return p
    

在这里插入图片描述

optional match

  • OPTINAL MATCH 匹配模式,如果没有匹配到,OPTINAL MATCH 将用 null 作为未匹配到部分的值。OPTINAL MATCH 在 Cypher 中类似SQL 语句中的 outer join。要么匹配整个模式,要么都未匹配。
  • WHERE 是模式描述的一部分,匹配的时候就会考虑到 WHERE 语句中的断言,而不是匹配之后。这对于有多个(OPTINAL)MATCH 语句的查询尤其重要,一定要将属于 MATCH 的 WHERE 语句与 MATCH 放在一起。
    sql">optional match (n:User {name:"张宇"})--(m:User {name:"十一郎"}) return n,m
    

在这里插入图片描述
在这里插入图片描述

where

  • WHERE 在 MATCH 或者 OPTINAL MATCH 语句中添加约束,或者与 WITH 一起使用来过滤结果。
  • WHERE 不能单独使用,它只能作为 MATCH、 OPTINAL MATCH、 START 和 WITH 的一部分。如果是在 WITH 和 START 中,它用于过滤结果。对于 MATCH 和 OPTINALMATCE, WHERE 为模式增加约束,它不能看作是匹配完成后的结果过滤。
  • 设置属性条件
    sql">match (n:Song) where n.title='雨一直下' return n
    

在这里插入图片描述

  • 设置布尔条件
    sql">match (n:Song) where n.title='雨一直下' or n.title='大女人' return n
    

在这里插入图片描述

  • 关系属性过滤
    sql">match (n:Person) -[r:ACTED_IN]-> (m:Movie) where r.roles=['Neo'] return n,r,m 
    

在这里插入图片描述

  • 属性以xxx开头、包含xxx
    sql">match (n:Person) where n.name starts with 'K' return n
    

在这里插入图片描述

sql">match (n:Person) where n.name contains 'un' return n

在这里插入图片描述

  • 属性比较
    sql">match (n:Person) where n.born >1980 return n
    match (n:Person) where n.born>1970 and n.born >1990 return n
    

在这里插入图片描述
在这里插入图片描述

分页

  • 在Neo4j中进行分页查询,可以使用SKIP和LIMIT子句
    sql">MATCH (p:Person)
    RETURN p.name
    ORDER BY p.name
    SKIP $skip
    LIMIT $limit
    
  • SKIP用于跳过指定的记录数,通常你根据页码计算这个值。例如,如果每页显示10条记录,第二页的skip值为10,第三页的skip值为20,以此类推。
  • LIMIT用于限制查询结果的数量,即每页要显示的记录数。
    sql">match (n:Person) return n order by n.born desc skip 5 limit 10
    

在这里插入图片描述

sql">match (n:Person) with n order by n.born desc limit 10 return n

在这里插入图片描述

with

  • WITH 语句将分段的查询部分连接在一起,查询结果从一部分以管道形式传递给另外一部分作为开始点。
  • 使用 WITH 可以在将结果传递到后续查询之前对结果进行操作。操作可以是改变结果的形式或者数量。WITH 的一个常见用法就是限制传递给其他 MATCH 语句的结果数。通过结合 ORDER BY 和 LIMIT,可获取排在前面的x个结果。
sql">match (n:Person {name:"Keanu Reeves"}) --(m:Movie)
with m,n limit 3
match (m)--(k)
return k,m,n 

在这里插入图片描述

更新数据

  • 更新数据是使用set语句进行标签、属性更新。set操作是等幂性的。
sql">match (n:User {name:"张宇"})
set n.age=40
return n

在这里插入图片描述

  • 所有User节点年龄增加1
    sql">match (n:User) set n.age=n.age+1
    

在这里插入图片描述

  • 通过set增加标签
    sql">match (n:User) set n:User2 return n 
    

在这里插入图片描述

  • 通过remove移除标签
sql">match (n:User) remove n:User2 return n

在这里插入图片描述

sql">match (n:User) remove n.age return n
  • 没有age属性设置age=20
sql">match (n:User) where n.age is null set n.age=20 return n

在这里插入图片描述

删除数据

  • 删除数据通过delete、detach delete完成。其中delete不能删除有关系的节点,删除关系就需要detach delete
  • 删除User标签下的所有数据
    sql">match (n:User) detach delete n
    
  • 删除单个节点 无法删除有关系的节点
    sql">match (n:User {name:"张宇"}) delete n
    
  • 删除节点和关系,只适用于少量数据
    sql">match (n:User {name:"张宇"}) detach delete n
    
  • 删除所有节点(谨慎使用)
    sql">match (n) detach delete n
    

实例:好友推荐

  • 在社交网站中常常会有这样的功能,”你可能认识的人〞。图数据库是非常适合这样的场景的,接下来我们就尝试着使用Neo4j实现简化版的好友推荐。
sql">CREATE (u1:User {name: "郭靖"})
CREATE (u2:User {name: "令狐冲"})
CREATE (u3:User {name: "岳不群"})
CREATE (u4:User {name: "左冷禅"})
CREATE (u5:User {name: "东方不败"})
CREATE (u6:User {name: "风清扬"})
CREATE (u7:User {name: "张无忌"})
CREATE (u8:User {name: "谢逊"})
CREATE (u9:User {name: "杨道"})
CREATE (u10:User {name: "乔峰"})CREATE
(u1)-[:FRIEND_OF]->(u2),
(u1)-[:FRIEND_OF]->(u3),
(u2)-[:FRIEND_OF]->(u4),
(u2)-[:FRIEND_OF]->(u5),
(u3)-[:FRIEND_OF]->(u6),
(u3)-[:FRIEND_OF]->(u7),
(u5)-[:FRIEND_OF]->(u8),
(u8)-[:FRIEND_OF]->(u9),
(u3)-[:FRIEND_OF]->(u10)

在这里插入图片描述

sql">match (n:User) return n

在这里插入图片描述

  • 查询郭靖好友
sql">match (n:User {name:"郭靖"}) -[:FRIEND_OF]->(m) return *

在这里插入图片描述

  • 查询郭靖好友关系为2~3层的用户
sql">match (n:User {name:"郭靖"}) -[:FRIEND_OF*2..3]->(m) return m 

在这里插入图片描述

  • 郭靖要想和杨道认识,最短的路径是什么?
sql">match (u:User {name:"郭靖"}),(m:User {name:"杨道"}),
p=shortestPath((u)-[*]-(m))
return p

在这里插入图片描述


http://www.ppmy.cn/ops/155399.html

相关文章

Redis 基础命令

1. redis 命令官网 https://redis.io/docs/latest/commands/ 2. 在 redis-cli 中使用 help 命令 # 查看 help string 基础命令 keys * # * 代表通配符set key value # 设置键值对del key # 删除键expire key 时间 # 给键设置时间 # -2 代表时间到期了, -1 代表…

人工智能丨基于机器学习的视觉 CV 处理技术

从自动驾驶汽车到面部识别系统,CV无处不在,赋予计算机“看”的能力。无论是图像处理、模式识别,还是视频分析,机器学习都是推动这些技术进步的核心动力。这篇文章将深入探讨基于机器学习的计算机视觉处理技术,包括它的…

Python的那些事第九篇:从单继承到多继承的奇妙之旅

Python 继承:从单继承到多继承的奇妙之旅 目录 Python 继承:从单继承到多继承的奇妙之旅 一、引言 二、继承的概念与语法 三、单继承 四、多继承 五、综合代码示例 六、总结 一、引言 在编程的世界里,继承就像是一场神奇的魔法&#…

在CentOS服务器上部署DeepSeek R1

在CentOS服务器上部署DeepSeek R1,并通过公网IP与其进行对话,可以按照以下步骤操作: 一、环境准备 系统要求: CentOS 8+(需支持AVX512指令集)。 硬件配置: GPU版本:NVIDIA驱动520+,CUDA 11.8+。 CPU版本:至少16核处理器,64GB内存。 存储空间:原始模型需要30GB,量…

第27篇:Python开发进阶:python多线程与多进程编程

第27篇:多线程与多进程编程 目录 并发编程概述 什么是并发编程多线程与多进程的区别 多线程编程 线程的基本概念创建和管理线程线程同步与锁 多进程编程 进程的基本概念创建和管理进程进程间通信 线程与进程的比较全局解释器锁(GIL) GIL的影…

【Vite + Vue + Ts 项目三个 tsconfig 文件】

Vite Vue Ts 项目三个 tsconfig 文件 为什么 Vite Vue Ts 项目会有三个 tsconfig 文件?首先我们先了解什么是 tsconfig.json ? 为什么 Vite Vue Ts 项目会有三个 tsconfig 文件? 在使用 Vite 创建 vue-ts 模板的项目时,会发现除了 ts…

读取要素类中的几何信息

在arcpy中,每个要素都有相关的集合对象,都可以在游标中访问.本节将使用SearchCursor和Polyon对象来读取面要素类几何信息. 操作方法 1.打开IDLE,新建一个脚本 2.导入arcpy模块 3.设置输入要素类为目标面要素类 infc "<>" 4.传入输入要素类创建SearchCurs…

npx和npm 和pnpm的区别

概念与功能 npx&#xff1a;npx 并不是一个包管理器&#xff0c;而是 npm&#xff08;Node Package Manager&#xff09;的一个工具&#xff0c;用于临时执行 npm 包中的命令&#xff0c;而无需全局安装该包。比如你想临时使用某个脚手架工具创建一个项目&#xff0c;就可以直接…