You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过pGraph/iGraph将AURADS上的Neo4j图导出为Pickle格式?

解决Neo4j图数据导出为本地Pickle文件的问题

你直接尝试序列化py2neo的Graph对象是错误的——这个对象只是和远程Neo4j实例的连接句柄,包含网络连接等不可序列化的资源,自然会抛出错误。必须先从Neo4j中拉取实际的节点、关系数据,再将这些可序列化的数据结构保存为Pickle文件。

下面提供两种可行的实现方案:

方案一:将图数据转为igraph对象后序列化

igraph对象支持直接Pickle序列化,适合后续做图分析:

import pickle
from py2neo import Graph
from igraph import Graph as iGraph

# 1. 建立与Neo4j的连接
graph = Graph("<instance_credentials>", auth=("neo4j", "<instance_password>"))

# 2. 查询全量节点数据(包含ID、标签、属性)
nodes_data = graph.run("""
MATCH (n)
RETURN id(n) AS node_id, labels(n) AS labels, properties(n) AS props
""").data()

# 3. 查询全量关系数据(包含起点ID、终点ID、关系类型、属性)
rels_data = graph.run("""
MATCH (s)-[r]->(t)
RETURN id(s) AS source_id, id(t) AS target_id, type(r) AS rel_type, properties(r) AS props
""").data()

# 4. 转换为igraph格式
node_id_map = {}
igraph_nodes = []
# 构建顶点映射与属性
for node in nodes_data:
    vid = len(igraph_nodes)
    node_id_map[node["node_id"]] = vid
    igraph_nodes.append({**node["props"], "labels": node["labels"]})

# 构建边列表与属性
igraph_edges = [(node_id_map[rel["source_id"]], node_id_map[rel["target_id"]]) for rel in rels_data]
edge_attrs = {
    "rel_type": [rel["rel_type"] for rel in rels_data],
    "props": [rel["props"] for rel in rels_data]
}

# 创建igraph实例并设置属性
ig = iGraph(n=len(igraph_nodes), edges=igraph_edges)
for idx, attrs in enumerate(igraph_nodes):
    for k, v in attrs.items():
        ig.vs[idx][k] = v
for k, v in edge_attrs.items():
    ig.es[k] = v

# 5. 序列化保存
with open("graph.pkl", "wb") as f:
    pickle.dump(ig, f)

print("图数据已成功导出为Pickle文件")

方案二:直接保存原始节点/关系字典列表

如果不需要转成igraph,可直接保存查询到的原始数据结构,后续按需处理:

import pickle
from py2neo import Graph

# 建立连接
graph = Graph("<instance_credentials>", auth=("neo4j", "<instance_password>"))

# 查询全量节点与关系
nodes = graph.run("MATCH (n) RETURN id(n) AS id, labels(n) AS labels, properties(n) AS properties").data()
relationships = graph.run("MATCH (s)-[r]->(t) RETURN id(s) AS source, id(t) AS target, type(r) AS type, properties(r) AS properties").data()

# 打包成字典
graph_data = {"nodes": nodes, "relationships": relationships}

# 序列化保存
with open("graph_data.pkl", "wb") as f:
    pickle.dump(graph_data, f)

print("原始图数据已保存为Pickle文件")

注意事项

  • 如果Neo4j中图数据量极大,全量查询可能引发内存溢出,建议通过标签、关系类型过滤数据,或分批次拉取。
  • 若使用pygds(Graph Data Science库)做过图投影,可通过GDS的导出工具先处理投影图,但最终要本地保存仍需拉取实际数据到本地内存。

内容的提问来源于stack exchange,提问作者AAA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 19:20:28