在 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()

总结

  1. Neo4j 使用 neo4j Python 驱动来连接、查询和管理图数据。
  2. Cypher 是 Neo4j 的查询语言,类似 SQL。
  3. 可以通过 Python 进行 CRUD 操作(创建、查询、更新、删除)。
  4. Flask 可以轻松与 Neo4j 整合,实现 Web API。
  5. Neo4j 通常通过 bolt:// 协议在 7687 端口上进行通信。
Logo

纵情码海钱塘涌,杭州开发者创新动! 属于杭州的开发者社区!致力于为杭州地区的开发者提供学习、合作和成长的机会;同时也为企业交流招聘提供舞台!

更多推荐