在 Python 中使用 Neo4j
要在 Python 中连接和操作 Neo4j 数据库,通常使用官方的 neo4j
驱动程序(neo4j
Python Driver)。
1. 安装 Neo4j Python 驱动
使用 pip
安装:
pip install neo4j
2. 连接 Neo4j 数据库
首先,你需要在本地或远程运行 Neo4j 数据库。默认端口是 7687,使用 bolt
协议进行通信。
连接 Neo4j 示例
from neo4j import GraphDatabase
# 连接信息
uri = "bolt://localhost:7687" # Neo4j 连接地址
username = "neo4j" # 用户名(默认 neo4j)
password = "your_password" # 数据库密码
# 创建驱动实例
driver = GraphDatabase.driver(uri, auth=(username, password))
# 关闭连接
driver.close()
uri
:指定使用bolt
协议连接 Neo4j,bolt://
是默认的协议。auth
:提供用户名和密码进行身份验证。
3. 使用 Session 执行 Cypher 查询
Neo4j 使用 Cypher 作为查询语言,可以通过 session
运行 Cypher 语句。
3.1 创建 Session
with driver.session() as session:
result = session.run("MATCH (n) RETURN n LIMIT 5")
for record in result:
print(record)
session.run()
:执行 Cypher 语句。record
:包含查询返回的每一条数据。
3.2 执行 Cypher 语句
创建节点
def create_person(tx, name, age):
query = "CREATE (p:Person {name: $name, age: $age})"
tx.run(query, name=name, age=age)
with driver.session() as session:
session.write_transaction(create_person, "Alice", 30)
session.write_transaction(create_person, "Bob", 25)
tx.run()
:执行 Cypher 语句,$name
和$age
是参数。session.write_transaction()
:用于写入数据的事务。
查询节点
def get_person(tx, name):
query = "MATCH (p:Person {name: $name}) RETURN p.name, p.age"
result = tx.run(query, name=name)
for record in result:
print(f"Name: {record['p.name']}, Age: {record['p.age']}")
with driver.session() as session:
session.read_transaction(get_person, "Alice")
session.read_transaction()
:用于读取数据的事务。
创建关系
def create_friendship(tx, name1, name2):
query = """
MATCH (a:Person {name: $name1}), (b:Person {name: $name2})
CREATE (a)-[:FRIENDS_WITH]->(b)
"""
tx.run(query, name1=name1, name2=name2)
with driver.session() as session:
session.write_transaction(create_friendship, "Alice", "Bob")
查询关系
def get_friends(tx, name):
query = """
MATCH (p:Person {name: $name})-[:FRIENDS_WITH]->(friend)
RETURN friend.name
"""
result = tx.run(query, name=name)
friends = [record["friend.name"] for record in result]
return friends
with driver.session() as session:
friends = session.read_transaction(get_friends, "Alice")
print("Alice's friends:", friends)
更新节点
def update_person_age(tx, name, age):
query = "MATCH (p:Person {name: $name}) SET p.age = $age"
tx.run(query, name=name, age=age)
with driver.session() as session:
session.write_transaction(update_person_age, "Alice", 35)
删除节点
def delete_person(tx, name):
query = "MATCH (p:Person {name: $name}) DELETE p"
tx.run(query, name=name)
with driver.session() as session:
session.write_transaction(delete_person, "Bob")
4. 使用 Neo4j 与 Flask 整合
如果你想在 Flask Web 应用 中使用 Neo4j,可以创建一个简单的 API。
Flask + Neo4j 示例
from flask import Flask, request, jsonify
from neo4j import GraphDatabase
app = Flask(__name__)
# Neo4j 配置
uri = "bolt://localhost:7687"
username = "neo4j"
password = "your_password"
# 创建 Neo4j 驱动
driver = GraphDatabase.driver(uri, auth=(username, password))
@app.route("/create_person", methods=["POST"])
def create_person():
data = request.json
name = data["name"]
age = data["age"]
with driver.session() as session:
session.write_transaction(lambda tx: tx.run(
"CREATE (p:Person {name: $name, age: $age})", name=name, age=age
))
return jsonify({"message": f"Person {name} created successfully"})
@app.route("/get_person/<name>", methods=["GET"])
def get_person(name):
with driver.session() as session:
result = session.read_transaction(lambda tx: tx.run(
"MATCH (p:Person {name: $name}) RETURN p.name, p.age", name=name
))
record = result.single()
if record:
return jsonify({"name": record["p.name"], "age": record["p.age"]})
else:
return jsonify({"error": "Person not found"}), 404
if __name__ == "__main__":
app.run(debug=True)
5. Neo4j 常用 Cypher 语句
1. 创建节点
CREATE (a:Person {name: "Alice", age: 30})
2. 查询所有节点
MATCH (n) RETURN n
3. 查询特定节点
MATCH (a:Person {name: "Alice"}) RETURN a
4. 创建关系
MATCH (a:Person {name: "Alice"}), (b:Person {name: "Bob"})
CREATE (a)-[:FRIENDS_WITH]->(b)
5. 删除节点及其关系
MATCH (a:Person {name: "Alice"}) DETACH DELETE a
6. 使用 Docker 运行 Neo4j
1. 拉取 Neo4j 镜像
docker pull neo4j
2. 启动 Neo4j 容器
docker run -d \
--name neo4j \
-p 7474:7474 -p 7687:7687 \
-e NEO4J_AUTH=neo4j/password \
neo4j
7474
:HTTP 访问端口7687
:Bolt 连接端口NEO4J_AUTH=neo4j/password
:设置 Neo4j 认证信息
7. 关闭 Neo4j 连接
连接完成后需要关闭驱动程序:
driver.close()
总结
- Neo4j 使用
neo4j
Python 驱动来连接、查询和管理图数据。 - Cypher 是 Neo4j 的查询语言,类似 SQL。
- 可以通过 Python 进行 CRUD 操作(创建、查询、更新、删除)。
- Flask 可以轻松与 Neo4j 整合,实现 Web API。
- Neo4j 通常通过
bolt://
协议在 7687 端口上进行通信。