随着社交网络、推荐系统、知识图谱等应用的普及,图数据库越来越成为解决关系复杂数据问题的重要武器。作为图数据库中的佼佼者,Neo4j 凭借其强大的性能和灵活的数据模型,被广泛应用于各种关联密集型场景。而在 Python 生态中,py2neo 是使用最广泛的 Neo4j 客户端库之一,它简洁直观,封装度高,能够让你在 Python 中像操作对象一样操作图数据。
本文将全面介绍 py2neo 的使用方法与设计理念,帮助你快速掌握在 Python 中如何高效使用 Neo4j。
py2neo 是一个面向对象的 Python 库,用于连接、操作和查询 Neo4j 图数据库。它构建于 Neo4j 官方提供的 HTTP 接口之上,使用 Pythonic 的方式封装了数据模型、图操作、Cypher 查询和事务处理等核心功能。
其主要特性包括:
在安装 py2neo 之前,需确保你的系统中安装了 Python(推荐 3.8+)以及已经部署并启动了 Neo4j 数据库实例。
你可以通过官网下载社区版 Neo4j:https://neo4j.com/download/
或使用 Docker:
docker run -d \
--name neo4j \
-p7474:7474 -p7687:7687 \
-e NEO4J_AUTH=neo4j/password \
neo4j:latest
默认的 Neo4j HTTP 端口为 7474,Bolt 协议端口为 7687。
pip install py2neo
验证安装是否成功:
from py2neo import Graph
graph = Graph("bolt://localhost:7687", auth=("neo4j", "password"))
print(graph.run("RETURN 1").data())
Py2neo 的核心是 Graph
类,它代表一个图数据库连接对象,负责管理节点和关系的增删改查。
from py2neo import Graph
graph = Graph("bolt://localhost:7687", auth=("neo4j", "password"))
常用方法:
run(cypher, parameters)
:执行 Cypher 查询create(subgraph)
:创建节点或关系delete(subgraph)
:删除节点或关系begin()
:开始事务evaluate(cypher)
:返回单个结果值创建节点和关系的基本用法如下:
from py2neo import Node, Relationship
alice = Node("Person", name="Alice", age=30)
bob = Node("Person", name="Bob")
friendship = Relationship(alice, "KNOWS", bob)
支持属性操作:
alice["email"] = "[email protected]"
我们以一个简单的社交网络为例,演示 py2neo 的基本用法:
from py2neo import Graph
graph = Graph("bolt://localhost:7687", auth=("neo4j", "password"))
graph.delete_all()
from py2neo import Node, Relationship
alice = Node("Person", name="Alice")
bob = Node("Person", name="Bob")
carol = Node("Person", name="Carol")
graph.create(alice | bob | carol)
graph.create(Relationship(alice, "KNOWS", bob))
graph.create(Relationship(bob, "KNOWS", carol))
graph.create(Relationship(alice, "KNOWS", carol))
# 使用 run 执行 Cypher 查询
result = graph.run("MATCH (p:Person) RETURN p.name AS name").data()
for r in result:
print(r["name"])
result = graph.run("""
MATCH (a:Person)-[:KNOWS]->(b:Person)
WHERE a.name = $name
RETURN b.name AS friend
""", name="Alice").data()
print("Alice's friends:", [r["friend"] for r in result])
NodeMatcher
查询节点from py2neo.matching import NodeMatcher
matcher = NodeMatcher(graph)
alice = matcher.match("Person", name="Alice").first()
print(alice)
tx = graph.begin()
for i in range(10):
person = Node("Person", name=f"User{i}")
tx.create(person)
tx.commit()
import pandas as pd
df = pd.DataFrame(graph.run("MATCH (p:Person) RETURN p.name AS name").data())
print(df)
可结合 NetworkX 等库进一步图可视化。
在实际生产中,对图数据库的大批量操作建议使用事务提交:
tx = graph.begin()
node1 = Node("Person", name="Dave")
node2 = Node("Person", name="Eve")
rel = Relationship(node1, "KNOWS", node2)
tx.create(node1)
tx.create(node2)
tx.create(rel)
tx.commit()
CREATE INDEX FOR (p:Person) ON (p.name)
场景 | 应用说明 |
---|---|
知识图谱 | 使用节点表示实体、关系表示事实 |
社交网络分析 | 分析用户关系、影响力传播 |
推荐系统 | 图中寻找兴趣相似的人或物 |
风控反欺诈 | 发现异常连接路径或环 |
网络拓扑 | 分析设备间连接与路径优化 |
假设我们有一批人物与作品的数据,目标是构建人物与作品之间的图关系。
data = [
{"person": "张三", "role": "主演", "movie": "大话西游"},
{"person": "李四", "role": "导演", "movie": "大话西游"},
{"person": "王五", "role": "主演", "movie": "功夫"},
]
for item in data:
p = Node("Person", name=item["person"])
m = Node("Movie", title=item["movie"])
r = Relationship(p, item["role"], m)
graph.merge(p, "Person", "name")
graph.merge(m, "Movie", "title")
graph.merge(r)
使用 merge
可以避免重复插入同名节点,非常适合批量构建图谱。
查询所有“主演”的电影:
result = graph.run("""
MATCH (p:Person)-[:主演]->(m:Movie)
RETURN p.name AS person, m.title AS movie
""").data()
通过本文,我们系统了解了 py2neo 的安装、基本用法、高级功能与实际应用场景。它将 Neo4j 图数据库的能力完美嫁接到 Python 环境中,是构建图智能系统的有力工具。
如果你正在处理关系复杂的数据,或者希望在知识图谱、推荐系统、社交网络分析等领域中发力,那么掌握 py2neo,无疑是你数据工具箱中不可或缺的一环。