Neo4j图形数据库-Cypher中常用指令

一、创建与修改

1.1 create

  • 创建图数据库中的节点、关系等元素:
python 复制代码
CREATE (:Person {name: "Alice", age: 30})
CREATE (p1:Person {name: "Bob"})-[r:KNOWS]->(p2:Person {name: "Charlie"})
  • 批量创建元素
python 复制代码
CREATE (n1:Node),(n2:Node),(n3:AnotherNode {prop: "value"})

1.2 merge

  • 不存在再创建,如果存在则直接返回已有元素,常用来避免重复创建相同的数据。
    (若数据库中没有 name 为 "David" 的Person 节点,就会创建一个;若已经存在,就返回这个已有的节点,可用于保证特定节点在数据库中的唯一性):
python 复制代码
MERGE (p:Person {name: "David"})
  • 检查公司与员工之间的 WORKS_AT 关系是否存在,不存在就创建:
python 复制代码
MERGE (c:Company {name: "TechCo"})<-[r:WORKS_AT]-(e:Employee {name: "Eve"})

1.3 set

  • 更新节点或关系的现有属性值:
python 复制代码
MATCH (p:Person {name: "Alice"}) 
SET p.age = 35
  • 添加新属性:
python 复制代码
MATCH (p:Person {name: "Bob"}) 
SET p.address = "123 Main St"

二、查询

2.1 match

  • 在图中查找符合特定模式的节点、关系等元素:
python 复制代码
MATCH (p:Person) 
WHERE p.age > 25 
RETURN p
  • 查找带有特定关系的节点:
python 复制代码
MATCH (p1:Person)-[r:KNOWS]->(p2:Person) 
RETURN p1, r, p2
  • 复杂模式匹配:可以构建包含多个节点、多种关系以及属性筛选条件等的复杂查询模式:
python 复制代码
MATCH (p1:Person)-[r1:KNOWS]->(p2:Person)-[r2:WORKS_AT]->(c:Company)
WHERE p1.name = "Alice" AND c.name = "TechFirm"
RETURN p1, p2, r1, r2, c

2.2 return

  • 指定查询结束后要返回的数据内容,可以返回节点、关系、属性值等各种元素:
python 复制代码
MATCH (p:Person) 
RETURN p.name, p.age
  • 使用聚合函数返回结果:
python 复制代码
MATCH (p:Person) 
RETURN count(p)
  • 返回不同类型元素:可以返回多种不同类型的元素混合在一起:
python 复制代码
MATCH (p:Person)-[r:KNOWS]->(p2:Person)
RETURN p, r, p2.name

2.3 where

  • 作为筛选条件的添加指令,常配合 MATCH 使用,用来限定查询结果需满足的条件:
python 复制代码
MATCH (p:Person) 
WHERE p.name STARTS WITH "A" AND p.age < 40 
RETURN p
  • 支持多种比较运算符(如 =、>、<、>=、<=、<> 等)以及逻辑运算符(AND、OR、NOT 等)来构建复杂的筛选条件。
python 复制代码
MATCH (p:Person)
WHERE p.name STARTS WITH "A" AND p.age < 40
RETURN p

三、删除

3.1 delete

  • 删除图数据库中的节点、关系等元素:
python 复制代码
MATCH (p:Person {name: "Charlie"}) 
DELETE p
  • 删除关系:
python 复制代码
MATCH (p1:Person)-[r:KNOWS]->(p2:Person) 
DELETE r

3.2 remove

  • 移除节点或关系上的属性:
python 复制代码
MATCH (p:Product) 
REMOVE p.description

四、数据导入与加载

4.1 load csv

  • 从 CSV 文件中加载数据到图数据库中,常配合 CREATE 等指令来基于导入的数据创建节点或关系:
    (从本地 data.csv 文件(有表头的情况)读取每行数据,然后创建对应的 :User 节点并设置属性。)
python 复制代码
LOAD CSV WITH HEADERS FROM "file:///data.csv" AS row 
CREATE (:User {name: row.name, email: row.email})

五、聚合与分组

5.1 group by

  • 类似于关系型数据库中的分组功能,用于按照指定的属性或表达式对查询结果进行分组,常配合聚合函数使用。
python 复制代码
MATCH (p:Person) 
RETURN p.age, count(p) 
GROUP BY p.age

5.2 order by

  • 对查询返回的结果按照指定的属性或表达式进行排序,可以指定升序(ASC)或降序(DESC):
python 复制代码
MATCH (p:Person) 
RETURN p.name, p.age 
ORDER BY p.age DESC

六、函数

6.1 聚合函数

  • count():用于统计节点、关系等元素的数量;
  • sum():对指定属性值进行求和;
  • avg():计算属性值的平均值;
  • min() 和 max():分别获取属性值的最小值和最大值。
python 复制代码
MATCH (p:Person) 
RETURN count(p)

MATCH (p:Product) 
RETURN sum(p.price)

MATCH (p:Product) 
RETURN avg(p.price)

MATCH (p:Product) 
RETURN min(p.price), max(p.price)

6.2 字符串函数

  • LEFT()、RIGHT():分别用于获取字符串左边或右边指定长度的子字符串;
  • SUBSTRING():截取字符串中间的部分;
  • UPPER()、LOWER():将字符串转换为大写或小写形式:
python 复制代码
MATCH (p:Person) 
RETURN LEFT(p.name, 3)

MATCH (p:Person) 
RETURN SUBSTRING(p.name, 2, 4)

MATCH (p:Person) 
RETURN UPPER(p.name)

6.3 数学函数

  • ROUND():对数值进行四舍五入;
  • ABS():求绝对值;
python 复制代码
MATCH (p:Product) 
RETURN ROUND(p.price)

MATCH (p:Product) 
WHERE p.price < 0 
RETURN ABS(p.price)

6.4 类型转换函数

  • toFloat()、toInteger() 等:用于将属性值在不同数据类型之间进行转换:
python 复制代码
MATCH (p:Product)
SET p.price = toFloat(p.price)

6.5 列表函数

  • size():用于获取列表类型属性的元素个数:
python 复制代码
MATCH (p:Person {hobbies: ["reading", "swimming"]})
RETURN size(p.hobbies)

七、路径操作与相关函数

7.1 路径查找与表示

  • 使用路径表达式来描述节点之间的连接关系以及查找符合特定路径模式的元素:
    (查找从一个 :Node 节点出发,通过 1 到 3 条关系能够到达另一个 :Node 节点的所有路径,并返回这些路径。)
python 复制代码
MATCH p=(n:Node)-[*1..3]->(m:Node)
RETURN p

7.2 路径相关函数

  • length():用于计算路径的长度(即路径中包含的关系数量):
python 复制代码
MATCH p=(n:Node)-[*]->(m:Node)
RETURN length(p)
  • nodes() 和 rels():分别用于获取路径中的节点列表和关系列表:
python 复制代码
MATCH p=(n:Node)-[*]->(m:Node)
RETURN nodes(p), rels(p)

八、索引与约束

8.1 create index

  • 创建索引,提高基于特定属性的查询效率:
    (为 :Person 节点的 name 属性创建索引,后续查询中如果频繁通过 name 属性查找 :Person 节点,速度会更快。)
python 复制代码
CREATE INDEX FOR (p:Person) ON (p.name)

8.2 create constraint

  • 创建约束条件,常见的如唯一性约束,确保某个属性在特定标签的节点中具有唯一性。
    (保证 :Person 节点的 email 属性值在整个数据库中是唯一的,避免重复创建具有相同 email 属性的 :Person 节点。)
python 复制代码
CREATE CONSTRAINT ON (p:Person) ASSERT p.email IS UNIQUE

九、事务与执行控制

9.1 begin、commit、rollback

  • BEGIN:用于开启一个事务,在事务内可以执行多条 Cypher 语句;
  • COMMIT 用于提交事务,使事务内对数据的修改操作生效;
  • ROLLBACK 用于回滚事务,撤销事务内已经执行的操作,恢复到事务开始前的数据状态。
python 复制代码
BEGIN
CREATE (:TempNode {name: "Temp"})
// 其他操作
COMMIT

9.2 explain、profile

  • EXPLAIN:用于获取查询语句的执行计划信息,展示数据库将如何执行该查询,帮助分析查询性能、优化查询逻辑,但并不实际执行查询。
python 复制代码
EXPLAIN MATCH (p:Person) 
RETURN p
  • PROFILE:不仅能获取执行计划,还会实际执行查询,并展示查询执行过程中的性能相关数据,比如各操作花费的时间等,方便定位查询性能瓶颈。
python 复制代码
PROFILE MATCH (p:Person) 
RETURN p

以上涵盖了 Cypher 语言的大部分主要功能和指令,不过不同的图数据库系统在对 Cypher 语言的具体实现、支持程度以及语法细节等方面可能会存在一定差异,实际使用时需要结合具体的数据库平台来准确应用这些功能和指令。

相关推荐
贾修行8 分钟前
SQL Server 空间函数从入门到精通:原理、实战与多数据库性能对比
数据库·sqlserver
傲祥Ax20 分钟前
Redis总结
数据库·redis·redis重点总结
一屉大大大花卷1 小时前
初识Neo4j之入门介绍(一)
数据库·neo4j
周胡杰2 小时前
鸿蒙arkts使用关系型数据库,使用DB Browser for SQLite连接和查看数据库数据?使用TaskPool进行频繁数据库操作
前端·数据库·华为·harmonyos·鸿蒙·鸿蒙系统
wkj0012 小时前
navicate如何设置数据库引擎
数据库·mysql
赵渝强老师2 小时前
【赵渝强老师】Oracle RMAN的目录数据库
数据库·oracle
暖暖木头2 小时前
Oracle注释详解
数据库·oracle
御控工业物联网2 小时前
御控网关如何实现MQTT、MODBUS、OPCUA、SQL、HTTP之间协议转换
数据库·sql·http
GJCTYU3 小时前
spring中@Transactional注解和事务的实战理解附代码
数据库·spring boot·后端·spring·oracle·mybatis
MicroTech20253 小时前
微算法科技(NASDAQ: MLGO)探索Grover量子搜索算法,利用量子叠加和干涉原理,实现在无序数据库中快速定位目标信息的效果。
数据库·科技·算法