在 Cypher 查询语言中,主要的语句类型包括数据创建、查询、更新、删除以及高级操作等。下面是 Cypher 语句的完整分类及详细解释:


一、数据创建语句

1.1 创建节点

CREATE (n:Person {name: 'Alice', age: 30})
  • CREATE:创建一个新的节点。
  • (n:Person):创建一个 Person 标签的节点,并赋值给变量 n
  • {name: 'Alice', age: 30}:添加属性 nameage

1.2 创建关系

MATCH (a:Person {name: 'Alice'}), (b:Person {name: 'Bob'})
CREATE (a)-[:KNOWS {since: 2020}]->(b)
  • MATCH:匹配 AliceBob 两个节点。
  • CREATE:创建 KNOWS 关系,带有 since 属性。

1.3 使用 MERGE 创建或匹配数据

MERGE (n:Person {name: 'Alice'})
ON CREATE SET n.age = 30
ON MATCH SET n.lastLogin = timestamp()
  • MERGE:如果不存在 Alice 节点则创建,存在则更新。
  • ON CREATE:在创建时设置 age
  • ON MATCH:在匹配时更新 lastLogin

二、数据查询语句

2.1 基本 MATCH 语句

MATCH (n)
RETURN n
  • MATCH:匹配所有节点。
  • RETURN:返回匹配到的节点。

2.2 匹配带有标签的节点

MATCH (n:Person)
RETURN n
  • 匹配所有 Person 标签的节点。

2.3 匹配节点和关系

MATCH (a:Person)-[r:KNOWS]->(b:Person)
RETURN a, b, r
  • MATCH:匹配 Person 节点之间的 KNOWS 关系。

2.4 条件过滤(WHERE 语句)

MATCH (n:Person)
WHERE n.name = 'Alice' AND n.age > 25
RETURN n
  • WHERE:用于属性过滤。
  • ANDOR:逻辑条件组合。

2.5 路径匹配

MATCH p = (a:Person)-[:FRIENDS_WITH*1..3]->(b:Person)
RETURN p
  • p = ...:将路径赋值给 p 变量。
  • [:FRIENDS_WITH*1..3]:匹配 1 到 3 跳之间的 FRIENDS_WITH 关系。

2.6 最短路径匹配

MATCH p = shortestPath((a:Person)-[:KNOWS*]-(b:Person))
RETURN p
  • shortestPath():查找最短路径。
  • KNOWS*:匹配任意长度的 KNOWS 关系。

三、数据更新语句

3.1 更新节点属性

MATCH (n:Person {name: 'Alice'})
SET n.age = 35, n.city = 'New York'
RETURN n
  • SET:更新节点的属性或创建新属性。

3.2 更新关系属性

MATCH (a:Person)-[r:KNOWS]->(b:Person)
WHERE a.name = 'Alice' AND b.name = 'Bob'
SET r.since = 2021
RETURN r
  • SET:更新关系的属性。

3.3 删除节点属性

MATCH (n:Person {name: 'Alice'})
REMOVE n.age
RETURN n
  • REMOVE:删除节点的属性。

3.4 删除节点标签

MATCH (n:Person {name: 'Alice'})
REMOVE n:Person
RETURN n
  • 删除 Person 标签,但节点本身不会被删除。

四、数据删除语句

4.1 删除节点和关系

MATCH (n:Person {name: 'Alice'})
DETACH DELETE n
  • DETACH DELETE:删除节点和与其关联的所有关系。

4.2 只删除关系

MATCH (a)-[r:KNOWS]->(b)
DELETE r
  • DELETE 仅删除关系 r,保留节点 ab

五、索引与约束管理语句

5.1 创建索引

CREATE INDEX FOR (n:Person) ON (n.name)
  • Person 节点的 name 属性创建索引。

5.2 创建唯一性约束

CREATE CONSTRAINT FOR (n:Person) REQUIRE n.name IS UNIQUE
  • 确保 Person 节点的 name 属性唯一。

5.3 删除索引

DROP INDEX index_name
  • 删除指定的索引。

5.4 删除约束

DROP CONSTRAINT constraint_name
  • 删除指定的约束。

六、事务与控制语句

6.1 开启、提交和回滚事务

BEGIN
MATCH (n:Person)
SET n.status = 'active'
COMMIT
  • BEGIN:开启一个事务。
  • COMMIT:提交事务。
BEGIN
MATCH (n:Person)
SET n.status = 'inactive'
ROLLBACK
  • ROLLBACK:回滚事务,撤销所有更改。

七、CALL 语句与子查询

7.1 调用存储过程

CALL db.schema.visualization()
  • CALL 语句用于调用 Neo4j 内置的存储过程。

7.2 使用子查询

MATCH (m:Movie)
CALL {
  WITH m
  MATCH (m)<-[:ACTED_IN]-(p:Person)
  RETURN collect(p.name) AS actors
}
SET m.actors = actors
RETURN m
  • CALL {} 子查询用于在主查询内部执行嵌套查询。
  • WITH 将外部变量传入子查询。

八、LOAD CSV 数据导入语句

8.1 导入 CSV 数据

LOAD CSV WITH HEADERS FROM 'file:///movies.csv' AS row
CREATE (:Movie {title: row.title, released: toInteger(row.released)})
  • LOAD CSV 从指定路径加载 CSV 文件。
  • WITH HEADERS 表示 CSV 文件的第一行是列名。

8.2 更新节点数据

LOAD CSV WITH HEADERS FROM 'file:///actors.csv' AS row
MATCH (p:Person {name: row.name})
SET p.age = toInteger(row.age)
  • 通过 MATCH 查询匹配的节点,并使用 SET 更新数据。

九、特殊语句与高级用法

9.1 使用 OPTIONAL MATCH

MATCH (p:Person)
OPTIONAL MATCH (p)-[r:KNOWS]->(f:Person)
RETURN p.name, f.name
  • OPTIONAL MATCH:即使匹配失败,也不会过滤掉 p,而是将 f 返回为 NULL

9.2 使用 UNION 合并多个查询

MATCH (n:Person) RETURN n.name AS name
UNION
MATCH (m:Movie) RETURN m.title AS name
  • UNION 将多个查询的结果合并。

9.3 使用 EXPLAIN 和 PROFILE 进行查询优化

EXPLAIN MATCH (n:Person) WHERE n.name = 'Alice' RETURN n
  • EXPLAIN 只显示查询计划,不实际执行查询。
PROFILE MATCH (n:Person) WHERE n.name = 'Alice' RETURN n
  • PROFILE 执行查询,并返回详细的执行计划信息。

十、总结

  • Cypher 语句主要包括 创建、查询、更新、删除、索引和约束管理、事务控制、数据导入 等部分。
  • MATCHCREATE 是最常用的语句,用于数据的匹配和创建。
  • MERGE 结合了创建和匹配的特性,确保数据的幂等性。
  • 使用 EXPLAINPROFILE 进行性能分析,可以优化查询速度。
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐