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

能否通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 09:14:56