能否通过Python将EFS文件上传至Amazon Neptune?是否支持无需S3?
从EFS向Amazon Neptune上传数据的实现方案
Neptune是否支持直接从EFS加载文件?
Neptune不支持直接从EFS加载数据文件。它的官方批量加载工具(Bulk Loader)仅支持以下数据源:
- Amazon S3存储的文件
- Neptune自身导出的备份文件
- 通过HTTP/HTTPS可访问的公开文件
EFS不在原生支持的数据源列表中,必须通过中间方式中转或直接构造查询提交。
用Python实现从EFS到Neptune的上传
有两种可行方案,分别适合不同数据规模:
方案1:直接读取EFS文件构造Gremlin查询提交(适合小批量数据)
通过Python读取EFS挂载目录下的文件,逐条或批量构造Gremlin的addV()/addE()语句提交到Neptune。
代码示例(批量插入顶点)
from gremlin_python.driver import client, serializer import csv # 初始化Neptune连接 neptune_client = client.Client( '<your-neptune-endpoint>:8182', 'g', message_serializer=serializer.GraphSONSerializersV2d0() ) # 读取EFS上的CSV数据文件(假设EFS挂载在/efs/graph-data/) batch_size = 50 batch_data = [] with open('/efs/graph-data/nodes.csv', 'r', encoding='utf-8') as f: reader = csv.DictReader(f) for idx, row in enumerate(reader): # 构造单条顶点数据的字典 vertex = { "label": row["vertex_label"], "id": row["vertex_id"], "name": row["vertex_name"] } batch_data.append(vertex) # 达到批量阈值时提交查询 if (idx + 1) % batch_size == 0: # 用g.inject()批量注入数据并创建顶点 inject_str = ", ".join([str(data) for data in batch_data]) query = f"g.inject({inject_str}).unfold().addV(it.get('label')).property('id', it.get('id')).property('name', it.get('name'))" try: neptune_client.submit(query).all().result() batch_data = [] print(f"Successfully inserted batch {idx//batch_size + 1}") except Exception as e: print(f"Batch insertion failed: {str(e)}") # 提交剩余的小批量数据 if batch_data: inject_str = ", ".join([str(data) for data in batch_data]) query = f"g.inject({inject_str}).unfold().addV(it.get('label')).property('id', it.get('id')).property('name', it.get('name'))" neptune_client.submit(query).all().result() neptune_client.close()
你之前用g.inject()失败的可能原因:
- 数据格式错误:
inject()的参数需要是合法的Groovy对象(比如字典、列表),如果存在未转义的特殊字符或格式不符合要求会报错 - 批量过大:单个查询的负载超过Neptune的限制(比如数据量太大导致超时),建议减小
batch_size - 网络/权限问题:Python运行环境未打通到Neptune的网络,或者IAM角色没有Neptune的写入权限
方案2:先同步EFS文件到S3,再用Neptune Bulk Loader加载(适合大数据量)
对于大规模数据,这种方式效率更高,利用Neptune的批量加载工具实现高效导入:
代码示例
import boto3 import requests # 1. 把EFS文件上传到S3 s3_client = boto3.client('s3') efs_file_path = '/efs/graph-data/large-graph-dataset.csv' s3_bucket = 'your-s3-bucket-name' s3_object_key = 'neptune-loader/datasets/large-graph-dataset.csv' # 上传文件到S3 s3_client.upload_file(efs_file_path, s3_bucket, s3_object_key) # 2. 调用Neptune Bulk Loader API发起加载请求 neptune_loader_url = 'https://<your-neptune-endpoint>:8182/loader' headers = {'Content-Type': 'application/json'} loader_payload = { "source": f"s3://{s3_bucket}/{s3_object_key}", "format": "csv", "iamRoleArn": "arn:aws:iam::123456789012:role/your-neptune-loader-role", "region": "us-east-1", "failOnError": "FALSE", "parallelism": "MEDIUM" } # 发起加载请求(生产环境建议关闭verify=False,配置合法证书) response = requests.post(neptune_loader_url, json=loader_payload, headers=headers, verify=False) print(f"Loader initiation response: {response.json()}")
内容的提问来源于stack exchange,提问作者deepika
相关产品推荐
相关产品推荐

