Neo4j 基础语法指南

Neo4j 基础语法指南

Neo4j 是最流行的图数据库之一,使用 Cypher 作为查询语言。Cypher 语法简洁直观,专为处理图数据(节点、关系和属性)设计。本指南将介绍 Neo4j Cypher 的核心语法和基本操作。

一、基本概念

在 Neo4j 中,数据模型由三部分组成:

  • 节点(Node):表示实体,如人、物、地点等
  • 关系(Relationship):连接两个节点,有方向和类型
  • 属性(Property):键值对,可附加在节点或关系上

二、创建操作(CREATE)

创建节点

创建一个简单节点(无标签和属性):

cypher 复制代码
CREATE ()

创建带标签的节点:

cypher 复制代码
CREATE (p:Person)  // 创建一个带有Person标签的节点

创建带属性的节点:

cypher 复制代码
CREATE (p:Person {name: 'Alice', age: 30, city: 'New York'})

创建多个节点:

cypher 复制代码
CREATE (p1:Person {name: 'Bob'}), (p2:Person {name: 'Charlie'})

创建关系

创建两个节点之间的关系:

cypher 复制代码
// 先创建两个节点,再创建它们之间的关系
CREATE (p1:Person {name: 'Alice'}), (p2:Person {name: 'Bob'})
CREATE (p1)-[r:FRIENDS_WITH]->(p2)

创建带属性的关系:

cypher 复制代码
CREATE (p1)-[r:FRIENDS_WITH {since: 2020, strength: 8}]->(p2)

三、查询操作(MATCH)

查询节点

查询所有节点:

cypher 复制代码
MATCH (n) RETURN n

查询特定标签的节点:

cypher 复制代码
MATCH (p:Person) RETURN p

查询带条件的节点:

cypher 复制代码
MATCH (p:Person {name: 'Alice'}) RETURN p.name, p.age

带WHERE子句的查询:

cypher 复制代码
MATCH (p:Person)
WHERE p.age > 25 AND p.city = 'New York'
RETURN p.name, p.age

查询关系

查询特定类型的关系:

cypher 复制代码
MATCH ()-[r:FRIENDS_WITH]->()
RETURN r

查询节点和关系:

cypher 复制代码
MATCH (p1:Person)-[r:FRIENDS_WITH]->(p2:Person)
RETURN p1.name, r.since, p2.name

查询路径:

cypher 复制代码
// 查询两个节点之间的路径
MATCH path = (p1:Person {name: 'Alice'})-[*..3]->(p2:Person {name: 'David'})
RETURN path

四、更新操作(SET)

更新节点属性:

cypher 复制代码
MATCH (p:Person {name: 'Alice'})
SET p.age = 31, p.city = 'Boston'
RETURN p

添加新属性:

cypher 复制代码
MATCH (p:Person {name: 'Alice'})
SET p.email = 'alice@example.com'
RETURN p

添加标签:

cypher 复制代码
MATCH (p:Person {name: 'Alice'})
SET p:Employee:Manager
RETURN p

更新关系属性:

cypher 复制代码
MATCH (p1:Person {name: 'Alice'})-[r:FRIENDS_WITH]->(p2:Person {name: 'Bob'})
SET r.strength = 9, r.last_contact = '2023-01-15'
RETURN r

五、删除操作(DELETE & REMOVE)

删除节点:

cypher 复制代码
// 必须先删除节点的所有关系才能删除节点
MATCH (p:Person {name: 'Alice'})
DETACH DELETE p

删除关系:

cypher 复制代码
MATCH (p1:Person {name: 'Alice'})-[r:FRIENDS_WITH]->(p2:Person {name: 'Bob'})
DELETE r

删除属性:

cypher 复制代码
MATCH (p:Person {name: 'Alice'})
REMOVE p.age
RETURN p

删除标签:

cypher 复制代码
MATCH (p:Person {name: 'Alice'})
REMOVE p:Manager
RETURN p

清空数据库:

cypher 复制代码
MATCH (n)
DETACH DELETE n

六、合并操作(MERGE)

MERGE 类似于 CREATE,但会先检查是否存在匹配的节点或关系,不存在才创建:

合并节点:

cypher 复制代码
MERGE (p:Person {name: 'Alice'})
ON CREATE SET p.created = timestamp()
ON MATCH SET p.last_seen = timestamp()
RETURN p

合并关系:

cypher 复制代码
MATCH (p1:Person {name: 'Alice'}), (p2:Person {name: 'Bob'})
MERGE (p1)-[r:FRIENDS_WITH]->(p2)
ON CREATE SET r.since = timestamp()
RETURN r

七、聚合与排序

计数:

cypher 复制代码
MATCH (p:Person)
RETURN p.city, count(p) AS people_count
ORDER BY people_count DESC

平均值:

cypher 复制代码
MATCH (p:Person)
RETURN avg(p.age) AS average_age

排序和限制:

cypher 复制代码
MATCH (p:Person)
RETURN p.name, p.age
ORDER BY p.age DESC
LIMIT 5

八、索引与约束

创建索引(提高查询性能):

cypher 复制代码
CREATE INDEX idx_person_name FOR (p:Person) ON (p.name)

创建唯一约束(确保属性值唯一):

cypher 复制代码
CREATE CONSTRAINT unique_person_email FOR (p:Person) REQUIRE p.email IS UNIQUE

九、常用函数

字符串函数:

cypher 复制代码
MATCH (p:Person)
RETURN p.name, upper(p.name), substring(p.name, 0, 3)

日期函数:

cypher 复制代码
RETURN date(), datetime(), timestamp()

集合函数:

cypher 复制代码
MATCH (p:Person)-[:FRIENDS_WITH]->(friend)
RETURN p.name, collect(friend.name) AS friends

总结

以上是 Neo4j Cypher 的基础语法,涵盖了创建、查询、更新、删除等核心操作。Cypher 的设计理念是接近自然语言,易于理解和使用。对于复杂查询和高级功能,可以参考 Neo4j 官方文档进一步学习。

通过熟练掌握这些基础语法,你可以开始构建和查询自己的图数据库模型,发掘数据中隐藏的关系和模式。