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

如何使用Gremlin Python以字符串形式查询Neptune数据库?

如何在AWS Lambda中以字符串形式查询Neptune图数据库?

问题背景

在AWS Lambda中查询Neptune图数据库时,需要动态生成查询字符串获取节点的输出路径。最初使用eval()执行查询,但eval()存在安全风险和维护问题,希望改用字符串形式直接提交查询。尝试client.submit()时遇到两类错误:

  • AttributeError: 'str' object has no attribute 'source_instructions'
  • Failed to interpret Gremlin query: Query parsing failed at line 1, character position at 2, error message : no viable alternative at input 'g.with_'

原代码片段:

for n in node_lst:
    database_url = "wss://neptune-db:8182/gremlin"
    connec = DriverRemoteConnection(
        database_url, "g",
        message_serializer=serializer.GraphSONSerializersV2d0(),
        transport_factory=lambda:AiohttpTransport(call_from_event_loop=True)
    )

    g = traversal().withRemote(conn)
    query_str = "g.with_('evaluationTimeout',50000).V(n).emit().times(max_hops).path().toList()"
    query_result = str(eval(query_str))
    conn.close()
    # Process graph output

解决方案

1. 正确使用Gremlin Client提交字符串查询

无需本地Gremlin Server,直接用gremlinpython的Client类连接Neptune的WebSocket地址提交字符串查询。注意Gremlin-Groovy语法和Python API的差异:

  • Python API中的with_()对应Gremlin-Groovy的with()
  • 字符串查询必须遵循Gremlin-Groovy语法,而非Python语法

2. 用参数绑定传递动态值

直接拼接字符串会引发注入风险,推荐通过参数绑定传递节点ID、max_hops这类动态参数。

修正后的代码示例

from gremlin_python.driver import client, serializer
from gremlin_python.driver.aiohttp.transport import AiohttpTransport

def lambda_handler(event, context):
    database_url = "wss://neptune-db:8182/gremlin"
    # 初始化Client并复用连接(避免循环内重复创建连接,提升Lambda执行效率)
    gremlin_client = client.Client(
        database_url,
        "g",
        message_serializer=serializer.GraphSONSerializersV2d0(),
        transport_factory=lambda: AiohttpTransport(call_from_event_loop=True)
    )
    
    node_lst = ["node-id-1", "node-id-2"] # 示例节点列表
    max_hops = 3
    
    try:
        for n in node_lst:
            # 编写符合Gremlin-Groovy语法的查询字符串
            query_str = "g.with('evaluationTimeout', 50000).V($nodeId).emit().times($maxHops).path().toList()"
            # 通过参数绑定传递动态值
            result_set = gremlin_client.submit(query_str, {"nodeId": n, "maxHops": max_hops})
            query_result = result_set.all().result()
            # 处理查询结果
            print(f"Result for node {n}: {query_result}")
    finally:
        gremlin_client.close()

错误原因说明

  • no viable alternative at input 'g.with_':Gremlin服务器使用Groovy语法,不识别Python风格的with_,需改为Groovy的with
  • AttributeError:错误地将字符串查询与traversal()对象混用,应直接用Client.submit()提交字符串,无需创建traversal实例

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 09:52:32