Python 中 Neo4j 的使用指南

在 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 端口上进行通信。

    作者:彬彬侠

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python 中 Neo4j 的使用指南

    发表回复