Home
|
Posts
|
About

neo4j介绍以及基本操作

上次更新: Friday, April 25, 2025 10:45 AM

AI Summary

讲解一下neo4j的基本操作。

介绍

Neo4j 是一个图形数据库,它使用图形结构来存储数据。数据通过节点(nodes)、关系(relationships)和属性(properties)来表示。Python 中可以通过 neo4j 驱动来与 Neo4j 数据库进行交互,本教程将向你展示如何在 Python 中使用 Neo4j 驱动进行基础操作。

1. 安装和配置

安装 Neo4j Python 驱动

首先,确保你已经安装了 Neo4j 数据库,并且已经运行它。然后,你需要安装 Neo4j 的 Python 驱动。

pip install neo4j

连接到 Neo4j 数据库

连接到 Neo4j 数据库需要提供数据库的 URI、用户名和密码。通常使用 bolt 协议来连接 Neo4j,默认端口为 7687。

from neo4j import GraphDatabase

# 创建 Neo4j 驱动实例
uri = "bolt://localhost:7687"  # Neo4j URI
username = "neo4j"  # Neo4j 默认用户名
password = "your_password"  # 密码
driver = GraphDatabase.driver(uri, auth=(username, password))

2. 节点的基础操作

创建节点

节点是图数据库的基本元素之一,你可以通过 Cypher 查询语言创建节点,并为其设置属性。

def create_node(tx, node_id, label):
    query = "CREATE (n:Animal {custom_id: $node_id, label: $label})"
    tx.run(query, node_id=node_id, label=label)

# 执行创建节点
with driver.session() as session:
    session.write_transaction(create_node, "unique_id_1", "Mammal")
    print("Node created.")

# 关闭驱动
driver.close()

查询节点

你可以使用 MATCH 查询来查找符合条件的节点。

def get_node(tx, node_id):
    query = "MATCH (n:Animal {custom_id: $node_id}) RETURN n"
    result = tx.run(query, node_id=node_id)
    for record in result:
        print(record["n"])

# 执行查询
with driver.session() as session:
    session.read_transaction(get_node, "unique_id_1")

更新节点

更新节点的属性时,可以使用 SET 语句。

def update_node(tx, node_id, new_label):
    query = "MATCH (n:Animal {custom_id: $node_id}) SET n.label = $new_label"
    tx.run(query, node_id=node_id, new_label=new_label)

# 执行更新
with driver.session() as session:
    session.write_transaction(update_node, "unique_id_1", "Dog")

删除节点

删除节点时,需要使用 DETACH DELETE,确保删除该节点及其所有关系。

def delete_node(tx, node_id):
    query = "MATCH (n:Animal {custom_id: $node_id}) DETACH DELETE n"
    tx.run(query, node_id=node_id)

# 执行删除
with driver.session() as session:
    session.write_transaction(delete_node, "unique_id_1")
    print("Node deleted.")

3. 关系的基础操作

创建关系

创建关系时,你需要指定关系的类型,并连接两个节点。

def create_relationship(tx, node1_id, node2_id):
    query = """
    MATCH (a:Animal {custom_id: $node1_id}), (b:Animal {custom_id: $node2_id})
    CREATE (a)-[:KNOWS]->(b)
    """
    tx.run(query, node1_id=node1_id, node2_id=node2_id)

# 执行创建关系
with driver.session() as session:
    session.write_transaction(create_relationship, "unique_id_1", "unique_id_2")

查询关系

你可以使用 MATCH 查找关系,并指定起始和结束节点。

def get_relationship(tx, node1_id, node2_id):
    query = """
    MATCH (a)-[r:KNOWS]->(b)
    WHERE a.custom_id = $node1_id AND b.custom_id = $node2_id
    RETURN r
    """
    result = tx.run(query, node1_id=node1_id, node2_id=node2_id)
    for record in result:
        print(record["r"])

# 执行查询
with driver.session() as session:
    session.read_transaction(get_relationship, "unique_id_1", "unique_id_2")

删除关系

删除节点之间的关系时,可以使用 DELETE。

def delete_relationship(tx, node1_id, node2_id):
    query = """
    MATCH (a)-[r]->(b)
    WHERE a.custom_id = $node1_id AND b.custom_id = $node2_id
    DELETE r
    """
    tx.run(query, node1_id=node1_id, node2_id=node2_id)

# 执行删除关系
with driver.session() as session:
    session.write_transaction(delete_relationship, "unique_id_1", "unique_id_2")
    print("Relationship deleted.")

4. 创建约束和索引

创建唯一约束

唯一约束确保某个属性在数据库中是唯一的。

def create_unique_constraint(tx):
    query = "CREATE CONSTRAINT IF NOT EXISTS ON (n:Animal) ASSERT n.custom_id IS UNIQUE"
    tx.run(query)

# 执行创建唯一约束
with driver.session() as session:
    session.write_transaction(create_unique_constraint)
    print("Unique constraint created.")

创建存在性约束

存在性约束确保节点或关系必须包含某个属性。

def create_existence_constraint(tx):
    query = "CREATE CONSTRAINT IF NOT EXISTS ON (n:Animal) ASSERT exists(n.custom_id)"
    tx.run(query)

# 执行创建存在性约束
with driver.session() as session:
    session.write_transaction(create_existence_constraint)
    print("Existence constraint created.")

创建索引

索引用于提高某个属性的查询性能。

def create_index(tx):
    query = "CREATE INDEX IF NOT EXISTS FOR (n:Animal) ON (n.custom_id)"
    tx.run(query)

# 执行创建索引
with driver.session() as session:
    session.write_transaction(create_index)
    print("Index created.")

5. 复杂查询和聚合操作

聚合查询

Neo4j 支持多种聚合函数,比如 COUNT、SUM、AVG 等。可以用来统计节点或关系的数量。

def count_nodes(tx):
    query = "MATCH (n:Animal) RETURN COUNT(n)"
    result = tx.run(query)
    for record in result:
        print(record["COUNT(n)"])

# 执行聚合查询
with driver.session() as session:
    session.read_transaction(count_nodes)

查询带条件的关系

你可以使用条件来过滤查询结果。

def filter_nodes(tx):
    query = "MATCH (n:Animal) WHERE n.label = 'Dog' RETURN n"
    result = tx.run(query)
    for record in result:
        print(record["n"])

# 执行条件查询
with driver.session() as session:
    session.read_transaction(filter_nodes)

6. 批量操作

批量创建节点

def create_multiple_nodes(tx, nodes):
    query = "UNWIND $nodes AS node CREATE (n:Animal {custom_id: node.custom_id, label: node.label})"
    tx.run(query, nodes=nodes)

# 执行批量创建
nodes = [
    {"custom_id": "unique_id_1", "label": "Dog"},
    {"custom_id": "unique_id_2", "label": "Cat"},
    {"custom_id": "unique_id_3", "label": "Fox"}
]
with driver.session() as session:
    session.write_transaction(create_multiple_nodes, nodes)

7. 关闭连接

完成操作后,关闭连接:

# 关闭驱动
driver.close()

CC BY-NC-SA 4.0