Neo4j 基础语法指南
Neo4j 基础语法指南
Neo4j 是最流行的图数据库之一,使用 Cypher 作为查询语言。Cypher 语法简洁直观,专为处理图数据(节点、关系和属性)设计。本指南将介绍 Neo4j Cypher 的核心语法和基本操作。
一、基本概念
在 Neo4j 中,数据模型由三部分组成:
- 节点(Node):表示实体,如人、物、地点等
- 关系(Relationship):连接两个节点,有方向和类型
- 属性(Property):键值对,可附加在节点或关系上
二、创建操作(CREATE)
创建节点
创建一个简单节点(无标签和属性):
CREATE ()
创建带标签的节点:
CREATE (p:Person) // 创建一个带有Person标签的节点
创建带属性的节点:
CREATE (p:Person {name: 'Alice', age: 30, city: 'New York'})
创建多个节点:
CREATE (p1:Person {name: 'Bob'}), (p2:Person {name: 'Charlie'})
创建关系
创建两个节点之间的关系:
// 先创建两个节点,再创建它们之间的关系
CREATE (p1:Person {name: 'Alice'}), (p2:Person {name: 'Bob'})
CREATE (p1)-[r:FRIENDS_WITH]->(p2)
创建带属性的关系:
CREATE (p1)-[r:FRIENDS_WITH {since: 2020, strength: 8}]->(p2)
三、查询操作(MATCH)
查询节点
查询所有节点:
MATCH (n) RETURN n
查询特定标签的节点:
MATCH (p:Person) RETURN p
查询带条件的节点:
MATCH (p:Person {name: 'Alice'}) RETURN p.name, p.age
带WHERE子句的查询:
MATCH (p:Person)
WHERE p.age > 25 AND p.city = 'New York'
RETURN p.name, p.age
查询关系
查询特定类型的关系:
MATCH ()-[r:FRIENDS_WITH]->()
RETURN r
查询节点和关系:
MATCH (p1:Person)-[r:FRIENDS_WITH]->(p2:Person)
RETURN p1.name, r.since, p2.name
查询路径:
// 查询两个节点之间的路径
MATCH path = (p1:Person {name: 'Alice'})-[*..3]->(p2:Person {name: 'David'})
RETURN path
四、更新操作(SET)
更新节点属性:
MATCH (p:Person {name: 'Alice'})
SET p.age = 31, p.city = 'Boston'
RETURN p
添加新属性:
MATCH (p:Person {name: 'Alice'})
SET p.email = 'alice@example.com'
RETURN p
添加标签:
MATCH (p:Person {name: 'Alice'})
SET p:Employee:Manager
RETURN p
更新关系属性:
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)
删除节点:
// 必须先删除节点的所有关系才能删除节点
MATCH (p:Person {name: 'Alice'})
DETACH DELETE p
删除关系:
MATCH (p1:Person {name: 'Alice'})-[r:FRIENDS_WITH]->(p2:Person {name: 'Bob'})
DELETE r
删除属性:
MATCH (p:Person {name: 'Alice'})
REMOVE p.age
RETURN p
删除标签:
MATCH (p:Person {name: 'Alice'})
REMOVE p:Manager
RETURN p
清空数据库:
MATCH (n)
DETACH DELETE n
六、合并操作(MERGE)
MERGE 类似于 CREATE,但会先检查是否存在匹配的节点或关系,不存在才创建:
合并节点:
MERGE (p:Person {name: 'Alice'})
ON CREATE SET p.created = timestamp()
ON MATCH SET p.last_seen = timestamp()
RETURN p
合并关系:
MATCH (p1:Person {name: 'Alice'}), (p2:Person {name: 'Bob'})
MERGE (p1)-[r:FRIENDS_WITH]->(p2)
ON CREATE SET r.since = timestamp()
RETURN r
七、聚合与排序
计数:
MATCH (p:Person)
RETURN p.city, count(p) AS people_count
ORDER BY people_count DESC
平均值:
MATCH (p:Person)
RETURN avg(p.age) AS average_age
排序和限制:
MATCH (p:Person)
RETURN p.name, p.age
ORDER BY p.age DESC
LIMIT 5
八、索引与约束
创建索引(提高查询性能):
CREATE INDEX idx_person_name FOR (p:Person) ON (p.name)
创建唯一约束(确保属性值唯一):
CREATE CONSTRAINT unique_person_email FOR (p:Person) REQUIRE p.email IS UNIQUE
九、常用函数
字符串函数:
MATCH (p:Person)
RETURN p.name, upper(p.name), substring(p.name, 0, 3)
日期函数:
RETURN date(), datetime(), timestamp()
集合函数:
MATCH (p:Person)-[:FRIENDS_WITH]->(friend)
RETURN p.name, collect(friend.name) AS friends
总结
以上是 Neo4j Cypher 的基础语法,涵盖了创建、查询、更新、删除等核心操作。Cypher 的设计理念是接近自然语言,易于理解和使用。对于复杂查询和高级功能,可以参考 Neo4j 官方文档进一步学习。
通过熟练掌握这些基础语法,你可以开始构建和查询自己的图数据库模型,发掘数据中隐藏的关系和模式。