6. Neo.4j
什么是 Neo4j?
Neo4j 是一个开源的图数据库,适用于存储和查询复杂的关系数据,例如社交网络、推荐系统和知识图谱。
info
Neo4j 采用基于节点(Node)和关系(Relationship)的数据模型,比传统关系数据库更适合表示复杂的关系结构。
Neo4j 数据结构
Neo4j 的基本构成单元如下:
元素 | 说明 |
---|---|
Node(节点) | 数据实体,例如用户、产品、文章等 |
Relationship(关系) | 连接节点的边,定义节点之间的关系 |
Property(属性) | 附加在节点或关系上的键值对数据 |
Label(标签) | 给予节点分类,例如 :Person 或 :Movie |
创建数据库和数据模型
// 创建节点
CREATE (:Person {name: 'Alice', age: 30, email: 'alice@example.com'});
// 创建关系
MATCH (a:Person {name: 'Alice'}), (b:Person {name: 'Bob'})
CREATE (a)-[:FRIENDS_WITH]->(b);
Neo4j 增删改查(CRUD)
- Cypher 查询语言
- Python
// 插入数据
CREATE (:Person {name: 'Bob', age: 25, email: 'bob@example.com'});
// 查询数据
MATCH (p:Person) WHERE p.age > 25 RETURN p;
// 更新数据
MATCH (p:Person {name: 'Alice'})
SET p.age = 31;
// 删除数据
MATCH (p:Person {name: 'Bob'}) DETACH DELETE p;
from neo4j import GraphDatabase
driver = GraphDatabase.driver("neo4j://localhost:7687", auth=("neo4j", "password"))
def create_person(tx, name, age, email):
tx.run("CREATE (:Person {name: $name, age: $age, email: $email})",
name=name, age=age, email=email)
def query_people(tx):
result = tx.run("MATCH (p:Person) RETURN p.name, p.age")
return result.values()
with driver.session() as session:
session.write_transaction(create_person, "Alice", 30, "alice@example.com")
people = session.read_transaction(query_people)
print(people)
driver.close()
复杂查询示例
// 查找 Alice 的朋友
MATCH (a:Person {name: 'Alice'})-[:FRIENDS_WITH]->(friend)
RETURN friend;
// 计算社交网络中的好友数量
MATCH (p:Person)-[:FRIENDS_WITH]->(friend)
RETURN p.name, COUNT(friend) AS friends_count;
创建索引与优化查询
// 为 name 字段创建索引
CREATE INDEX FOR (p:Person) ON (p.name);
// 查询优化示例
EXPLAIN MATCH (p:Person {name: 'Alice'}) RETURN p;
事务管理
使用事务保证数据一致性
with driver.session() as session:
with session.begin_transaction() as tx:
tx.run("CREATE (:Person {name: 'Charlie', age: 27, email: 'charlie@example.com'})")
tx.run("CREATE (:Person {name: 'Dave', age: 29, email: 'dave@example.com'})")
结论
Neo4j 是一个强大的图数据库,适用于复杂关系建模和高效查询。通过 Cypher 语言和索引优化,可以高效管理和查询图数据。