如何用Py2neo将Pandas DataFrame导入Neo4j创建节点与关系?
将Pandas DataFrame导入Neo4j并构建关系图谱操作指南
1. 安装必要依赖
先安装Neo4j Python驱动和Pandas,确保能在Python中连接Neo4j并处理数据:
pip install neo4j pandas
2. 连接Neo4j数据库
替换代码中的连接地址、用户名和密码为你的Neo4j实例信息:
from neo4j import GraphDatabase import pandas as pd # 替换为你的实际DataFrame数据 df = pd.DataFrame({ "source": ["张三", "李四", "王五"], "target": ["李四", "王五", "张三"], "relation_type": ["好友", "同事", "合作伙伴"] }) # 建立Neo4j连接 driver = GraphDatabase.driver("bolt://localhost:7687", auth=("neo4j", "your_database_password"))
3. 批量导入数据并创建图谱
使用Cypher的UNWIND语句批量处理DataFrame数据,通过MERGE避免重复创建节点和关系:
def import_graph_data(tx, data_records): cypher_query = """ UNWIND $records AS row // 匹配或创建source节点 MERGE (source:Entity {name: row.source}) // 匹配或创建target节点 MERGE (target:Entity {name: row.target}) // 匹配或创建两者之间的关系,并设置属性 MERGE (source)-[r:CORRELATES_WITH {type: row.relation_type}]->(target) RETURN count(r) AS total_relations """ result = tx.run(cypher_query, records=data_records) return result.single()["total_relations"] # 执行导入操作 with driver.session() as session: total = session.execute_write(import_graph_data, df.to_dict("records")) print(f"成功创建 {total} 条关系") # 关闭连接 driver.close()
关键细节说明
- 节点去重:用
MERGE替代CREATE,确保相同名称的节点只会被创建一次,避免数据冗余 - 关系自定义:把
CORRELATES_WITH改成符合你业务场景的关系类型,比如FOLLOWS、DEPENDS_ON;如果不需要关系属性,直接去掉{type: row.relation_type}即可 - 多类型节点:如果source和target属于不同实体类型(比如source是用户,target是商品),可以给节点设置不同标签,比如
MERGE (source:User {name: row.source})和MERGE (target:Product {id: row.target})
验证导入结果
打开Neo4j Browser,运行以下Cypher查询验证数据:
- 查询所有节点:
MATCH (n:Entity) RETURN n.name LIMIT 10
- 查询所有关系:
MATCH (s)-[r]->(t) RETURN s.name, type(r), t.name, r.type LIMIT 10
性能优化建议
- 创建索引:为节点的唯一标识字段(比如示例中的
name)创建索引,提升批量导入时的匹配效率:
CREATE INDEX idx_entity_name FOR (n:Entity) ON (n.name)
- 分批次导入:如果DataFrame数据量超过10万行,建议分批次处理,避免内存溢出:
batch_size = 10000 for i in range(0, len(df), batch_size): batch = df.iloc[i:i+batch_size].to_dict("records") with driver.session() as session: session.execute_write(import_graph_data, batch)
内容的提问来源于stack exchange,提问作者S.Sushmi
相关产品推荐
相关产品推荐

